SpringBoot应用优雅重启 - Actuator

SpringBoot应用优雅重启 - Actuator,第1张

SpringBoot最大特点便是简化配置,提升开发效率,实现简单部署就是通过内嵌一个Web容器,如果Tomcat、Jettty等。

对于SpringBoot应用,只需打包成一个简单的Jar包,然后执行java -jar就可以启动,是一种非常优雅的方式,但同时也隐藏着一些问题,如:应用如何停止?对于传统的部署在容器中的Java应用(非Spring Boot应用)可以使用容器提供的脚本优雅重启,但是SpringBoot应用容器是内嵌的,也就不会存在容器的脚本,最直接的想法就是kill进程,但这样很不优雅,进程强行终止会带来数据丢失或者终端无法恢复到正常的状态,在分布式环境下还可能导致数据不一致的情况。

SpringBoot提供了几种停止的方法,本文重点介绍actuator endpoint的方法,SpringBoot官方文档的Endpoints章节中介绍了应用发布生产准备的各种特性,其中通过Actuator的HTTP Endpoint,开发人员可以方便地对应用进行监控和管理。

按照上面进行配置后,SpringBoot项目就可以优雅关闭了,只要模拟一个POST请求,在Postman或者其他工具,访问如下路径

注 :替换成自己项目的host及port,必须是 post

返回

说明SpringBoot应用已优雅关闭

虽然SpringBoot应用已可以优雅关闭了,但是还存在很大的安全隐患,如果有搞破坏的知道了ip、端口号后就可以模拟该请求停止服务了,因此需要增加一些安全限制

登录到SpringBoot应用部署的服务器,本地通过curl执行POST请求

然后可以可到如下输出

说明SpringBoot应用已经优雅且安全的进行了停止

kill -9 pid 是不进行任何等待判断,可以理解为操作系统从内核级别强行杀死某个进程,可模拟为系统宕机、系统断点等特殊情况

kill -15 pid 是等待应用关闭,执行阻塞操作,有时候也会出现无法关闭应用的情况(线上理想情况,是bug就该追根溯源)

java synchronousqueue 服务器重启解决办法:

直接分配接收者线程,此时可采用SynchronousQueue,只要当前池的大小还小于最大值,ThreadPoolExecutor就会创建新线程。

SynchronousQueue并不是真正的队列,而是一种管理直接在线程之间移交信息的机制,Executors.newCachedThreadPool()工厂就采用的这种机制。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/672274.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-27
下一篇2023-07-27

发表评论

登录后才能评论

评论列表(0条)

    保存