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

SpringCloud Gateway 不能使用 Feign 吗?

  •  
  •   Saxton · 2021-08-26 09:43:30 +08:00 · 4274 次点击
    这是一个创建于 946 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 条附言  ·  2021-08-30 09:24:12 +08:00
    感谢 @Kyle18Tang 大佬,使用 reactive 的第三方版本解决问题了
    19 条回复    2023-06-09 01:55:07 +08:00
    Kyle18Tang
        1
    Kyle18Tang  
       2021-08-26 10:17:09 +08:00
    哈哈哈,我正在迁移到 Gateway,一样的问题,用不了,换 WebClient 了。
    Saxton
        2
    Saxton  
    OP
       2021-08-26 10:21:39 +08:00
    @Kyle18Tang 我已经换成了 OKhttp 还是不行 无语死
    Kyle18Tang
        3
    Kyle18Tang  
       2021-08-26 10:31:11 +08:00
    @Saxton #2 不是 OkHttp 的问题,是 Feign 就不能用,只能换 WebClient 。
    Saxton
        4
    Saxton  
    OP
       2021-08-26 10:38:06 +08:00
    @Kyle18Tang 问题是我是按照其他人开源的项目改的,的确使用了 feign 难道是高版本不允许了吗
    zysuper
        5
    zysuper  
       2021-08-26 11:09:19 +08:00
    reactive 的框架用同步调用的 feign 你觉得合适吗?
    Kyle18Tang
        6
    Kyle18Tang  
       2021-08-26 11:14:52 +08:00   ❤️ 1
    @Saxton #4 他们项目 Cloud 版本是 2020 以下的?实在要用 Feign 可以试试 https://github.com/Playtika/feign-reactive
    Saxton
        7
    Saxton  
    OP
       2021-08-26 11:37:36 +08:00
    @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
       2021-08-26 11:41:40 +08:00
    @Kyle18Tang 还有一个版本就是把低版本的这个请求类拿过来 3.0 里用,直接 new 成 bean 会自动替换掉原有的 LoadBalancerClient,这样就可以避免使用阻塞的请求类,我准备来尝试一下,目前我不清楚为什么 3.0 版本这个类会消失,待我有空去阅读下升级日志
    Kyle18Tang
        9
    Kyle18Tang  
       2021-08-26 11:55:56 +08:00
    @Saxton #8 3.0 废了 Ribbon
    Saxton
        10
    Saxton  
    OP
       2021-08-26 11:57:20 +08:00
    @Kyle18Tang 好吧是我看错了,我发现问题所在了,之前的项目使用了 ribbon 提供的 LoadBalancerFeignClient,我这个项目我剔除 ribbon 依赖,使用了 loadbalancer 依赖,ribbon 的依赖携带的 client 默认支持阻塞,但 loadbalancer 携带的 client 是阻塞的,跟 feign 没有半毛钱关系,这是负载均衡导致的问题,如果想要网关使用 feign 就必须使用 ribbon 做负载器,但这玩意已经停更了,所以我打算自己写个非阻塞的 client,就能解决这个问题了
    zysuper
        11
    zysuper  
       2021-08-26 11:59:58 +08:00
    好奇 reactor-http-nio 被全部 blocking 会发生什么事情。
    Saxton
        12
    Saxton  
    OP
       2021-08-26 12:01:38 +08:00
    @zysuper 直接报错,详见 BlockingSingleSubscriber 类
    wm5d8b
        13
    wm5d8b  
       2021-08-27 08:41:39 +08:00 via Android
    不知道为啥,都在推 webflux 了,却没有 reactive 的 feign
    cslive
        14
    cslive  
       2021-08-27 08:45:35 +08:00
    用 openFeign 这个包,不要用 feign 这个包
    mezi04
        15
    mezi04  
       2021-08-27 10:48:14 +08:00
    nodododo
        16
    nodododo  
       2021-08-27 17:43:33 +08:00
    看你的头像然后再看文字会自动脑补出海绵宝宝的声音。。
    Saxton
        17
    Saxton  
    OP
       2021-08-30 09:23:09 +08:00
    @cslive openFeign 本身就是 feign 改了个名字而已 我用了楼上的大佬推荐的 feign—reactive 解决问题了
    Saxton
        18
    Saxton  
    OP
       2021-08-30 09:23:29 +08:00
    @nodododo 哈哈哈哈
    HarrisonLee
        19
    HarrisonLee  
       294 天前
    大佬你是不是用 feign 调用鉴权服务,另一个回答里也看到你了,你是怎么做的?网上都是一些在网关处进行鉴权的,你分享的那个项目( zhoutaoo/SpringCloud )中的 auth-client 也根本没有实现服务调用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5329 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 05:48 · PVG 13:48 · LAX 22:48 · JFK 01:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.