登录
注册
写文章
发现
工具
调用Nacos下线接口实现优雅停机
_3t3lfz KEKfID
编辑文章
调用Nacos下线接口实现优雅停机
asfx站长
2023.06.28 19:09:33
阅读
488
#####在不影响生产环境服务正常运行的情况下实现优雅停机的前提是你得有多台机器能够部署服务,假设有两台服务器A和B。先停止服务器A的服务,更新完服务并监听到服务状态正常后再停更服务器B的服务。 我们知道Spring框架有提供停机钩子(ShutdownHook)来处理应用程序的优雅关闭,确保在应用程序停止时执行必要的清理逻辑。停机钩子允许您在JVM关闭之前执行一些特定操作,例如释放资源、关闭数据库连接、保存临时数据等。 但是钩子它有最大等待时间的限制(默认是30s),如果在指定的超时时间内无法完成销毁回调方法的执行,Spring将强制终止应用程序的关闭过程。 而应用在持续的迭代过程中又需要随时更新服务,如果服务在执行业务期间时间过长,而服务又被强制终止则会发生不必要的错误,例如请求超时、业务代码执行中断等。如果分布式事务处理不友好则会产生脏数据,影响到业务的正常进行。 所以我们需要自己想办法去实现服务的优雅停机,公司微服务的注册使用的是Nacos,看到Nacos的控制台有主动下线的功能,所以就去翻阅了下源码,找到了主动下线服务的Api接口。实现原理是在停机发布之前先调用下线接口,并等待几秒(这样新的请求不会再进来了,让老的请求继续处理完成),然后再正常停止服务(Spring容器)。 我们公司使用的是jenkins发布服务,所以这里只需在jenkinsfile里面做些修改,在停止服务之前加入下线服务的命令,以下是<span style="color:red">关键代码</span>(省去其他): ``` # 定义发布服务的机器A def DEPLOY_HOST = '172.16.1.1' # 定义Nacos地址 NACOS_ADDR="172.16.1.2:8848" # 定义服务下线地址 SERVICE_DOWN_URL="${NACOS_ADDR}/nacos/v1/ns/instance?serviceName=providers:com.xxx.Service:1.0.0-20201008-SNAPSHOT:ORDER-SERVICE&port=10888&enabled=false&ip=" # 请求接口下线Nacos对应的服务 curl -X PUT -sSf "${SERVICE_DOWN_URL}${DEPLOY_HOST}" # 睡几秒,让未跑完的请求继续跑完 sleep 10s # 停止容器 docker -H ${DEPLOY_HOST} stop container_id ``` #####插播一句,停机过程中若MQ还在消费,执行到一半出错咋办?来[看看这个](http://www.asfx.xyz/p/6bdc004395c447e1b626d2fa23022810 "看看这个")吧~~
我的主页
退出