V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Saxton
V2EX  ›  Java

SpringCloud Gateway 不能使用 Feign 吗?

  •  
  •   Saxton · 105 天前 · 1901 次点击
    这是一个创建于 105 天前的主题,其中的信息可能已经有所发展或是发生改变。
    java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-11
    at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.9.jar:3.4.9]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
    Error has been observed at the following site(s):
    |_ checkpoint ⇢ org.springframework.web.cors.reactive.CorsWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain]
    |_ checkpoint ⇢ HTTP POST "/auth/authenticate" [ExceptionHandlingWebHandler]
    

    这是最原始的报错,提示了不能阻塞,Feign 使用了 loadbalancer 负载均衡,请求默认用了 httpClient

    第 1 条附言  ·  101 天前
    感谢 @Kyle18Tang 大佬,使用 reactive 的第三方版本解决问题了
    18 条回复    2021-08-30 09:23:29 +08:00
    Kyle18Tang
        1
    Kyle18Tang  
       105 天前
    哈哈哈,我正在迁移到 Gateway,一样的问题,用不了,换 WebClient 了。
    Saxton
        2
    Saxton  
    OP
       105 天前
    @Kyle18Tang 我已经换成了 OKhttp 还是不行 无语死
    Kyle18Tang
        3
    Kyle18Tang  
       105 天前
    @Saxton #2 不是 OkHttp 的问题,是 Feign 就不能用,只能换 WebClient 。
    Saxton
        4
    Saxton  
    OP
       105 天前
    @Kyle18Tang 问题是我是按照其他人开源的项目改的,的确使用了 feign 难道是高版本不允许了吗
    zysuper
        5
    zysuper  
       105 天前
    reactive 的框架用同步调用的 feign 你觉得合适吗?
    Kyle18Tang
        6
    Kyle18Tang  
       105 天前   ❤️ 1
    @Saxton #4 他们项目 Cloud 版本是 2020 以下的?实在要用 Feign 可以试试 https://github.com/Playtika/feign-reactive
    Saxton
        7
    Saxton  
    OP
       105 天前
    @Kyle18Tang 实锤了 我阅读了 2.0 和 3.0 版本的源代码,2.0 的时候使用了 TraceLoadBalancerFeignClient 这个类来达到负载均衡,但是在 3.0 版本这个类不见了,变成了 FeignBlockingLoadBalancerClient,这个类名就说明了这玩意是个阻塞玩意,也就是高版本的 feign 不能在 webflux 中继续使用了。。
    然后我以为换成 OKHTTP 能解决,但发现,当你换成 okhttp 其实还是被这个玩意包裹着,配置类代码如下:return new FeignBlockingLoadBalancerClient(delegate, loadBalancerClient, properties, loadBalancerClientFactory);
    delegate 变量就是 okhttp 的实例,是我太天真了 现在要么降版本要么别用 feign,但是降版本这种操作就算了,我还是把这个服务完全迁移到网关
    Saxton
        8
    Saxton  
    OP
       105 天前
    @Kyle18Tang 还有一个版本就是把低版本的这个请求类拿过来 3.0 里用,直接 new 成 bean 会自动替换掉原有的 LoadBalancerClient,这样就可以避免使用阻塞的请求类,我准备来尝试一下,目前我不清楚为什么 3.0 版本这个类会消失,待我有空去阅读下升级日志
    Kyle18Tang
        9
    Kyle18Tang  
       105 天前
    @Saxton #8 3.0 废了 Ribbon
    Saxton
        10
    Saxton  
    OP
       105 天前
    @Kyle18Tang 好吧是我看错了,我发现问题所在了,之前的项目使用了 ribbon 提供的 LoadBalancerFeignClient,我这个项目我剔除 ribbon 依赖,使用了 loadbalancer 依赖,ribbon 的依赖携带的 client 默认支持阻塞,但 loadbalancer 携带的 client 是阻塞的,跟 feign 没有半毛钱关系,这是负载均衡导致的问题,如果想要网关使用 feign 就必须使用 ribbon 做负载器,但这玩意已经停更了,所以我打算自己写个非阻塞的 client,就能解决这个问题了
    zysuper
        11
    zysuper  
       105 天前
    好奇 reactor-http-nio 被全部 blocking 会发生什么事情。
    Saxton
        12
    Saxton  
    OP
       105 天前
    @zysuper 直接报错,详见 BlockingSingleSubscriber 类
    wm5d8b
        13
    wm5d8b  
       104 天前 via Android
    不知道为啥,都在推 webflux 了,却没有 reactive 的 feign
    cslive
        14
    cslive  
       104 天前
    用 openFeign 这个包,不要用 feign 这个包
    nodododo
        16
    nodododo  
       104 天前
    看你的头像然后再看文字会自动脑补出海绵宝宝的声音。。
    Saxton
        17
    Saxton  
    OP
       101 天前
    @cslive openFeign 本身就是 feign 改了个名字而已 我用了楼上的大佬推荐的 feign—reactive 解决问题了
    Saxton
        18
    Saxton  
    OP
       101 天前
    @nodododo 哈哈哈哈
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2601 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 156ms · UTC 14:12 · PVG 22:12 · LAX 06:12 · JFK 09:12
    ♥ Do have faith in what you're doing.