久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Spring Cloud Gateway 內存溢出的解決方案

瀏覽:9日期:2023-07-01 18:51:38
記 Spring Cloud Gateway 內存溢出查詢過程環境配置: org.springframework.boot : 2.1.4.RELEASEorg.springframework.cloud :Greenwich.SR1事故記錄:

由于網關存在 RequestBody 丟失的情況,顧采用了網上的通用解決方案,使用如下方式解決:

@Beanpublic RouteLocator tpauditRoutes(RouteLocatorBuilder builder) { return builder.routes().route('gateway-post', r -> r.order(1) .method(HttpMethod.POST) .and() .readBody(String.class, requestBody -> {return true;}) # 重點在這 .and() .path('/gateway/**') .filters(f -> {f.stripPrefix(1);return f;}) .uri('lb://APP-API')).build();}

測試環境,Spring Cloud Gateway 網關功能編寫完成。開始進行測試環境壓測。

正常采用梯度壓測方式,最高用戶峰值設置為400并發。經歷兩輪時長10分鐘左右壓測,沒有異常情況出現。

中午吃飯時間,設置了1個小時的時間進行測試。

回來的時候系統報出如下異常

2019-08-12 15:06:07,296 1092208 [reactor-http-server-epoll-12] WARN io.netty.channel.AbstractChannelHandlerContext.warn:146 - An exception ’{}’ [enable DEBUG level for full stacktrace] was thrown by a user handler’s exceptionCaught() method while handling the following exception:io.netty.util.internal.OutOfDirectMemoryError: failed to allocate 16777216 byte(s) of direct memory (used: 503316487, max: 504889344) at io.netty.util.internal.PlatformDependent.incrementMemoryCounter(PlatformDependent.java:640) at io.netty.util.internal.PlatformDependent.allocateDirectNoCleaner(PlatformDependent.java:594) at io.netty.buffer.PoolArena$DirectArena.allocateDirect(PoolArena.java:764) at io.netty.buffer.PoolArena$DirectArena.newChunk(PoolArena.java:740) at io.netty.buffer.PoolArena.allocateNormal(PoolArena.java:244) at io.netty.buffer.PoolArena.allocate(PoolArena.java:214) at io.netty.buffer.PoolArena.allocate(PoolArena.java:146) at io.netty.buffer.PooledByteBufAllocator.newDirectBuffer(PooledByteBufAllocator.java:324) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:185) at io.netty.buffer.AbstractByteBufAllocator.directBuffer(AbstractByteBufAllocator.java:176) at io.netty.buffer.AbstractByteBufAllocator.ioBuffer(AbstractByteBufAllocator.java:137) at io.netty.channel.DefaultMaxMessagesRecvByteBufAllocator$MaxMessageHandle.allocate(DefaultMaxMessagesRecvByteBufAllocator.java:114) at io.netty.channel.epoll.EpollRecvByteAllocatorHandle.allocate(EpollRecvByteAllocatorHandle.java:72) at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:793) at io.netty.channel.epoll.AbstractEpollChannel$AbstractEpollUnsafe$1.run(AbstractEpollChannel.java:382) at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404) at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:315) at io.

當時一臉懵逼,馬上開始監控 Jvm 堆棧,減少jvm的內存空間,提升并發數以后,重啟項目重新壓測,

項目啟動參數如下:

java -jar -Xmx1024M /opt/deploy/gateway-appapi/cloud-employ-gateway-0.0.5-SNAPSHOT.jar↓↓↓↓修改為↓↓↓↓java -jar -Xmx512M /opt/deploy/gateway-appapi/cloud-employ-gateway-0.0.5-SNAPSHOT.jar

縮減了一半內存啟動,等待問題復現。等待3分鐘問題再次復現,但是同時Jvm卻的進行了Full GC。

EC EUOC OU MC MU CCSC CCSU YGC YGCT FGC FGCT 275456.0 100103.0 484864.0 50280.2 67672.0 64001.3 9088.0 8463.2 501 11.945 3 0.262 275968.0 25072.3 484864.0 47329.3 67672.0 63959.4 9088.0 8448.8 502 11.970 4 0.429

