溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何深入掌握SpringBoot-2.3的容器探針

發(fā)布時(shí)間:2021-10-12 13:49:22 來源:億速云 閱讀:183 作者:柒染 欄目:云計(jì)算

本篇文章給大家分享的是有關(guān)如何深入掌握SpringBoot-2.3的容器探針,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

  1. 當(dāng)我們把應(yīng)用部署到kubernetes環(huán)境時(shí),這些知識(shí)讓我們能配置出官方推薦的探針方案,如下圖:

如何深入掌握SpringBoot-2.3的容器探針

  1. 盡管上述配置已經(jīng)可以覆蓋多數(shù)場景,依然有三個(gè)問題未解決:

  • 首先,SpringBoot為kubernetes提供了兩個(gè)actuator項(xiàng),但是那些并未部署在kubernetes的SringBoot應(yīng)用呢?用不上這兩項(xiàng)也要對(duì)外暴露這兩個(gè)服務(wù)地址嗎?

  • 其次,就緒探針是什么時(shí)候開始返回200返回碼的?應(yīng)用啟動(dòng)階段,業(yè)務(wù)服務(wù)可能需要一段時(shí)間才能正常工作,就緒探針要是提前返回了200,那k8s就認(rèn)為容器可以正常工作了,這時(shí)候把外部請(qǐng)求調(diào)度過來是無法正常響應(yīng)的,所以搞清楚就緒探針的狀態(tài)變化邏輯很重要;

  • 最后,也是最重要的一點(diǎn):有的場景下,例如外部依賴服務(wù)異常、本地全局異常等情況下,業(yè)務(wù)不想對(duì)外提供服務(wù),等到問題解決后業(yè)務(wù)又可以對(duì)外提供服務(wù)了,如果此時(shí)我們能自己寫代碼控制就緒探針的返回碼,那就做到了控制kubernetes是否將外部請(qǐng)求調(diào)度到此容器上,這可是個(gè)很實(shí)用的功能!

為了解決上述問題而作,這些問題解決后才能用好探針技術(shù),讓它在容器環(huán)境帶來更大價(jià)值;

關(guān)鍵知識(shí)點(diǎn)

解決上述問題的關(guān)鍵集中在以下幾個(gè)知識(shí)點(diǎn):

  1. SpringBoot對(duì)容器環(huán)境的判斷;

  2. SpringBoot對(duì)狀態(tài)定義;

  3. 獲取狀態(tài);

  4. 監(jiān)聽狀態(tài);

  5. 修改狀態(tài);

接下來挨個(gè)學(xué)習(xí)這些知識(shí)點(diǎn);

SpringBoot對(duì)容器環(huán)境的判斷

  1. 官方文檔如下圖所示,SpringBoot判斷是否是kubernetes環(huán)境的邏輯很簡單:是否有<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(huán)境變量: 如何深入掌握SpringBoot-2.3的容器探針

  2. 熟悉kubernetes的讀者看到<font color="blue">_SERVICE_HOST"</font> 和<font color="blue">_SERVICE_PORT</font>,應(yīng)該會(huì)想起<font color="red">KUBERNETES_SERVICE_HOST</font>和<font color="blue">KUBERNETES_SERVICE_PORT</font>,這是k8s給pod中配置的環(huán)境變量,看來SpringBoot也是針對(duì)k8s的這個(gè)規(guī)則來判定是否是容器環(huán)境的(如果將來k8s的某個(gè)版本不給pod設(shè)置這個(gè)環(huán)境變量,那些原本可以正常運(yùn)行的pod豈不是有危險(xiǎn)了?);

  3. 接下來通過實(shí)踐來驗(yàn)證上述規(guī)則是否有效;

  4. 創(chuàng)建一個(gè)SpringBoot-2.3.0.RELEASE的應(yīng)用,其pom.xml中的parent信息如下:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.3.0.RELEASE</version>
  <relativePath/>
</parent>
  1. 增加actuator依賴:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 啟動(dòng)該應(yīng)用,瀏覽器訪問:<font color="blue">http://localhost:8080/actuator/health/liveness</font>,返回404錯(cuò)誤:

如何深入掌握SpringBoot-2.3的容器探針

  1. 以上返回是符合預(yù)期的,因?yàn)榇藭r(shí)并非在kubernetes環(huán)境,接下來將"<font color="blue">_SERVICE_HOST</font> 和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(huán)境變量加入應(yīng)用進(jìn)程,看看是否有變化;

  2. 如下圖,編輯啟動(dòng)類的配置信息:

如何深入掌握SpringBoot-2.3的容器探針

  1. 點(diǎn)擊下圖紅框位置,即可進(jìn)入編輯環(huán)境變量的窗口:

如何深入掌握SpringBoot-2.3的容器探針

  1. 新的窗口中,操作如下圖紅框中所示,新增了兩個(gè)環(huán)境變量:

如何深入掌握SpringBoot-2.3的容器探針

  1. 再次運(yùn)行程序,這次返回的狀態(tài)碼是200:

