保持領先
VMware 提供培訓和認證,助你快速進步。
瞭解更多更新: 本博文已根據 Spring Boot 2.3.0.RC1 中釋出的更改進行了更新
Spring Boot 團隊正積極為即將釋出的 2.3.0 版本開發 Kubernetes 主題。在增加了Docker 映象建立和優雅停機支援之後,現在是時候介紹 Liveness 和 Readiness 探針支援了。
在 2.2.0 版本中,Spring Boot 提供了健康分組支援,允許開發者選擇一部分健康指標並將它們分組在一個單一、關聯的健康狀態下。
即使有了這個新特性,我們發現當涉及到 Kubernetes 時,我們可以為 Spring 社群提供更多、更具針對性的觀點和指導。
在 Kubernetes 中,Liveness 和 Readiness 這兩個 Kubernetes 概念代表了應用程式狀態的不同方面。
應用程式的 Liveness 狀態表示其內部狀態是否有效。如果 Liveness 損壞,意味著應用程式本身處於失敗狀態且無法從中恢復。在這種情況下,最好的辦法是重啟應用程式例項。例如,依賴本地快取的應用程式如果在本地快取損壞且無法修復時,應該使其 Liveness 狀態失敗。
Readiness 狀態表示應用程式是否已準備好接受客戶端請求。如果 Readiness 狀態未就緒,Kubernetes 不應將流量路由到該例項。如果應用程式正忙於處理任務佇列,則可以宣告自己處於忙碌狀態,直到其負載再次可管理。
這些 Liveness 和 Readiness 概念不僅適用於 Kubernetes,它們在各種部署平臺中都普遍有用。我們引入了 LivenessState 和 ReadinessState,它們是這些概念的不可變表示。你可以隨時從 ApplicationAvailability 中獲取它們。
// Available as a component in the application context
ApplicationAvailability availability;
LivenessState livenessState = availabilityProvider.getLivenessState();
ReadinessState readinessState = availabilityProvider.getReadinessState()
僅依靠輪詢檢查來了解應用程式狀態的模型是不完整的。只有應用程式自身瞭解其生命週期(啟動、關閉)或能提供關於執行時錯誤的上下文(在處理任務時進入損壞狀態)。Spring Boot 應用程式上下文會在應用程式生命週期期間原生髮布這些事件;你的應用程式程式碼也應該能夠對此做出貢獻。
這就是為什麼我們選擇使用 Spring 應用事件模型來改變可用性狀態並監聽更新。
/**
* Component that checks that the local cache is in a valid state.
*/
@Component
public class LocalCacheVerifier {
private final ApplicationEventPublisher eventPublisher;
public LocalCacheVerifier(ApplicationEventPublisher eventPublisher) {
this.eventPublisher = eventPublisher;
}
public void checkLocalCache() {
try {
//...
}
catch (CacheCompletelyBroken ex) {
AvailabilityChangeEvent.publish(this.eventPublisher, ex, LivenessState.BROKEN);
}
}
}
元件也可以使用 @EventListener(或透過實現 ApplicationListener)來監聽這些事件。請檢視參考文件以獲取更多資訊。
此支援直接包含在 spring-boot 模組中,並對所有 Spring Boot 應用程式啟用;這使得它適用於所有型別的應用程式(Web、批處理等),並允許你實現不一定繫結到 HTTP 的探針。
你可能會對一個非常常見的用例感興趣:在 Kubernetes 上部署 Web 應用程式並配置 HTTP 探針。唯一的要求是向你的應用程式新增 Spring Boot Actuator 依賴!Actuator 將利用 Health 支援來配置Liveness 和 Readiness HTTP 探針。
Actuator 將從 ApplicationAvailability 中收集 “Liveness” 和 “Readiness” 資訊,並在專用的健康指標中使用這些資訊:LivenessStateHealthIndicator 和 ReadinessStateHealthIndicator。這些指標將顯示在全域性健康端點("/actuator/health")上。它們還將作為單獨的 HTTP 探針使用健康分組暴露:"/actuator/health/liveness" 和 "/actuator/health/readiness"。
在 Kubernetes 上執行的應用程式將顯示以下健康報告:
// https://:8080/actuator/health
// HTTP/1.1 200 OK
{
"status": "UP",
"components": {
"diskSpace": {
"status": "UP",
"details": { //...
}
},
"livenessProbe": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"readinessProbe": {
"status": "UP"
}
},
"groups": [
"liveness",
"readiness"
]
}
當呼叫 Liveness 分組時,Kubernetes 將獲得以下資訊:
// https://:8080/actuator/health/liveness
// HTTP/1.1 200 OK
{
"status": "UP",
"components": {
"livenessstate": {
"status": "UP"
}
}
}
標記為未就緒的應用程式將為 Readiness 分組報告以下資訊:
// https://:8080/actuator/health/readiness
// HTTP/1.1 503 SERVICE UNAVAILABLE
{
"status": "OUT_OF_SERVICE",
"components": {
"readinessstate": {
"status": "OUT_OF_SERVICE"
}
}
}
HTTP 探針僅為在 Kubernetes 上執行的應用程式配置。你可以透過手動啟用 management.health.probes.enabled=true 配置屬性在本地嘗試。由於探針是健康分組,你將獲得許多額外的功能,例如配置 HTTP 狀態對映器、安全性、詳細資訊可見性等…
你當然可以配置額外的健康指標作為探針的一部分,檢查外部系統的狀態:資料庫、Web API、共享快取。給定一個現有的 CacheCheckHealthIndicator,你可以透過以下方式增強 Liveness 探針:
management.endpoint.health.group.liveness.include=livenessstate,cacheCheck
你應該仔細考慮將外部狀態與 Liveness 或 Readiness 關聯起來,這就是為什麼 Spring Boot 預設不新增任何內容的原因。每個應用程式和部署都不同,但我們致力於在社群的幫助下提供指導並調整預設設定——請檢視我們參考文件中關於“使用 Kubernetes 探針檢查外部狀態”的部分。
結合優雅停機功能,此特性將有助於你管理 Kubernetes 中應用程式和容器的生命週期——我們已經在參考文件中開始提供關於 Kubernetes 部署和配置的指導。
這個新功能將在我們即將釋出的 2.3 里程碑版本中提供;我們期待收到你的反饋!