0
点赞
收藏
分享

微信扫一扫

如何优雅的关闭Spring Boot程序


1 先说下不优雅的关闭方式

先查询Spring Boot程序的PID,然后再​​kill -9 PID​​,像下面一样

[root@iZ1608aqb7ntn9Z ~]# ps -ef|grep java
root 46858 1 0 5月02 ? 01:32:25 /usr/local/jdk1.8.0_141/bin/java......
root 785288 785269 0 14:36 ? 00:00:11 /usr/local/......
[root@iZ1608aqb7ntn9Z ~]# kill -9 46858
[root@iZ1608aqb7ntn9Z ~]# ps -ef|grep java
root 785288 785269 0 14:36 ? 00:00:11 /usr/local/......

这种方式的坏处:

首先kill -9 的命令类似于直接断电,当然除了直接终止程序正在执行的任务导致数据丢失以外,在单体环境下该命令没有太大的坏处,但是在分布式环境下就大不同了。

例如下图所示:将App2进行关闭后,再分布式注册中心中App2并没有直接被清除,这就导致了服务消费者还有可能去调用App2的接口进而导致报错,除此以外,在分布式事务中异常关闭系统也可能造成很不好的影响。

如何优雅的关闭Spring Boot程序_分布式

2 再来说下如何优雅的关闭

依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件:

server.port=8443
#启用shutdown
management.endpoint.shutdown.enabled=true
management.endpoints.web.exposure.include=*
# 自定义管理端点的前缀(保证安全) http://127.0.0.1:[port]/MyActuator/shutdown
management.endpoints.web.base-path=/MyActuator
# 自定义端口
management.server.port=18443
# 不允许远程管理连接(不允许外部调用保证安全)
management.server.address=127.0.0.1

配置类:

/**
* @desc: ShutDownConfig
* @author: YanMingXin
* @create: 2021/8/4-16:16
**/
@Configuration
public class ShutDownConfig {

@Bean
public ShutDownConfig getTerminateBean() {
return null;
}

@PreDestroy
public static void preDestroy() {
System.out.println("This spring application is destroyed");
}

}

效果:

命令行输入:​​curl -X POST http://127.0.0.1:18443/MyActuator/shutdown​

如何优雅的关闭Spring Boot程序_自定义_02



举报

相关推荐

0 条评论