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的接口进而导致报错,除此以外,在分布式事务中异常关闭系统也可能造成很不好的影响。
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