SpringBoot应⽤优雅重启-Actuator
SpringBoot最⼤特点便是简化配置,提升开发效率,实现简单部署就是通过内嵌⼀个Web容器,如果Tomcat、Jettty等。
对于SpringBoot应⽤,只需打包成⼀个简单的Jar包,然后执⾏java -jar就可以启动,是⼀种⾮常优雅的⽅式,但同时也隐藏着⼀些问题,如:应⽤如何停⽌?对于传统的部署在容器中的Java应⽤(⾮Spring Boot应⽤)可以使⽤容器提供的脚本优雅重启,但是SpringBoot应⽤容器是内嵌的,也就不会存在容器的脚本,最直接的想法就是kill进程,但这样很不优雅,进程强⾏终⽌会带来数据丢失或者终端⽆法恢复到正常的状态,在分布式环境下还可能导致数据不⼀致的情况。
SpringBoot提供了⼏种停⽌的⽅法,本⽂重点介绍actuator endpoint的⽅法,SpringBoot官⽅⽂档的Endpoints章节中介绍了应⽤发布⽣产准备的各种特性,其中通过Actuator的HTTP Endpoint,开发⼈员可以⽅便地对应⽤进⾏监控和管理。
简易优雅停服
pom引⼊Maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
SpringBoot配置⽂件l
server:
port: 8077
management:
endpoint:
health:
show-details: always
shutdown:
enabled: true
endpoints:
web:
exposure:
include: '*'
测试Endpoint
按照上⾯进⾏配置后,SpringBoot项⽬就可以优雅关闭了,只要模拟⼀个POST请求,在Postman或者其他⼯具,访问如下路径
localhost:8077/actuator/shutdown
注:替换成⾃⼰项⽬的host及port,必须是post
springboot其实就是spring
返回
{
"message": "Shutting down, "
}
说明SpringBoot应⽤已优雅关闭
安全设置
虽然SpringBoot应⽤已可以优雅关闭了,但是还存在很⼤的安全隐患,如果有搞破坏的知道了ip、端⼝号后就可以模拟该请求停⽌服务了,因此需要增加⼀些安全限制
management.server.address 设置为本地ip,就可以防⽌远程访问该连接进⾏关闭服务了
management.server.port ⾃定义shutdown请求路径的端⼝号
进⾏这些配置后就可以做到最基本的安全且优雅的关闭SpringBoot应⽤了,调整后的配置⽂件如下
Endpoint配置⽂件
management:
endpoint:
health:
show-details: always
shutdown:
# 启⽤shutdown配置
enabled: true
endpoints:
web:
exposure:
include: '*'
# ⾃定义管理断点的前缀,安全性考虑
base-path: /restartactuator
server:
# ⾃定义端⼝
port: 12581
# 不允许远程管理连接,安全性考虑
address: 127.0.0.1
验证
登录到SpringBoot应⽤部署的服务器,本地通过curl执⾏POST请求
curl -X POST 127.0.0.1:12581/restartactuator/shutdown
然后可以可到如下输出
{"message":"Shutting down, "}
说明SpringBoot应⽤已经优雅且安全的进⾏了停⽌
相关知识
kill指令
kill -9 pid 是不进⾏任何等待判断,可以理解为操作系统从内核级别强⾏杀死某个进程,可模拟为系统宕机、系统断点等特殊情况kill -15 pid 是等待应⽤关闭,执⾏阻塞操作,有时候也会出现⽆法关闭应⽤的情况(线上理想情况,是bug就该追根溯源)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。