SpringCloud Gateway 不能使用 Feign 吗?

2021-08-26 09:43:30 +08:00
 Saxton
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

4349 次点击
所在节点    Java
19 条回复
Kyle18Tang
2021-08-26 10:17:09 +08:00
哈哈哈,我正在迁移到 Gateway,一样的问题,用不了,换 WebClient 了。
Saxton
2021-08-26 10:21:39 +08:00
@Kyle18Tang 我已经换成了 OKhttp 还是不行 无语死
Kyle18Tang
2021-08-26 10:31:11 +08:00
@Saxton #2 不是 OkHttp 的问题,是 Feign 就不能用,只能换 WebClient 。
Saxton
2021-08-26 10:38:06 +08:00
@Kyle18Tang 问题是我是按照其他人开源的项目改的,的确使用了 feign 难道是高版本不允许了吗
zysuper
2021-08-26 11:09:19 +08:00
reactive 的框架用同步调用的 feign 你觉得合适吗?
Kyle18Tang
2021-08-26 11:14:52 +08:00
@Saxton #4 他们项目 Cloud 版本是 2020 以下的?实在要用 Feign 可以试试 https://github.com/Playtika/feign-reactive
Saxton
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
2021-08-26 11:41:40 +08:00
@Kyle18Tang 还有一个版本就是把低版本的这个请求类拿过来 3.0 里用,直接 new 成 bean 会自动替换掉原有的 LoadBalancerClient,这样就可以避免使用阻塞的请求类,我准备来尝试一下,目前我不清楚为什么 3.0 版本这个类会消失,待我有空去阅读下升级日志
Kyle18Tang
2021-08-26 11:55:56 +08:00
@Saxton #8 3.0 废了 Ribbon
Saxton
2021-08-26 11:57:20 +08:00
@Kyle18Tang 好吧是我看错了,我发现问题所在了,之前的项目使用了 ribbon 提供的 LoadBalancerFeignClient,我这个项目我剔除 ribbon 依赖,使用了 loadbalancer 依赖,ribbon 的依赖携带的 client 默认支持阻塞,但 loadbalancer 携带的 client 是阻塞的,跟 feign 没有半毛钱关系,这是负载均衡导致的问题,如果想要网关使用 feign 就必须使用 ribbon 做负载器,但这玩意已经停更了,所以我打算自己写个非阻塞的 client,就能解决这个问题了
zysuper
2021-08-26 11:59:58 +08:00
好奇 reactor-http-nio 被全部 blocking 会发生什么事情。
Saxton
2021-08-26 12:01:38 +08:00
@zysuper 直接报错,详见 BlockingSingleSubscriber 类
wm5d8b
2021-08-27 08:41:39 +08:00
不知道为啥,都在推 webflux 了,却没有 reactive 的 feign
cslive
2021-08-27 08:45:35 +08:00
用 openFeign 这个包,不要用 feign 这个包
mezi04
2021-08-27 10:48:14 +08:00
nodododo
2021-08-27 17:43:33 +08:00
看你的头像然后再看文字会自动脑补出海绵宝宝的声音。。
Saxton
2021-08-30 09:23:09 +08:00
@cslive openFeign 本身就是 feign 改了个名字而已 我用了楼上的大佬推荐的 feign—reactive 解决问题了
Saxton
2021-08-30 09:23:29 +08:00
@nodododo 哈哈哈哈
HarrisonLee
325 天前
大佬你是不是用 feign 调用鉴权服务,另一个回答里也看到你了,你是怎么做的?网上都是一些在网关处进行鉴权的,你分享的那个项目( zhoutaoo/SpringCloud )中的 auth-client 也根本没有实现服务调用。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX