SpringBoot之如何正確、安全的關閉服務
SpringBoot正確安全的關閉服務
我們利用遠程關閉功能可以實現優雅地關閉指定地服務。
正文
本文依然使用v1.5.8.RELEASE ,講地是利用actuator的Endpoints實現關閉服務
首先準備一個eureka服務,然後啟動他。
然後準備一個eureka客戶端服務,客戶端的pom除瞭必要的springboot的web依賴還需要添加依賴如下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
在eureka客戶端服務的application.properties文件開啟shutdown endpoint,SpringBoot的endpoints.shutdown.enabled默認是關閉的。
eureka.client.service-url.defaultZone=http://admin:admin@localhost:1111/eureka/ server.port=8762 spring.application.name=eureka-client #啟用shutdown endpoints.shutdown.enabled=true #禁用密碼驗證 endpoints.shutdown.sensitive=false #如果用的2.x版本的 就用註釋的那四行配置 #management.endpoints.shutdown.enabled=true #management.endpoints.health.enabled=true #management.endpoints.web.base-path=/ #management.endpoints.web.exposure.include=*
配置已經配好,這時可以啟動服務瞭,將他註冊在eureka上面,這時我們可以看到下面
然後在終端執行 curl -X POST 127.0.0.1:8762/shutdown ,可以看到message:Shutting down,bye…說明成功關閉瞭服務
下面筆者要教給大傢一種高級使用的方法,做瞭一個安全的認證,上面關閉服務的缺點大傢顯而易見,知道服務端口和ip的就能關閉,這種做法很不安全,接下來要在客戶端服務配置一下安全認證。
首先在eureka客戶端服務的application.properties文件追加配置
eureka.client.service-url.defaultZone=http://admin:admin@localhost:1111/eureka/ server.port=8762 spring.application.name=eureka-client management.security.enabled=true #啟用shutdown endpoints.shutdown.enabled=true #禁用密碼驗證 endpoints.shutdown.sensitive=true #驗證用戶名 security.user.name=admin #驗證密碼 security.user.password=admin #角色 management.security.role=SUPERUSER #指定shutdown endpoint的路徑 endpoints.shutdown.path=/custompath #也可以統一指定所有endpoints的路徑`management.context-path=/manage` #指定管理端口和IP management.port=8081 management.address=127.0.0.1
我們使用瞭security,就需要在pom添加依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
大功告成,是不是很簡單,下面啟動你的客戶端服務,這裡我就不貼一些多餘的圖片瞭,成功註冊到eureka上面瞭,和上面的圖一樣。
接下來使用終端訪問 curl -X POST -u admin:admin 127.0.0.1:8081/custompath
看見瞭你的服務又和你say byebye瞭吧!
這個命令 curl -X POST -u admin:admin 127.0.0.1:8081/custompath 每一個位置對應的參數值大傢可以看application.properties文件分別對應瞭哪些配置就明白瞭。
SpringBoot2.0.4關閉程序,我走過的那些坑
首次接觸springboot項目,在本地測試的時候,發現不知道怎麼關閉程序,雖然後來不得不用殺死進程的方式解決,但總覺得這種方式太簡單粗暴。就準備問問度娘別人都是怎麼做的。
結果普遍答案是:
步驟:
第一步:引入依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
第二步:application.properties配置
# 啟用shutdown endpoints.shutdown.enabled=true # 禁用密碼驗證 endpoints.shutdown.sensitive=false
第三步:http://IP:端口號/actuator/shutdown或者http://IP:端口號/shutdown
結果:
404!!!!!!!
為什麼總是404?
後來幡然醒悟,別人都是springboot 1.X,而我的是2.X。(springboot變化好大o(╥﹏╥)o)
接著,我繼續查2.0以上版本怎麼解決,結果大多數是在啟動類加一推代碼……可能是我不會用吧,反正沒成功。繼續找……
後來看到大多數人又說,下面的方式配置:
management: endpoints: web: exposure: include: "*"
然後看日志,發現所有的端點都打開瞭,就shutdown沒打開o(╥﹏╥)o
實在找不到相關博客瞭,就去官網找答案
官網鏈接https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html
原來人傢默認是關著的,那就打開呀!於是我以為發現瞭新大陸,就去打開,據需看官網,看到這樣一句。
management.endpoint.shutdown.enabled=true
添加上去,果然成功!
但是,過程中我曾經寫成瞭這樣:
##錯誤寫法!!!!!!!!!!!!!!!!! management: endpoints: web: exposure: include: "*" shutdown: enabled: true
註意哈,這是錯誤寫法,我把endpoints當成瞭endpoint!!!他們可是不一樣的啊!
最終寫法:
management: endpoints: web: exposure: include: shutdown #註意下面這個位置!! endpoint: shutdown: enabled: true
註:include後面可以添加你想用到的端點 。
總結
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- SpringBoot Admin健康檢查功能的實現
- SpringBoot2.x中management.security.enabled=false無效的解決
- 五分鐘解鎖springboot admin監控新技巧
- SpringBoot動態修改日志級別的操作
- Java SpringBoot快速集成SpringBootAdmin管控臺監控服務詳解