如何深入掌握SpringBoot-2.3的容器探針

  1. 至此,我們弄明白了SpringBoot是否開啟探針的邏輯,即應(yīng)用是否運(yùn)行在容器環(huán)境,而是否是容器環(huán)境的判定邏輯則是<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(huán)境變量是否存在;

非kubernetes環(huán)境開啟探針

<font color="blue">/actuator/health/liveness</font>和<font color="blue">/actuator/health/readiness</font>在kubernetes環(huán)境才會(huì)開啟,但是一般情況下,在開發(fā)階段SpringBoot應(yīng)用可能運(yùn)行在自己的電腦上,此時(shí)如果想查看這兩個(gè)接口的返回值有兩種方式:

第一種,就是前面提到的添加<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(huán)境變量,讓SpringBoot以為當(dāng)前環(huán)境是kubernetes環(huán)境;

第二種,是按照官方指導(dǎo)添加屬性,如下圖紅框所示:

如何深入掌握SpringBoot-2.3的容器探針

SpringBoot對(duì)探針相關(guān)狀態(tài)定義

  1. 首先要弄清楚有哪些狀態(tài),源碼是最準(zhǔn)確的;

  2. 如下圖,存活探針一共有兩種狀態(tài):<font color="blue">CORRECT</font>表示應(yīng)用運(yùn)行中并且內(nèi)部狀態(tài)正常,<font color="blue">BROKEN</font>表示應(yīng)用運(yùn)行中并且內(nèi)部是BROKEN狀態(tài)(請(qǐng)?jiān)徫业挠⒄Z水平)

如何深入掌握SpringBoot-2.3的容器探針

  1. 如下圖,就緒探針一共有兩種狀態(tài):<font color="blue">ACCEPTING_TRAFFIC</font>表示應(yīng)用可以對(duì)外提供服務(wù),<font color="blue">REFUSING_TRAFFIC</font>表示應(yīng)用無法對(duì)外提供服務(wù);

如何深入掌握SpringBoot-2.3的容器探針

  1. 另外,上圖的since注解顯示這兩個(gè)枚舉是從<font color="red">2.3.0</font>版本開始生效的;

  2. 小小八卦一下,上述兩個(gè)枚舉的作者<font color="blue">Brian Clozel</font>,坐標(biāo)法國里昂,目前在sringboot的提交次數(shù)排第8名:

如何深入掌握SpringBoot-2.3的容器探針

  1. 在SpringBoot啟動(dòng)過程中,應(yīng)用、存活探針、就緒探針三者狀態(tài)對(duì)應(yīng)關(guān)系如下圖:

如何深入掌握SpringBoot-2.3的容器探針

  1. 在SpringBoot停止過程中,應(yīng)用、存活探針、就緒探針三者狀態(tài)對(duì)應(yīng)關(guān)系如下圖:

如何深入掌握SpringBoot-2.3的容器探針

獲取狀態(tài)

如果業(yè)務(wù)應(yīng)用想獲取當(dāng)前的存活和就緒狀態(tài),將ApplicationAvailability接口autowire進(jìn)來即可,下一篇《實(shí)戰(zhàn)篇》會(huì)有詳細(xì)的使用方式,這里看下關(guān)鍵代碼:

如何深入掌握SpringBoot-2.3的容器探針

監(jiān)聽狀態(tài)

得益于Spring完整的事件發(fā)布和訂閱機(jī)制,業(yè)務(wù)應(yīng)用通過EventListener注解就能監(jiān)聽到存活和就緒狀態(tài)的變化,在EventListener注解修飾的方法中寫入必要的業(yè)務(wù)代碼即可實(shí)現(xiàn)狀態(tài)監(jiān)聽,下一篇《實(shí)戰(zhàn)篇》會(huì)有詳細(xì)的使用方式,這里看下關(guān)鍵代碼:

如何深入掌握SpringBoot-2.3的容器探針

修改狀態(tài)

  1. 修改狀態(tài),尤其是就緒狀態(tài),這應(yīng)該是我們最關(guān)注的功能了,在某些業(yè)務(wù)場景下,應(yīng)用無法對(duì)外提供服務(wù),這時(shí)候我們希望K8S不要將外部請(qǐng)求調(diào)度到這里,如果K8S通過就緒探針收到返回碼非200,就不再將請(qǐng)求調(diào)度到這個(gè)pod上;

  2. 下一篇《實(shí)戰(zhàn)篇》會(huì)有詳細(xì)的代碼介紹,這里給出關(guān)鍵代碼作為參考:

如何深入掌握SpringBoot-2.3的容器探針

請(qǐng)注意

重要的事情一定要強(qiáng)調(diào):咱們修改狀態(tài)的最終目的,不是為了取得applicationAvailability.getReadinessState()返回新的枚舉對(duì)象,而是要<font color="red">改變/actuator/health/readiness接口的返回碼(就緒是200,未就緒是503)</font>,這是kubernetes的探針規(guī)則要用到的。

以上就是如何深入掌握SpringBoot-2.3的容器探針,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI