K8S(Docker)如何優(yōu)雅的關(guān)閉SpringBoot微服務(wù)
K8S(Docker)優(yōu)雅的關(guān)閉SpringBoot微服務(wù)
最近在折騰 K8S
,當(dāng)刪掉一個(gè) Pod
之后(一個(gè) Pod
上部署了一個(gè)微服務(wù)實(shí)例),Eureka Server
竟然沒有將該服務(wù)實(shí)例標(biāo)記成 DOWN
,正常來說,當(dāng)一個(gè) Eureka Client
關(guān)閉的時(shí)候會(huì)發(fā)送一個(gè)請(qǐng)求給 Eureka Server
,Eureka Server
會(huì)馬上的將服務(wù)標(biāo)記為 DOWN
狀態(tài),具體可以看本地開發(fā)日志。
o.s.s.concurrent.ThreadPoolTaskExecutor : Shutting down ExecutorService 'applicationTaskExecutor'
com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient ...
com.netflix.discovery.DiscoveryClient : Unregistering ...
com.netflix.discovery.DiscoveryClient : DiscoveryClient_ZUUL-SERVICE/192.168.8.14:zuul-service:5555 - deregister status: 200
com.netflix.discovery.DiscoveryClient : Completed shut down of DiscoveryClient
其實(shí)解決起來并沒有很高大上,關(guān)鍵問題是就是 Docker
語法的區(qū)別,因?yàn)?Docker
容器在 stop
的時(shí)候,只有 pid 為 1 的進(jìn)程才能接收到終止信號(hào),而 Docker
的 CMD
命令與 ENTRYPOINT
命令都有兩種類型的執(zhí)行方式:
- 一種是
exec
也就是帶中括號(hào)的 - 另一種是
shell
方式,也就是不帶中括號(hào),在使用的過程中只要使用exec
的就能保證 Java 命令是在pid
為1
的進(jìn)程上執(zhí)行。
具體解決
CMD
方式:
CMD ["/bin/bash", "-c", "java -jar /webapp/zuul-admin.jar"] # 如果需要添加參數(shù),可以這樣做 ENV COMMON="-Xms128m -Xmx128m" CMD ["/bin/bash", "-c", "java $COMMOND -jar /webapp/zuul-admin.jar"] # 反例,錯(cuò)誤使用,如果是這樣的的話,那么需要在 docker run 的時(shí)候通過 -e "COMMON=xxx" 進(jìn)行傳參 CMD ["/bin/bash", "-c", "java", "$COMMOND", "-jar /webapp/zuul-admin.jar"] # shell 模式,這種模式啟動(dòng)的 pid 不為 1 CMD java -jar /webapp/zuul-admin.jar # shell 模式帶參數(shù),這種模式啟動(dòng)的 pid 不為 1 ENV COMMON="-Xms128m -Xmx128m" CMD java -jar $COMMON /webapp/zuul-admin.jar
- 除了使用
CMD
命令外,還可以使用ENTRYPOINT
命令,使用方法一樣:
ENTRYPOINT ["/bin/bash", "-c", "java -jar /webapp/zuul-admin.jar"] # 如果需要添加參數(shù),可以這樣做 ENV COMMON="-Xms128m -Xmx128m" ENTRYPOINT ["/bin/bash", "-c", "java $COMMOND -jar /webapp/zuul-admin.jar"] # 反例,錯(cuò)誤使用,如果是這樣的的話,那么需要在 docker run 的時(shí)候通過 -e "COMMON=xxx" 進(jìn)行傳參 ENTRYPOINT ["/bin/bash", "-c", "java", "$COMMOND", "-jar /webapp/zuul-admin.jar"] # shell 模式,這種模式啟動(dòng)的 pid 不為 1 ENTRYPOINT java -jar /webapp/zuul-admin.jar # shell 模式帶參數(shù),這種模式啟動(dòng)的 pid 不為 1 ENV COMMON="-Xms128m -Xmx128m" ENTRYPOINT java -jar $COMMON /webapp/zuul-admin.jar
后續(xù)有問題,還是需要多看文檔:
- 官方 Spring Boot Docker : 官方使用的是
ENTRYPOINT
- 官方 Dockerfile reference
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于SpringBoot實(shí)現(xiàn)IP黑白名單的詳細(xì)步驟
IP黑白名單是網(wǎng)絡(luò)安全管理中常見的策略工具,用于控制網(wǎng)絡(luò)訪問權(quán)限,根據(jù)業(yè)務(wù)場(chǎng)景的不同,其應(yīng)用范圍廣泛,比如比較容易被盜刷的短信接口、文件接口,都需要添加IP黑白名單加以限制,所以本文給大家介紹了基于SpringBoot實(shí)現(xiàn)IP黑白名單的詳細(xì)步驟,需要的朋友可以參考下2024-01-01Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程
本文主要介紹了Java多線程中線程池常見7個(gè)參數(shù)的詳解以及執(zhí)行流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式
這篇文章主要介紹了RestTemplate get請(qǐng)求攜帶headers自動(dòng)拼接參數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07spring?boot?使用?@Scheduled?注解和?TaskScheduler?接口實(shí)現(xiàn)定時(shí)任務(wù)
這篇文章主要介紹了spring?boot?使用?@Scheduled?注解和?TaskScheduler?接口實(shí)現(xiàn)定時(shí)任務(wù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Spring Cloud Admin健康檢查 郵件、釘釘群通知的實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Admin健康檢查 郵件、釘釘群通知的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項(xiàng)
這篇文章主要介紹了關(guān)于JavaEE匿名內(nèi)部類和Lambda表達(dá)式的注意事項(xiàng),匿名內(nèi)部類顧名思義是沒有修飾符甚至沒有名稱的內(nèi)部類,使用匿名內(nèi)部類需要注意哪些地方,我們一起來看看吧2023-03-03淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝
這篇文章主要介紹了淺談Strut2如何對(duì)請(qǐng)求參數(shù)的封裝,具有一定借鑒價(jià)值,需要的朋友可以參考下2017-12-12