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