*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilter

本文档记录了在项目中遇到的一个问题,即GET请求能够正常远程调用,但POST请求导致`IllegalStateException`。问题源于在非异步线程中使用了阻塞操作。解决方案是在启动类上启用`@EnableAsync`注解,并在调用Fegin接口的方法上添加`@Async`,以实现异步调用。经过这些修改,POST请求的远程调用得以正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景:

对外接口服务,需要通过官网服务鉴权。主要相关服务:getway服务作为网关服务负责接口鉴权、限流、请求转发等等,auth服务作为认证服务,也就是说getway服务的数据都是需要通过fegin调用auth服务进行读写。在远程调用过程发现GET类型的请求接口可以正常远程调用,但是POST类型的接口无法远程调用


问题描述

完整异常信息:

2022-09-24 21:42:22.849 ERROR 18568 --- [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [5406890f-1]  500 Server Error for HTTP GET "/openapi/query?appCode=1801743621&time=1664026931&nonce=rBlotvZfep&name=%E5%BC%A0%E4%B8%89&sign=73ac92bd012e05b3a71c8d462cb8ce81"

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2
	at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.15.jar:3.4.15]
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	*__checkpoint ⇢ org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain]
	*__checkpoint ⇢ HTTP GET "/openapi/query?appCode=1801743621&time=1664026931&nonce=rBlotvZfep&name=%E5%BC%A0%E4%B8%89&sign=73ac92bd012e05b3a71c8d462cb8ce81" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.Mono.block(Mono.java:1707) ~[reactor-core-3.4.15.jar:3.4.15]
		at org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.choose(BlockingLoadBalancerClient.java:155) ~[spring-cloud-loadbalancer-3.1.1.jar:3.1.1]
		at org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute(FeignBlockingLoadBalancerClient.java:97) ~[spring-cloud-openfeign-core-3.1.1.jar:3.1.1]
		at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:119) ~[feign-core-11.8.jar:na]
		at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:89) ~[feign-core-11.8.jar:na]
		at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) ~[feign-core-11.8.jar:na]
		at org.springframework.cloud.openfeign.FeignCachingInvocationHandlerFactory$1.proceed(FeignCachingInvocationHandlerFactory.java:66) ~[spring-cloud-openfeign-core-3.1.1.jar:3.1.1]
		at org.springframework.cache.interceptor.CacheInterceptor.lambda$invoke$0(CacheInterceptor.java:54) ~[spring-context-5.3.16.jar:5.3.16]
		at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:351) ~[spring-context-5.3.16.jar:5.3.16]
		at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64) ~[spring-context-5.3.16.jar:5.3.16]
		at org.springframework.cloud.openfeign.FeignCachingInvocationHandlerFactory.lambda$create$1(FeignCachingInvocationHandlerFactory.java:53) ~[spring-cloud-openfeign-core-3.1.1.jar:3.1.1]
		at com.sun.proxy.$Proxy115.putCount(Unknown Source) ~[na:na]
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_301]
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_301]
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_301]
		at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_301]
		at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.16.jar:5.3.16]
		at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) ~[spring-aop-5.3.16.jar:5.3.16]
		at com.sun.proxy.$Proxy86.putCount(Unknown Source) ~[na:na]
		at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_301]
		at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_301]
		at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_301]
		at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_301]
		at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.16.jar:5.3.16]
		at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) ~[spring-aop-5.3.16.jar:5.3.16]
		at com.sun.proxy.$Proxy86.putCount(Unknown Source) ~[na:na]
		at com.example.cloud.gateway.filter.openapi.OpenApiService.putCount(OpenApiService.java:102) ~[classes/:na]
		at com.example.cloud.gateway.filter.openapi.OpenApiService$$FastClassBySpringCGLIB$$74840d05.invoke(<generated>) ~[classes/:na]
		at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.16.jar:5.3.16]
		at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) ~[spring-aop-5.3.16.jar:5.3.16]
		at com.example.cloud.gateway.filter.openapi.OpenApiService$$EnhancerBySpringCGLIB$$e414d5ed.putCount(<generated>) ~[classes/:na]
		at com.example.cloud.gateway.filter.openapi.OpenApiAuthorizeGatewayFilterFactory.lambda$null$3(OpenApiAuthorizeGatewayFilterFactory.java:201) ~[classes/:na]
		at reactor.core.publisher.MonoRunnable.call(MonoRunnable.java:73) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoRunnable.call(MonoRunnable.java:32) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:224) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onComplete(MonoPeekTerminal.java:299) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:209) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.Operators.complete(Operators.java:137) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:236) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:203) [reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2400) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onSubscribeInner(MonoFlatMapMany.java:150) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:189) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.SerializedSubscriber.onNext(SerializedSubscriber.java:99) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:174) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:165) ~[reactor-core-3.4.15.jar:3.4.15]
		at reactor.netty.http.client.HttpClientConnect$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:414) ~[reactor-netty-http-1.0.16.jar:1.0.16]
		at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:677) ~[reactor-netty-core-1.0.16.jar:1.0.16]
		at reactor.netty.resources.DefaultPooledConnectionProvider$DisposableAcquire.onStateChange(DefaultPooledConnectionProvider.java:184) ~[reactor-netty-core-1.0.16.jar:1.0.16]
		at reactor.netty.resources.DefaultPooledConnectionProvider$PooledConnection.onStateChange(DefaultPooledConnectionProvider.java:440) ~[reactor-netty-core-1.0.16.jar:1.0.16]
		at reactor.netty.http.client.HttpClientOperations.onInboundNext(HttpClientOperations.java:637) ~[reactor-netty-http-1.0.16.jar:1.0.16]
		at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93) ~[reactor-netty-core-1.0.16.jar:1.0.16]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327) ~[netty-codec-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:314) ~[netty-codec-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:435) ~[netty-codec-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:279) ~[netty-codec-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:722) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:658) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:584) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:496) ~[netty-transport-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986) ~[netty-common-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.74.Final.jar:4.1.74.Final]
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.74.Final.jar:4.1.74.Final]
		at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_301]

