如何優雅的關閉Spring Boot程式

1 先說下不優雅的關閉方式

先查詢Spring Boot程式的PID,然後再kill -9 PID,像下面一樣

[root@iZ1608aqb7ntn9Z ~]# ps -ef|grep javaroot 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 javaroot 785288 785269 0 14:36 ? 00:00:11 /usr/local/……

這種方式的壞處:

首先kill -9 的命令類似於直接斷電,當然除了直接終止程式正在執行的任務導致資料丟失以外,在單體環境下該命令沒有太大的壞處,但是在分散式環境下就大不同了。

例如下圖所示:將App2進行關閉後,再分散式註冊中心中App2並沒有直接被清除,這就導致了服務消費者還有可能去呼叫App2的介面進而導致報錯,除此以外,在分散式事務中異常關閉系統也可能造成很不好的影響。

如何優雅的關閉Spring Boot程式

2 再來說下如何優雅的關閉

依賴:

org。springframework。bootspring-boot-starter-actuator

配置檔案:

server。port=8443#啟用shutdownmanagement。endpoint。shutdown。enabled=truemanagement。endpoints。web。exposure。include=*# 自定義管理端點的字首(保證安全) http://127。0。0。1:[port]/MyActuator/shutdownmanagement。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**/@Configurationpublic 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程式