沒錯,在出現問題的時候,系統出現了Full Gc,但是OU并沒有達到觸發的原因。

結合日志中的 direct memory,想到了Jvm 中的堆外內存。

使用 -XX:MaxDirectMemorySize 可以進行設置 Jvm 堆外內存大小,當 Direct ByteBuffer 分配的堆外內存到達指定大小后,即觸發Full GC。

該值是有上限的,默認是64M,最大為 sun.misc.VM.maxDirectMemory()。

結合所有情況,表明堆外內存使用存在內存溢出的情況。

報錯內容為Netty框架,新增以下配置,開啟Netty錯誤日志打?。?p>-Dio.netty.leakDetection.targetRecords=40 #設置Records 上限-Dio.netty.leakDetection.level=advanced #設置日志級別項目啟動,沒任何問題,開啟壓測后服務報出如下異常:

2019-08-13 14:59:01,656 18047 [reactor-http-nio-7] ERROR io.netty.util.ResourceLeakDetector.reportTracedLeak:317 - LEAK: ByteBuf.release() was not called before it’s garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.Recent access records: #1:org.springframework.core.io.buffer.NettyDataBuffer.release(NettyDataBuffer.java:301)org.springframework.core.io.buffer.DataBufferUtils.release(DataBufferUtils.java:420)org.springframework.core.codec.StringDecoder.decodeDataBuffer(StringDecoder.java:208)org.springframework.core.codec.StringDecoder.decodeDataBuffer(StringDecoder.java:59)org.springframework.core.codec.AbstractDataBufferDecoder.lambda$decodeToMono$1(AbstractDataBufferDecoder.java:68)reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331)reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1505)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:123)reactor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:101)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onSubscribe(MonoCollectList.java:90)reactor.core.publisher.FluxJust.subscribe(FluxJust.java:70)reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:44)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:56)reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331)reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1505)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:123)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:372)reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:196)reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:337)reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:333)reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:453)reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:141)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:191)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677)io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612)io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529)io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491)io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)java.lang.Thread.run(Unknown Source)#2:io.netty.buffer.AdvancedLeakAwareByteBuf.nioBuffer(AdvancedLeakAwareByteBuf.java:712)org.springframework.core.io.buffer.NettyDataBuffer.asByteBuffer(NettyDataBuffer.java:266)org.springframework.core.codec.StringDecoder.decodeDataBuffer(StringDecoder.java:207)org.springframework.core.codec.StringDecoder.decodeDataBuffer(StringDecoder.java:59)org.springframework.core.codec.AbstractDataBufferDecoder.lambda$decodeToMono$1(AbstractDataBufferDecoder.java:68)reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:107)reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331)reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1505)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:123)reactor.core.publisher.FluxJust$WeakScalarSubscription.request(FluxJust.java:101)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onSubscribe(MonoCollectList.java:90)reactor.core.publisher.FluxJust.subscribe(FluxJust.java:70)reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:54)reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:44)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:56)reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331)reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1505)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:123)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:372)reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:196)reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:337)reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:333)reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:453)reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:141)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:191)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677)io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612)io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529)io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491)io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)java.lang.Thread.run(Unknown Source)#3:io.netty.buffer.AdvancedLeakAwareByteBuf.slice(AdvancedLeakAwareByteBuf.java:82)org.springframework.core.io.buffer.NettyDataBuffer.slice(NettyDataBuffer.java:260)org.springframework.core.io.buffer.NettyDataBuffer.slice(NettyDataBuffer.java:42)org.springframework.cloud.gateway.handler.predicate.ReadBodyPredicateFactory.lambda$null$0(ReadBodyPredicateFactory.java:102)reactor.core.publisher.FluxDefer.subscribe(FluxDefer.java:46)reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:59)reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:44)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:56)reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47)reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)reactor.core.publisher.MonoPeek.subscribe(MonoPeek.java:71)reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)reactor.core.publisher.FluxContextStart$ContextStartSubscriber.onNext(FluxContextStart.java:103)reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:287)reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:331)reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1505)reactor.core.publisher.MonoCollectList$MonoBufferAllSubscriber.onComplete(MonoCollectList.java:123)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.core.publisher.FluxPeek$PeekSubscriber.onComplete(FluxPeek.java:252)reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)reactor.netty.channel.FluxReceive.terminateReceiver(FluxReceive.java:372)reactor.netty.channel.FluxReceive.drainReceiver(FluxReceive.java:196)reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:337)reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:333)reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:453)reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:141)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:191)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:323)io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:297)io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:337)io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1408)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:359)io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:345)io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677)io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612)io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529)io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491)io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905)java.lang.Thread.run(Unknown Source)