在这里插入图片描述

原因分析:

查阅了很多相关文档才知道getway使用fegin远程调用其他服务接口是需要进行异步调用的。不过我有一点好奇的是我远程调用GET类型的接口的时候又可以正常调用,远程调用POST类型接口不用异步确调用不了。具体以后有时间再研究吧,先上解决方案!


解决方案:

1.开启基于注解的异步

  • 在启动类上加上该注解
@EnableAsync 

2.使用@Async注解声明异步

  • 下面例子目的是介绍Async注解的使用(使用不规范会导致异步不生效)。,具体什么情况下会失效可以去看看相关资料
    • 示例。注意:openApiAuthService是fegin的接口类。
@Component
public class OpenApiService {
	
	@Resource
	private OpenApiAuthService openApiAuthService;
	
	@Async
    public void putCount(OpenApiStatDto in) {
        openApiAuthService.putCount(in);
    }
}
    • 业务调用类。
public class OpenApiServiceImpl {

	@Resource
	private OpenApiService openApiService

	public void put(OpenApiStatDto in) {
		openApiService.putCount(in);
	}
}

测试验证:

  • 认证成功!
    在这里插入图片描述

在这里插入图片描述

time="2025-03-14 09:39:53.078" level=ERROR traceid=N/A source_client= source_txn= threadid=reactor-http-epoll-4 class=c.t.c.g.c.GlobalExceptionConfiguration msg="GlobalException catch:" java.lang.NullPointerException: null at com.taia.cim.gateway.loadbalancer.EapInstanceSupplier.get(EapInstanceSupplier.java:55) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Error has been observed at the following site(s): *__checkpoint springfox.boot.starter.autoconfigure.SwaggerUiWebFluxConfiguration$CustomWebFilter [DefaultWebFilterChain] *__checkpoint org.springframework.cloud.gateway.filter.WeightCalculatorWebFilter [DefaultWebFilterChain] *__checkpoint org.springframework.boot.actuate.metrics.web.reactive.server.MetricsWebFilter [DefaultWebFilterChain] *__checkpoint HTTP GET "/eap-service/v1/reportJobCancel" [ExceptionHandlingWebHandler] Original Stack Trace: at com.taia.cim.gateway.loadbalancer.EapInstanceSupplier.get(EapInstanceSupplier.java:55) at com.taia.cim.gateway.loadbalancer.EqpBasedLoadBalancer.choose(EqpBasedLoadBalancer.java:51) at org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter.choose(ReactiveLoadBalancerClientFilter.java:180) at org.springframework.cloud.gateway.filter.ReactiveLoadBalancerClientFilter.filter(ReactiveLoadBalancerClientFilter.java:119) at org.springframework.cloud.gateway.handler.FilteringWebHandler$GatewayFilterAdapter.filter(FilteringWebHandler.java:137) at org.springframework.cloud.gateway.filter.OrderedGatewayFilter.filter(OrderedGatewayFilter.java:44) at org.springframework.cloud.gateway.handler.FilteringWebHandler$DefaultGatewayFilterChain.lambda$filter$0(FilteringWebHandler.java:117)
03-18
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tag心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值