关于优雅停止spring Boot项目的两种方式:

本文介绍了两种优雅停止Spring Boot项目的方法。方法一通过自定义EurekaClientAutoServiceRegistration,控制stop()方法的超时时间,确保及时取消Eureka注册。方法二利用spring-boot-starter-actuator的/shutdown端点,通过发送POST请求优雅停服。
摘要由CSDN通过智能技术生成

关于优雅停止spring Boot项目的两种方式:

方法一:

首先我们不能使用kill-9。如果加了-9,那么系统就不会给JVM调用 shutdown hook 的机会,也就无法完成资源清理了。也不能使用kill -6 否则无法调用到移除eureka的方法。

退出取消Euerka注册

Spring Cloud默认的EurekaClientAutoConfiguration这个自动配置类已经为我们做好了相应的工作,但是却不够完美。在程序收到kill信号时,JVM会调用 shutdown hook, 虽然在此hook中就有取消注册的逻辑,但我在实践中经常会遇到取消注册耗时特别长,导致 hook 线程block, 进程长时间等待而不能退出。这就会有一个致命的问题,因为kill命令并不会等待目标进程退出才会返回,而是立刻返回,这就意味着kill执行完后你的JVM进程还在。如果出现 hook 线程卡住的情况,那就极有可能当你再次启动服务的时候,上一次服务还没有关闭,从而导致新服务启动失败(往往是因为端口被占用)。

通过追踪源代码,我发现取消注册的逻辑是在EurekaAutoServiceRegistration#onApplicationEvent()方法中实现的,此方法响应Spring容器的ContextCloseEvent,然后调用stop()方法取消注册,耗时的也是这个stop()方法。因此我们可以自己编写一个类继承此类,覆盖stop()方法,添加超时逻辑:

public class EngineEurekaAutoServiceRegistration extends EurekaAutoServiceRegistrati
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值