在 #3 中,我發現了一個眼熟的類,ReadBodyPredicateFactory.java ,還記得最開始的時候使用 readbody 配置么?

這里就是進行 cachedRequestBodyObject 的寫入類,

追蹤一下Readbody源碼

/** * This predicate is BETA and may be subject to change in a future release. A * predicate that checks the contents of the request body * @param inClass the class to parse the body to * @param predicate a predicate to check the contents of the body * @param <T> the type the body is parsed to * @return a {@link BooleanSpec} to be used to add logical operators */ public <T> BooleanSpec readBody(Class<T> inClass, Predicate<T> predicate) { return asyncPredicate(getBean(ReadBodyPredicateFactory.class) .applyAsync(c -> c.setPredicate(inClass, predicate))); }

異步調用的 ReadBodyPredicateFactory.applyAsync() 和 錯誤日志中的

org.springframework.cloud.gateway.handler.predicate.ReadBodyPredicateFactory.lambda$null$0(ReadBodyPredicateFactory.java:102)

指向方法一致。查看源碼102行:

Flux<DataBuffer> cachedFlux = Flux.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));

此處 Spring Cloud Gateway 通過 dataBuffer.slice 切割出了新的 dataBuffer,但是通過 Netty 的內存檢測工具判斷,此處的 dataBuffer 并沒有被回收。

錯誤如下,日志很多容易被忽視。

ERROR io.netty.util.ResourceLeakDetector.reportTracedLeak:317 - LEAK: ByteBuf.release() was not called before it’s garbage-collected. See http://netty.io/wiki/reference-counted-objects.html for more information.

找到問題那就要解決才行,嘗試修改源碼

