您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)如何深入掌握SpringBoot-2.3的容器探針,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
當(dāng)我們把應(yīng)用部署到kubernetes環(huán)境時(shí),這些知識(shí)讓我們能配置出官方推薦的探針方案,如下圖:
盡管上述配置已經(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)鍵集中在以下幾個(gè)知識(shí)點(diǎn):
SpringBoot對(duì)容器環(huán)境的判斷;
SpringBoot對(duì)狀態(tài)定義;
獲取狀態(tài);
監(jiān)聽狀態(tài);
修改狀態(tài);
接下來挨個(gè)學(xué)習(xí)這些知識(shí)點(diǎn);
官方文檔如下圖所示,SpringBoot判斷是否是kubernetes環(huán)境的邏輯很簡單:是否有<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(huán)境變量:
熟悉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)了?);
接下來通過實(shí)踐來驗(yàn)證上述規(guī)則是否有效;
創(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>
增加actuator依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
啟動(dòng)該應(yīng)用,瀏覽器訪問:<font color="blue">http://localhost:8080/actuator/health/liveness</font>,返回404錯(cuò)誤:
以上返回是符合預(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)程,看看是否有變化;
如下圖,編輯啟動(dòng)類的配置信息:
點(diǎn)擊下圖紅框位置,即可進(jìn)入編輯環(huán)境變量的窗口:
新的窗口中,操作如下圖紅框中所示,新增了兩個(gè)環(huán)境變量:
再次運(yùn)行程序,這次返回的狀態(tài)碼是200:
至此,我們弄明白了SpringBoot是否開啟探針的邏輯,即應(yīng)用是否運(yùn)行在容器環(huán)境,而是否是容器環(huán)境的判定邏輯則是<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個(gè)環(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)添加屬性,如下圖紅框所示:
首先要弄清楚有哪些狀態(tài),源碼是最準(zhǔn)確的;
如下圖,存活探針一共有兩種狀態(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水平)
如下圖,就緒探針一共有兩種狀態(tài):<font color="blue">ACCEPTING_TRAFFIC</font>表示應(yīng)用可以對(duì)外提供服務(wù),<font color="blue">REFUSING_TRAFFIC</font>表示應(yīng)用無法對(duì)外提供服務(wù);
另外,上圖的since注解顯示這兩個(gè)枚舉是從<font color="red">2.3.0</font>版本開始生效的;
小小八卦一下,上述兩個(gè)枚舉的作者<font color="blue">Brian Clozel</font>,坐標(biāo)法國里昂,目前在sringboot的提交次數(shù)排第8名:
在SpringBoot啟動(dòng)過程中,應(yīng)用、存活探針、就緒探針三者狀態(tài)對(duì)應(yīng)關(guān)系如下圖:
在SpringBoot停止過程中,應(yīng)用、存活探針、就緒探針三者狀態(tài)對(duì)應(yīng)關(guān)系如下圖:
如果業(yè)務(wù)應(yīng)用想獲取當(dāng)前的存活和就緒狀態(tài),將ApplicationAvailability接口autowire進(jìn)來即可,下一篇《實(shí)戰(zhàn)篇》會(huì)有詳細(xì)的使用方式,這里看下關(guān)鍵代碼:
得益于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)鍵代碼:
修改狀態(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上;
下一篇《實(shí)戰(zhàn)篇》會(huì)有詳細(xì)的代碼介紹,這里給出關(guān)鍵代碼作為參考:
重要的事情一定要強(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è)資訊頻道。
免責(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)容。