您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何深入掌握SpringBoot-2.3的容器探針,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
當我們把應用部署到kubernetes環境時,這些知識讓我們能配置出官方推薦的探針方案,如下圖:
盡管上述配置已經可以覆蓋多數場景,依然有三個問題未解決:
首先,SpringBoot為kubernetes提供了兩個actuator項,但是那些并未部署在kubernetes的SringBoot應用呢?用不上這兩項也要對外暴露這兩個服務地址嗎?
其次,就緒探針是什么時候開始返回200返回碼的?應用啟動階段,業務服務可能需要一段時間才能正常工作,就緒探針要是提前返回了200,那k8s就認為容器可以正常工作了,這時候把外部請求調度過來是無法正常響應的,所以搞清楚就緒探針的狀態變化邏輯很重要;
最后,也是最重要的一點:有的場景下,例如外部依賴服務異常、本地全局異常等情況下,業務不想對外提供服務,等到問題解決后業務又可以對外提供服務了,如果此時我們能自己寫代碼控制就緒探針的返回碼,那就做到了控制kubernetes是否將外部請求調度到此容器上,這可是個很實用的功能!
為了解決上述問題而作,這些問題解決后才能用好探針技術,讓它在容器環境帶來更大價值;
解決上述問題的關鍵集中在以下幾個知識點:
SpringBoot對容器環境的判斷;
SpringBoot對狀態定義;
獲取狀態;
監聽狀態;
修改狀態;
接下來挨個學習這些知識點;
官方文檔如下圖所示,SpringBoot判斷是否是kubernetes環境的邏輯很簡單:是否有<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個環境變量:
熟悉kubernetes的讀者看到<font color="blue">_SERVICE_HOST"</font> 和<font color="blue">_SERVICE_PORT</font>,應該會想起<font color="red">KUBERNETES_SERVICE_HOST</font>和<font color="blue">KUBERNETES_SERVICE_PORT</font>,這是k8s給pod中配置的環境變量,看來SpringBoot也是針對k8s的這個規則來判定是否是容器環境的(如果將來k8s的某個版本不給pod設置這個環境變量,那些原本可以正常運行的pod豈不是有危險了?);
接下來通過實踐來驗證上述規則是否有效;
創建一個SpringBoot-2.3.0.RELEASE的應用,其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>
啟動該應用,瀏覽器訪問:<font color="blue">http://localhost:8080/actuator/health/liveness</font>,返回404錯誤:
以上返回是符合預期的,因為此時并非在kubernetes環境,接下來將"<font color="blue">_SERVICE_HOST</font> 和<font color="blue">_SERVICE_PORT</font>這兩個環境變量加入應用進程,看看是否有變化;
如下圖,編輯啟動類的配置信息:
點擊下圖紅框位置,即可進入編輯環境變量的窗口:
新的窗口中,操作如下圖紅框中所示,新增了兩個環境變量:
再次運行程序,這次返回的狀態碼是200:
至此,我們弄明白了SpringBoot是否開啟探針的邏輯,即應用是否運行在容器環境,而是否是容器環境的判定邏輯則是<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個環境變量是否存在;
<font color="blue">/actuator/health/liveness</font>和<font color="blue">/actuator/health/readiness</font>在kubernetes環境才會開啟,但是一般情況下,在開發階段SpringBoot應用可能運行在自己的電腦上,此時如果想查看這兩個接口的返回值有兩種方式:
第一種,就是前面提到的添加<font color="blue">_SERVICE_HOST</font>和<font color="blue">_SERVICE_PORT</font>這兩個環境變量,讓SpringBoot以為當前環境是kubernetes環境;
第二種,是按照官方指導添加屬性,如下圖紅框所示:
首先要弄清楚有哪些狀態,源碼是最準確的;
如下圖,存活探針一共有兩種狀態:<font color="blue">CORRECT</font>表示應用運行中并且內部狀態正常,<font color="blue">BROKEN</font>表示應用運行中并且內部是BROKEN狀態(請原諒我的英語水平)
如下圖,就緒探針一共有兩種狀態:<font color="blue">ACCEPTING_TRAFFIC</font>表示應用可以對外提供服務,<font color="blue">REFUSING_TRAFFIC</font>表示應用無法對外提供服務;
另外,上圖的since注解顯示這兩個枚舉是從<font color="red">2.3.0</font>版本開始生效的;
小小八卦一下,上述兩個枚舉的作者<font color="blue">Brian Clozel</font>,坐標法國里昂,目前在sringboot的提交次數排第8名:
在SpringBoot啟動過程中,應用、存活探針、就緒探針三者狀態對應關系如下圖:
在SpringBoot停止過程中,應用、存活探針、就緒探針三者狀態對應關系如下圖:
如果業務應用想獲取當前的存活和就緒狀態,將ApplicationAvailability接口autowire進來即可,下一篇《實戰篇》會有詳細的使用方式,這里看下關鍵代碼:
得益于Spring完整的事件發布和訂閱機制,業務應用通過EventListener注解就能監聽到存活和就緒狀態的變化,在EventListener注解修飾的方法中寫入必要的業務代碼即可實現狀態監聽,下一篇《實戰篇》會有詳細的使用方式,這里看下關鍵代碼:
修改狀態,尤其是就緒狀態,這應該是我們最關注的功能了,在某些業務場景下,應用無法對外提供服務,這時候我們希望K8S不要將外部請求調度到這里,如果K8S通過就緒探針收到返回碼非200,就不再將請求調度到這個pod上;
下一篇《實戰篇》會有詳細的代碼介紹,這里給出關鍵代碼作為參考:
重要的事情一定要強調:咱們修改狀態的最終目的,不是為了取得applicationAvailability.getReadinessState()返回新的枚舉對象,而是要<font color="red">改變/actuator/health/readiness接口的返回碼(就緒是200,未就緒是503)</font>,這是kubernetes的探針規則要用到的。
以上就是如何深入掌握SpringBoot-2.3的容器探針,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。