
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 Aug 26, 2021 哈哈哈,我正在迁移到 Gateway,一样的问题,用不了,换 WebClient 了。 |
2 Saxton OP @Kyle18Tang 我已经换成了 OKhttp 还是不行 无语死 |
3 Kyle18Tang Aug 26, 2021 @Saxton #2 不是 OkHttp 的问题,是 Feign 就不能用,只能换 WebClient 。 |
4 Saxton OP @Kyle18Tang 问题是我是按照其他人开源的项目改的,的确使用了 feign 难道是高版本不允许了吗 |
5 zysuper Aug 26, 2021 reactive 的框架用同步调用的 feign 你觉得合适吗? |
6 Kyle18Tang Aug 26, 2021 @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 Aug 26, 2021 @Saxton #8 3.0 废了 Ribbon |
10 Saxton OP @Kyle18Tang 好吧是我看错了,我发现问题所在了,之前的项目使用了 ribbon 提供的 LoadBalancerFeignClient,我这个项目我剔除 ribbon 依赖,使用了 loadbalancer 依赖,ribbon 的依赖携带的 client 默认支持阻塞,但 loadbalancer 携带的 client 是阻塞的,跟 feign 没有半毛钱关系,这是负载均衡导致的问题,如果想要网关使用 feign 就必须使用 ribbon 做负载器,但这玩意已经停更了,所以我打算自己写个非阻塞的 client,就能解决这个问题了 |
11 zysuper Aug 26, 2021 好奇 reactor-http-nio 被全部 blocking 会发生什么事情。 |
13 wm5d8b Aug 27, 2021 via Android 不知道为啥,都在推 webflux 了,却没有 reactive 的 feign |
14 cslive Aug 27, 2021 用 openFeign 这个包,不要用 feign 这个包 |
15 mezi04 Aug 27, 2021 |
16 nodododo Aug 27, 2021 看你的头像然后再看文字会自动脑补出海绵宝宝的声音。。 |
19 HarrisonLee Jun 9, 2023 大佬你是不是用 feign 调用鉴权服务,另一个回答里也看到你了,你是怎么做的?网上都是一些在网关处进行鉴权的,你分享的那个项目( zhoutaoo/SpringCloud )中的 auth-client 也根本没有实现服务调用。 |