Spring Cloud Gateway 雪崩了,该怎么办不要慌

问题现象与背景昨晚我们的网关雪崩了一段时间,现象是:1.不断有各种微服务报异常:在写 HTTP 响应的时候,连接已经关闭:reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response 复制代码2.同时还有请求还没读取完,连接已经关闭的异常:org.springframework.http.converter.HttpMessageNotReadableException:
摘要由CSDN通过智能技术生成

问题现象与背景
昨晚我们的网关雪崩了一段时间,现象是:
1.不断有各种微服务报异常:在写 HTTP 响应的时候,连接已经关闭
reactor.netty.http.client.PrematureCloseException: Connection prematurely closed BEFORE response 复制代码
2.同时还有请求还没读取完,连接已经关闭的异常
org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: UT000128: Remote peer closed connection before all data could be read 复制代码
3.前端不断有请求超时的报警,504 Gateway Time-out
4.网关进程不断健康检查失败而被重启
5.重启后的网关进程,立刻请求数量激增,每个实例峰值 2000 qps,闲时每个实例 500 qps,忙时由于有扩容也能保持每个实例在 1000 qps 以内,然后健康检查接口就很长时间没有响应,导致实例不断重启
其中,1 和 2 的问题应该是应为网关不断重启,并且由于某些原因优雅关闭失败导致强制关闭,强制关闭导致连接被强制断开从而有 1 和 2 相关的异常。
我们的网关是基于 Spring Cloud Gateway 实现的,并且有自动根据 CPU 负载扩容的机制。奇怪的是在请求数量彪增的时候,CPU 利用率并没有提高很多,保持在 60% 左右,由于 CPU 负载没有达到扩容的界限,所以一直没有自动扩容。为了快速解决问题,我们手动扩容了几个网关实例,将网关单实例负载控制在了 1000 以内,暂时解决了问题。
问题分析
为了彻底解决这个问题,我们使用 JFR 分析。首先先根据已知的线索去分析:

  1. Spring Cloud Gateway 是基于 Spring-WebFlux 实现的异步响应式网关,http 业务线程是有限的(默认是 2 * 可以使用的 CPU 个数,我们这里是 4)。
  2. 网关进程不断健康检查失败,健康检查调用的是 /actuator/health 接口,这个接口一直超时。

健康检查接口超时一般有两个原因:

  1. 健康检查接口检查某个组件的时候,阻塞住了。例如数据库如果卡住,那么可能数据库健康检查会一直没有返回。
  2. http 线程池没来得及处理健康检查请求,请求就超时了。

我们可以先去看 JFR 中的定时堆栈,看是否有 http 线程卡在健康检查上面。查看出问题后的线程堆栈,重点关注那 4 个 http 线程,结果发现这 4 个线程的堆栈基本一样,都是在执行 Redis 命令:

"reactor-http-nio-1" #68 daemon prio=5 os_prio=0 cpu=70832.99ms elapsed=199.98s tid=0x0000ffffb2f8a740 nid=0x69 waiting on condition  [0x0000fffe8adfc000]
   java.lang.Thread.State: TIMED_WAITING (parking)
	at jdk.internal.misc.Unsafe.park(java.base@11.0.8/Native Method)
	- parking to wait for  <0x00000007d50eddf8> (a java.util.concurrent.CompletableFuture$Signaller)
	at java.util.concurrent.locks.LockSupport.parkNanos(java.base@11.0.8/LockSupport.java:234)
	at java.util.concurrent.CompletableFuture$Signaller.block(java.base@11.0.8/CompletableFuture.java:1798)
	at java.util.concurrent.ForkJoinPool.managedBlock(java.base@11.0.8/ForkJoinPool.java:3128)
	at java.util.concurrent.CompletableFuture.timedGet(java.base@11.0.8/CompletableFuture.java:1868)
	at java.util.concurrent.CompletableFuture.get(java.base@11.0.8/CompletableFuture.java:2021)
	at io.lettuce.core.protocol.AsyncCommand.await(AsyncCommand.java:83)
	at io.lettuce.core.internal.Futures.awaitOrCancel(Futures.java:244)
	at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:75)
	at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80)
	at com.sun.proxy.$Proxy245.get(Unknown Source)
	at org.springframework.data.redis.connection.lettuce.LettuceStringCommands.get(LettuceStringCommands.java:68)
	at org.springframework.data.redis.connection.DefaultedRedisConnection.get(DefaultedRedisConnection.java:267)
	at org.springframework.data.redis.connection.DefaultStringRedisConnection.get(DefaultStringRedisConnection.java:406)
	at org.springframework.data.redis.core.DefaultValueOperations$1.inRedis(DefaultValueOperations.java:57)
	at org.springframework.data.redis.core.AbstractOperations$ValueDeserializingRedisCallback.doInRedis(AbstractOperations.java:60)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:222)
	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:189)
	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96)
	at org.springframework.data.redis.core.DefaultValueOperat
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Cloud Gateway Sentinel是Spring Cloud Gateway的一个扩展,用于提供应用程序的流量限制和熔断功能。 首先,Spring Cloud Gateway是一个基于Spring Boot的API网关,用于构建微服务架构中的API服务网关。它提供了路由和过滤功能,能够处理HTTP请求并进行相应的转发、过滤和路由。 而Sentinel是阿里巴巴开源的一种流量控制组件,它具备实时监控、熔断降级、系统自适应、热点参数限流等功能。通过Sentinel,可以实现对流量的实时控制和管理,在高并发请求的情况下,可以有效地保护应用系统,避免雪崩效应的发生。 Spring Cloud Gateway Sentinel将Sentinel的流量控制和熔断能力集成到了Spring Cloud Gateway中。它可以通过配置规则来限制每个API接口的访问流量,并在流量超出限制时,进行限流处理,保护应用程序的稳定性。同时,它还可以根据实际情况对请求进行熔断,从而避免请求过多导致服务不可用。 通过使用Spring Cloud Gateway Sentinel,我们可以灵活地对API接口进行流量控制和熔断处理,提高系统的稳定性和可用性。它的配置简单灵活,集成了Spring Cloud Gateway和Sentinel的优势,可以帮助我们更好地构建和管理微服务架构中的API服务网关。 ### 回答2: Spring Cloud Gateway Sentinel是一种基于Sentinel的流量控制和故障熔断的解决方案。Spring Cloud Gateway是一个轻量级的网关服务组件,而Sentinel是一个开源的流量控制和故障熔断框架。通过将两者结合使用,可以实现在网关层面对流量进行实时控制和保护。 Spring Cloud Gateway Sentinel提供了一系列的规则和策略,可以根据业务的需要进行配置。可以通过设置流量控制规则,限制某个接口的访问频率,防止过多的请求导致系统崩溃。另外,还可以设置熔断规则,当某个接口出现异常或者响应时间过长时,可以自动开启熔断策略,避免影响到其他正常的请求。 使用Spring Cloud Gateway Sentinel可以提高系统的可靠性和稳定性。当系统的流量过大或者出现异常时,会自动触发流量控制和熔断策略,保护系统的正常运行。同时,通过监控和日志记录,可以实时了解系统的运行状态和性能指标,方便进行故障排查和性能优化。 总之,Spring Cloud Gateway Sentinel是一个强大的流量控制和故障熔断的组件,可以保护系统免受异常流量的影响,确保系统的稳定性和可靠性。在微服务架构中,它发挥着重要的作用,对于系统的安全和性能优化有着重要的意义。 ### 回答3: Spring Cloud GatewaySpring Cloud生态系统中的一个开源网关项目,它提供了一种统一的的API管理方式,用于处理所有请求并将它们路由到适当的服务上。而Sentinel是一个开源的流量控制和熔断降级的框架,它提供了实时的监控和控制,以保护分布式系统免受故障的影响。 Spring Cloud Gateway集成了Sentinel用于增强网关的功能。它可以通过使用Sentinel进行流量控制和熔断降级,以确保服务的可用性和稳定性。可以根据业务需求,配置规则来限制请求的频率,避免由于高并发造成的系统崩溃,同时还能通过熔断降级机制来防止请求被无效的服务占用,提高整个系统的可靠性。 Spring Cloud Gateway使用Sentinel可以提供实时的流量监控和控制功能,可以根据实时的请求情况对服务进行动态调整。Sentinel可以监控各个服务的QPS(每秒请求数),RT(响应时间)和异常比例等指标,并通过自定义的规则进行实时的流量控制和限制。当某个服务出现异常或超过设定的阈值时,Sentinel可以及时触发熔断降级策略,将请求快速失败,避免传递到后端服务,保护整个系统免受故障的影响。 总之,Spring Cloud Gateway集成Sentinel可以通过流量控制和熔断降级来提高系统的可用性和稳定性,保证服务的高效运行。它能够实时监控服务的运行指标,并根据实时的情况对流量进行动态调整,保护系统免受故障的影响。这是一个非常强大和有用的功能,可以帮助开发人员构建可靠和鲁棒的微服务架构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值