block()/blockFirst()/blockLast() are blocking,which is not supported in thread reactor-http-kqueue-3

升级spring boot到2.7.0,gateway网关Feign调用其他微服务时,服务调用异常,异常信息:java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-kqueue-3

gateway网关Feign调用微服务异常,spring boot 2.7.0 WebFlux必须使用异步调用,同步会报错

详细错误日志如下:

2022-06-04 21:11:32.760 ERROR 28936 --- [r-http-kqueue-3] c.c.exception.GlobalExceptionHandler     : 系统异常,请稍后重试!详细错误信息为:block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-kqueue-3

java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-kqueue-3
  at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.Mono.block(Mono.java:1707) ~[reactor-core-3.4.18.jar:3.4.18]
  at org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient.choose(BlockingLoadBalancerClient.java:175) ~[spring-cloud-loadbalancer-3.1.3.jar:3.1.3]
  at org.springframework.cloud.openfeign.loadbalancer.FeignBlockingLoadBalancerClient.execute(FeignBlockingLoadBalancerClient.java:97) ~[spring-cloud-openfeign-core-3.1.3.jar:3.1.3]
  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 jdk.proxy2/jdk.proxy2.$Proxy114.postAccessToken(Unknown Source) ~[na:na]
  at com.cloud.gateway.controller.TokenController.login(TokenController.java:66) ~[classes/:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
  at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
  at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
  at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
  at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:144) ~[spring-webflux-5.3.20.jar:5.3.20]
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:125) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:251) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:336) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1816) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:159) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:260) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.4.18.jar:3.4.18]
  at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:400) ~[reactor-netty-core-1.0.19.jar:1.0.19]
  at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:419) ~[reactor-netty-core-1.0.19.jar:1.0.19]
  at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:600) ~[reactor-netty-http-1.0.19.jar:1.0.19]
  at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:93) ~[reactor-netty-core-1.0.19.jar:1.0.19]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:266) ~[reactor-netty-http-1.0.19.jar:1.0.19]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:327) ~[netty-codec-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:299) ~[netty-codec-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.kqueue.AbstractKQueueStreamChannel$KQueueStreamUnsafe.readReady(AbstractKQueueStreamChannel.java:544) ~[netty-transport-classes-kqueue-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.kqueue.AbstractKQueueChannel$AbstractKQueueUnsafe.readReady(AbstractKQueueChannel.java:383) ~[netty-transport-classes-kqueue-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.kqueue.KQueueEventLoop.processReady(KQueueEventLoop.java:211) ~[netty-transport-classes-kqueue-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.channel.kqueue.KQueueEventLoop.run(KQueueEventLoop.java:289) ~[netty-transport-classes-kqueue-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:995) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
  at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.77.Final.jar:4.1.77.Final]
  at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

2022-06-04 21:11:32.769  INFO 28936 --- [oundedElastic-1] com.alibaba.nacos.client.naming          : new ips(1) service: DEFAULT_GROUP@@oauth-center -> [{"instanceId":"192.168.1.108#9001#DEFAULT#DEFAULT_GROUP@@oauth-center","ip":"192.168.1.108","port":9001,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@oauth-center","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}]
2022-06-04 21:11:32.769  INFO 28936 --- [oundedElastic-1] com.alibaba.nacos.client.naming          : current ips:(1) service: DEFAULT_GROUP@@oauth-center -> [{"instanceId":"192.168.1.108#9001#DEFAULT#DEFAULT_GROUP@@oauth-center","ip":"192.168.1.108","port":9001,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@oauth-center","metadata":{"preserved.register.source":"SPRING_CLOUD"},"ipDeleteTimeout":30000,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000}

日志图片:
在这里插入图片描述

解决方案:
使用多线程异步调用方式,如下代码所示

	     ExecutorService executorService = Executors.newSingleThreadExecutor();
        // WebFlux异步调用,同步会报错
        Future future = executorService.submit(() -> (Map) oauth2Client.postAccessToken(header, parameters));
        Map<String, Object> tokenInfo = (Map<String, Object>)future.get();
//        Map<String, Object> tokenInfo = oauth2Client.postAccessToken(header, parameters);

        executorService.shutdown();

相关大数据学习demo地址:
https://github.com/carteryh/big-data

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: cross-origin read blocking (corb) 是一种安全机制,用于阻止恶意网站从跨域响应中读取敏感信息。当浏览器检测到跨域响应的 MIME 类型为 text/html 时,会自动屏蔽该响应,以保护用户的安全。 ### 回答2: Cross-Origin Read Blocking(CORB)是一种浏览器安全机制,用于防止恶意网站利用跨站脚本攻击(XSS)来读取其他网站的数据。其核心原理是当浏览器发现在跨域请求响应中存在恶意代码时,浏览器会自动禁止浏览器访问该响应。 在Corb中,浏览器会检查响应的Content-Type头部中的MIME类型,如果类型为"text/html"且响应中包含了javascript脚本,则浏览器会自动阻止响应。这是因为在这种情况下,响应可能会包含恶意脚本,攻击者可以利用这些脚本读取其他域中的敏感数据。 对于开发者来说,Corb会产生一些挑战,例如在进行跨域请求时需要确保响应的MIME类型正确,避免误将HTML响应标记为text/html。开发者可以采用一些技巧来解决这个问题,比如在API响应中包含一个额外的字段来指示MIME类型。 总之,Cross-Origin Read Blocking(CORB)可以帮助保护用户的隐私和安全,但它也需要开发者的注意和意识,以确保跨域请求的安全性和有效性。 ### 回答3: Cross-Origin Read Blocking (CORB) 是一种针对浏览器的安全机制,旨在防止恶意网站和攻击者利用跨站脚本攻击 (XSS) 来窃取用户的敏感信息。CORB 通过拦截具有特定 MIME 类型的跨域响应,来保护用户的隐私安全。 在CORB中,浏览器会拦截 MIME 类型为 text/html 的跨域响应,防止响应中的恶意代码对当前网页进行攻击。该机制会检查请求的 MIME 类型,并将其与响应的 MIME 类型进行比较。如果两者不匹配,则浏览器会视其为不安全,并拒绝加载响应内容。这样可以有效地防止通过跨站点请求伪造 (CSRF) 攻击等手段进行的 XSS 攻击。 需要注意的是,CORB 并没有完全屏蔽 text/html 类型的响应,而是只拦截那些被认为不安全的响应。如果响应被允许,浏览器会将其加入查看器中,并根据其 MIME 类型执行相应的解析操作。此外,CORB 还可配置为针对特定的 MIME 类型或响应头字段进行拦截,以增强安全性。 总的来说,CORB 是一种能够有效保护用户隐私和安全的浏览器安全机制。它可以防止恶意网站和攻击者利用跨站脚本攻击 (XSS) 来窃取用户的敏感信息。虽然这种机制会对部分跨域响应进行拦截,但它能够有效地提高浏览器的安全性,为用户带来更好的浏览体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值