@Override@SuppressWarnings('unchecked')public AsyncPredicate<ServerWebExchange> applyAsync(Config config) { return exchange -> {Class inClass = config.getInClass();Object cachedBody = exchange.getAttribute(CACHE_REQUEST_BODY_OBJECT_KEY);Mono<?> modifiedBody;// We can only read the body from the request once, once that// happens if we// try to read the body again an exception will be thrown. The below// if/else// caches the body object as a request attribute in the// ServerWebExchange// so if this filter is run more than once (due to more than one// route// using it) we do not try to read the request body multiple timesif (cachedBody != null) { try {boolean test = config.predicate.test(cachedBody);exchange.getAttributes().put(TEST_ATTRIBUTE, test);return Mono.just(test); } catch (ClassCastException e) {if (LOGGER.isDebugEnabled()) { LOGGER.debug('Predicate test failed because class in predicate ' + 'does not match the cached body object', e);} } return Mono.just(false);} else { // Join all the DataBuffers so we have a single DataBuffer for // the body return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {// Update the retain counts so we can read the body twice,// once to parse into an object// that we can test the predicate against and a second time// when the HTTP client sends// the request downstream// Note: if we end up reading the body twice we will run// into// a problem, but as of right// now there is no good use case for doing thisDataBufferUtils.retain(dataBuffer);// Make a slice for each read so each read has its own// read/write indexesFlux<DataBuffer> cachedFlux = Flux.defer(() -> Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));ServerHttpRequest mutatedRequest = new ServerHttpRequestDecorator(exchange.getRequest()) { @Override public Flux<DataBuffer> getBody() {return cachedFlux; }};# 新增如下代碼DataBufferUtils.release(dataBuffer);return ServerRequest.create(exchange.mutate().request(mutatedRequest).build(), messageReaders).bodyToMono(inClass).doOnNext(objectValue -> { exchange.getAttributes().put(CACHE_REQUEST_BODY_OBJECT_KEY, objectValue); exchange.getAttributes().put(CACHED_REQUEST_BODY_KEY, cachedFlux);}).map(objectValue -> config.predicate.test(objectValue)); });} };}

Spring Cloud Gateway 在配置的架構中,版本為2.1.1,修改以上代碼后,啟動項目測試,問題沒有復現,正常運行。

同樣這個問題,也可以選擇升級 Spring Cloud Gateway 版本,在官方2.1.2版本中,此處代碼已被重構,升級后測試也完全正常。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 免费中文字幕 | 国产一区二区三区在线免费观看 | 神马午夜 | 亚洲精品影院 | 国产一级特黄毛片在线毛片 | 久久久成人精品 | 91一区二区三区 | 亚洲天堂第一页 | 成人精品| www.国产视频 | 国产日韩欧美一区 | 成人h动漫在线看 | 成人av教育 | 国产视频中文字幕 | 国产一级片 | 四虎视频 | 国产日韩欧美高清 | 欧美在线xxx | 国产艳妇av视国产精选av一区 | 久久久99久久久国产自输拍 | 国产一区二区免费电影 | 国产日韩欧美一区二区 | 一区二区三区国产视频 | 国产ts视频 | 精品国产一区二区三区久久久 | 啪一啪 | 成人av在线网| 免费中文字幕 | 在线播放国产一区二区三区 | 亚洲精品一区二区 | 九九色综合 | 男人的天堂视频网站 | 精品人伦一区二区三区蜜桃视频 | 成人中文视频 | 精品久久久久久亚洲精品 | 黄网站色大毛片 | 91精品国产一区二区 | 九九在线视频 | 国产亚洲女人久久久久毛片 | 欧美精品综合 | 欧美综合国产 | 久久中文字幕一区二区 | 精品欧美一区二区在线观看 | 精品亚洲一区二区三区 | 奇米在线777| av网站免费看 | 一级毛片在线免费看 | 巴西性猛交xxxx免费看久久久 | 成人福利在线 | 永久91嫩草亚洲精品人人 | 国产污视频在线 | 麻豆国产露脸在线观看 | 亚洲a级 | 毛片av片 | www国产亚洲精品久久网站 | 一区二区在线视频免费观看 | 精品久久一级片 | 欧美一级片免费看 | 国产v片| 国产精品色婷婷久久58 | 懂色av色香蕉一区二区蜜桃 | 中国一级特黄毛片大片 | 欧美精品成人一区二区三区四区 | www.99久 | 我要看免费黄色片 | 精品一二三四区 | 午夜男人网 | 成年人视频免费在线看 | 国产精品久久婷婷六月丁香 | 97久久久久久久久久久久 | 午夜精品视频在线观看 | 成人高清视频在线 | 亚洲精品3区 | www.色94色.com| 日本久久精品电影 | 欧美中文字幕在线 | 五月天电影网 | 久久久亚洲精品中文字幕 | 午夜激情在线 | 欧美日本高清视频 | 97久久精品人人做人人爽50路 | 亚洲www视频| 日韩毛片在线视频 | 综合久久久久久久 | 日本不卡一区 | 欧美日韩国产一区二区三区在线观看 | www久久久 | 国产欧美网址 | 色视频在线播放 | 国产一区日韩在线 | 在线视频中文字幕 | 久草新| 九九热欧美 | 亚洲伊人成人 | 秋霞a级毛片在线看 | 日韩高清国产一区在线 | 日本一区二区三区免费观看 | 久久久久成人精品 | 久久久久一区二区 | 日韩在线二区 | 欧美一区永久视频免费观看 | 久久成人一区 | 精品国产欧美一区二区三区成人 | 亚洲精品久久久久999中文字幕 | 成人午夜影院 | 国产一区二区三区免费 | 精品国产乱码久久久久久1区二区 | 久久久久久久 | 97超碰人人| 久久久久久中文字幕 | 国产福利视频在线观看 | 在线涩涩 | 嫩草研究院在线观看入口 | 成人涩涩日本国产一区 | 51国产午夜精品免费视频 | 91精品视频一区 | 久久精品国产亚洲 | 成人深夜福利 | 国产一区二| 精品一区二区三区四区 | 7777奇米影视 | 秋霞在线一区 | 亚洲免费色 | 免费av片在线 | 免费av片| 超级碰在线| 97久久超碰 | 久久免费精品视频 | 国产精品免费观看 | 久久精品一区视频 | 91高清视频 | 日韩精品一区在线视频 | 日韩视频精品在线 | 国产视频一区二区 | 精品免费av | 亚洲成人三级 | 特级淫片女子高清视频在线观看 | 亚洲视频中文字幕 | 黄p在线看 | 视频一区中文字幕 | 国产最新视频 | 在线视频 中文字幕 | 国产老女人精品毛片久久 | 亚洲一区中文 | 久草视频在线播放 | 日日爽 | 欧美精品在线观看 | 欧美在线观看网站 | 亚洲国产高清在线 | 精品一区二区久久久久久久网站 | 自拍小电影| 国产综合精品一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 四色成人av永久网址 | 午夜电影网站 | 成人精品国产 | 一区视频网站 | 一级特黄网站 | 欧美一区二区三区免费观看视频 | 欧美精品1区2区3区 精品国产欧美一区二区 | 四虎免费紧急入口观看 | 在线免费黄色小视频 | 亚洲不卡 | 天天看夜夜爽 | 伊人欧美在线 | 国产精品久久久久久久午夜 | 国产精品伦一区二区三级视频 | 亚洲国产视频一区 | 懂色中文一区二区在线播放 | 麻豆精品国产传媒 | 欧美日韩h| 成人av免费观看 | 欧美a级成人淫片免费看 | 国产精品无码永久免费888 | 久久va| 色综合一区二区三区 | 亚洲国产91| 一区二区三区免费av | 久久在线视频 | 欧美淫视频 | 亚洲日韩欧美一区二区在线 | 在线观看一区二区三区四区 | 狠狠色综合久久丁香婷婷 | 成人在线免费小视频 | 久久久精品网站 | 久草电影网| 人人做人人澡人人爽欧美 | 中文字字幕在线观看 | 国产精品一区二区三区免费 | 综合一区二区三区 | 亚洲精品福利在线观看 | 91亚洲高清 | 色爱综合网 | 日韩一区二区三区在线观看 | av在线入口 | 一区二区三区四区在线视频 | 爱啪导航一精品导航站 | 亚洲精品自拍 | 日韩毛片免费视频一级特黄 | 久久精品欧美一区二区三区不卡 | 美女久久久久 | 国产高清一区二区 | 97视频精品 | 黄色在线免费观看 | 日本美女影院 | 免费观看特级毛片 | 五月婷婷色| 超碰首页 | 免费视频爱爱太爽了 | 日本特黄特色aaa大片免费 | 97久久久| 亚洲精品久久久久久久久久久 | 国产精品11 | 秋霞av电影 | 免费在线观看成年人视频 | 黄色免费在线观看 | 精品亚洲国产成av人片传媒 | 国产精品久久久久久久久久东京 | 久久99精品视频在线观看 | 久久精品网 | 国产二区三区 | 午夜影院操| 成人在线亚洲 | 黄色成人在线观看视频 | 亚洲综合无码一区二区 | 成人亚洲视频 | 成人午夜网| av免费网站 | 一区免费看 | 欧洲尺码日本国产精品 | 久久精品伊人 | 一区二区三区精品视频 | 欧美一区二区三区精品 | 一区二区三区高清 | 国产在线一区二区三区 | 欧美福利一区二区 | www.久久精品 | 午夜99 | 国产精品一区二区三区四区 | 精品视频久久 | 精品国产乱码一区二区三区 | 毛片视频播放 | 亚洲午夜精品一区二区三区 | 精品一区二区久久 | 中文字幕av亚洲精品一部二部 | 日韩国产欧美一区 | 日韩av一区二区三区在线观看 | 中文精品一区二区三区 | 中文字幕综合 | 亚洲精品久久 | 青青草国产成人av片免费 | 中文字幕视频在线 | 精品一区二区三区久久 | 成人一区二区在线 | porn一区 | 一区二区三区高清不卡 | 成人激情视频在线 | 最新国产在线视频 | 欧美成人a | 在线播放亚洲 | 色精品| 久热精品在线 | 97久久精品 | 91精品国产综合久久福利软件 | 91亚洲日本aⅴ精品一区二区 | 午夜在线观看 | 91看片在线观看 | 国产精品极品美女在线观看免费 | 成人精品电影 | 久久亚洲黄色 | 夜本色 | 久久国内精品 | 日本天天操 | 欧美激情性国产欧美无遮挡 | 亚洲三区在线观看 | 亚洲区视频在线 | 久久精品亚洲 | 国产成人精品一区二区三区视频 | 欧美日韩国产精品 | 色综合久久久久久久久久久 | 国产精品久久久久久久久久久免费看 | 国产日韩av在线 | av三级在线观看 | 精品视频一区二区在线 | 久久精品欧美一区二区三区不卡 | 人人爱超碰 | 国产精品久久久久久久 | 精品免费视频 | 69免费视频| 亚洲第一av | 91久久精品日日躁夜夜躁欧美 | 日韩一区二区不卡 | 国产一级特黄 | 久久国 | 国产激情在线 | 欧美日韩高清在线一区 | 精品无码三级在线观看视频 | 国产精品伦理一区 | 久久不卡 | 在线免费国产 | 亚洲精品视频在线播放 | 综合久久久久 | 9se成人免费网站 | 国产精品亚欧美一区二区 | 国产日韩精品在线 | 欧美精品免费在线观看 | 黑人巨大精品欧美一区二区免费 | 成人综合在线观看 | 午夜在线观看视频网站 | 欧美在线小视频 | 欧美视频在线免费 | 日韩中文字幕a | 成人精品 | 久久亚洲美女 | 亚洲91| 日韩欧美一二三区 | 国产在线一区二区 | 午夜精品一区二区三区在线观看 | 久久亚洲国产精品 | 欧美日韩精品一区二区 | 欧美一级在线观看视频 | 欧美成人免费一级人片100 | 精品一区二区av | 国产剧情一区二区 | 欧美日韩在线视频一区 | 五月婷婷导航 | 国产精品久久免费视频 | 亚洲高清视频在线观看 | 在线观看亚洲 | 欧美日韩成人在线视频 | 在线视频91 | 欧美中文在线 | 亚洲精品国产乱码在线看蜜月 | av激情在线| 欧美日韩国产一区二区三区不卡 | 欧美一区二区视频 | 久日精品| 国产欧美综合一区二区三区 | 一区二区三区免费 | 91精品久久久久久久 | 日韩精品专区 | 国产精品福利在线观看 | 成av人片在线观看www | 91精品福利 | 国产精品久久久久久久福利院 | 日韩视频网| 久久久久久久久成人 | 精品久久久久久久久久久久久久 | 国产一区在线视频 | 中字一区 | 龙珠z中文版普通话 | 欧美综合激情 | www久久精品 | 久久久久久久久久久网站 | 国产福利一区二区 | 天天操夜夜操免费视频 | 久久久精品电影 | 久草视频在线播放 | 在线视频 亚洲 | 国产精品久久久久永久免费观看 | 91免费影片| 天天玩天天操天天射 | 欧美激情网址 | 狠狠躁夜夜躁人人爽天天高潮 | 久久成人精品视频 | 免费国产一区二区 | 国产精品国产精品国产专区不卡 | 亚洲一级视频在线 | 日本午夜电影 | 国产精品99久久久久久www | 夜夜操天天干 | 成人免费的视频 | 成人欧美一区二区三区黑人孕妇 | 高清久久| 爱爱视频网站 | 久久中文字幕视频 | 久久9视频 | 欧美一区二区三区在线观看视频 | 成人看片免费 | 国产精品久久久久久久久大全 | 国产在线视频xxx | 久久国产精品免费一区二区三区 | av手机在线播放 | 精品少妇一区二区 | 亚洲欧美综合 | 97成人在线免费视频 | 在线免费视频一区 | 国产日韩欧美在线 | 欧美日韩亚洲一区二区 | 国产一区二 | 日本一区二区三区中文字幕 | 国产特级毛片aaaaaa毛片 | 天天综合欧美 | 国产高清一区二区三区 | 奇米成人影视 | 在线观看你懂的网站 | 天天影视网色香欲综合网无拦截 | 欧美韩一区二区 | 国产毛片视频 | 国产1区在线观看 | 本道综合精品 | 九九精品视频在线观看 | 欧美激情一区二区三区 | 91久久精品 | 欧美一区二区三区免费 | 成人精品一区二区三区中文字幕 | 古典武侠第一页久久777 | 日韩欧美国产网站 | 久久一区 | 一区二区三区免费 | 亚洲激情av | www.一级电影| 成年免费a级毛片 | 真人女人一级毛片免费播放 | 精品国产91久久久久久久 | 精品国产一区在线 | 欧洲毛片 | 国产午夜久久久久 | 久久亚洲一区二区三区四区五区高 | 日韩www| 欧美精品二区 | 亚洲精品国产精品国自产 | 欧美日韩一区二区三区免费视频 | 国产毛片精品 | 日韩国产欧美在线观看 | 国产精品久久影院 | 欧美一区免费 | 国精品一区二区三区 | 国产精品1区2区 | 国产日韩一区二区三区 | 国产小视频在线 | 精品久久久久久亚洲综合网 | 亚洲成人一二区 | chengrenzaixian | 午夜成人免费视频 | 91在线综合 | 91视频观看 | www.久久| 国产九九九 | 婷婷色av | 自拍视频在线观看 | 91麻豆精品国产91久久久资源速度 | 玖玖综合网 | 亚洲乱码国产乱码精品精的特点 | 在线视频中文字幕 | 日韩成人免费中文字幕 | 欧美性猛交一区二区三区精品 | 久久精品视频一区 | 激情婷婷| 一色一黄视频 | 国产免费一区二区三区网站免费 | 伊人久麻豆社区 | 久久这| 亚洲成人精品视频 | 综合久久久 | 五月天婷婷丁香 | 99精品一区二区三区 | 日韩成人在线观看 | 国产福利一区二区三区视频 | 极品久久 | 精品国产乱码久久久久久88av | 四虎永久免费影院 | 国产精久久久久久久妇剪断 | 欧美一级片免费在线观看 | 视频在线一区 | 久久精品99国产精品亚洲最刺激 | 一级片网| 日韩一区二区在线观看 | 午夜在线免费观看 | 国产ts人妖另类 | 97国产一区二区精品久久呦 | 国产精彩视频 | 精品日韩欧美一区二区三区在线播放 | 91在线电影 | 草久久久 | 秋霞av电影| 久久久久一区二区三区 | 欧美日韩中文 | 黄色网址大全在线观看 | 国产精品美女 | 久久视频一区 | 久久影音先锋 | 山外人精品 | 99色在线视频 | 在线亚洲精品 | 婷婷激情在线 | av福利网站 | 国产一区二区三区久久久 | 91精品国产一区二区三区蜜臀 | 国产区在线观看 | 一级一片免费看 | 日韩1区3区4区第一页 | 欧美一二区 | 日韩一区二区三区在线视频 | 久久久xxx | 特级淫片女子高清视频在线观看 | 久久久久久电影 | 蜜月久久99静品久久久久久 | 日韩av免费在线观看 | 羞羞视频免费观看网站 | 国产三区在线观看视频 | 欧美成人免费观看 | 三级黄色片在线免费观看 | 欧美精品欧美精品系列 | 亚洲精品一区二区三区蜜桃久 | 国产精品久久久爽爽爽麻豆色哟哟 | 日韩福利视频网 | 亚洲欧美成人网 | 一区在线免费 | 国产精品伦一区二区三级视频 | 综合久久一区 | 久草电影网 | 久久久久久久久久久久久九 | 亚洲成年 | 亚洲欧美中文日韩在线v日本 | 奇米成人影视 | 天天爽天天干 | 成人亚洲网| 一区自拍 | 在线欧美亚洲 | 日韩视频一区二区三区四区 | 日本阿v视频高清在线中文 中文二区 | 黄色电影在线免费观看 | 精品美女久久久 | 成人在线视频网站 | 国产精品一区二区在线 | 精品日韩一区二区 | 国产黄色网址在线观看 | 一区二区三区高清不卡 | 国产一区二区影院 | 久久精品久久久久久久久久16 | 中文字幕在线精品 | 久久免费视频国产 | 一区二区三区国产好 | 午夜精品久久久久久久99黑人 | 毛片aaa| 国产综合久久久久久鬼色 | 亚洲一区 中文字幕 | 欧美一区二区伦理片 | 欧美成人小视频 | 97国产一区二区精品久久呦 | 亚洲精品在线免费 | 国产一区二区三区免费观看 | av手机在线电影 | 国产精品91久久久久 | 三级黄色片在线 | av在线一区二区三区 | 日本久久精品视频 | 色黄网站 | 亚洲精品久久久久久下一站 | 久久国产精品视频一区 | 久色| 伊人电影综合 | 老司机精品福利视频 | 久久大陆 | 九色av | 在线国产91| 在线观看国产视频 | 日韩有码一区 | 国产精品久久av | 日本久久网 | 狠狠干很很操 | 精品国产一区二区三区在线观看 | 成人看片网 | 国产一区二区在线播放 | 亚洲高清在线观看 | 在线成人www免费观看视频 | 成人精品一区二区三区电影黑人 | 日韩中文字幕免费在线 | 日韩欧美视频在线 | 欧洲美女7788成人免费视频 | 国产美女在线观看 | 亚洲免费视频大全 | 91久久久久 | 在线观看不卡一区 | 日本在线观看视频一区 | 亚洲午夜在线 | 亚洲天堂一区二区 | 亚洲高清视频一区二区 | 久久黄色网 | 国产一区精品电影 | 激情视频在线观看免费 | 国产欧美日韩 | 国产综合精品一区二区三区 | 免费av片网站 | 日韩污视频在线观看 | 91亚洲国产成人久久精品网站 | 综合国产 | 91久久精品国产91久久性色tv | 九色在线观看 | 国产精品久久99 | 中文字幕av亚洲精品一部二部 | 91久久久精品视频 | 日韩欧美精品一区 | 黄色成人免费看 | 91爱爱视频 | 色婷婷久久久swag精品 | 免费亚洲婷婷 | 久久精品国产一区二区三 | 精品亚洲一区二区 | 久久一区| 亚洲网在线 | 国产情侣免费视频 | 亚洲福利影院 | 国产视频中文字幕 | 欧美一级内谢 | 国产精品无码久久久久 | 国产艹 | 色免费在线观看 | 久久精品视| 国产综合一区二区 | 欧美午夜一区二区福利视频 | 精品久久久久久久久久久久 | 亚洲男人av | 欧美日韩在线一 |