取得領先
VMware 提供培訓和認證,以加速您的進度。
了解更多更新:這篇部落格文章已針對 Spring Boot 2.3.0.RC1 中發佈的變更進行更新。
Spring Boot 團隊正在積極開發下一個 2.3.0 版本的 Kubernetes 主題。繼 Docker 映像檔建立 和 優雅關閉支援 之後,現在是時候引入存活度和就緒度探針支援了。
在我們的 2.2.0 版本中,Spring Boot 提供了 Health Groups 支援,允許開發人員選擇健康指標的子集,並將它們歸類在單一、相關的健康狀態下。
即使有了這個新功能,我們也發現我們可以為 Spring 社群提供更多,在 Kubernetes 方面提供更多的觀點和指導。
在 Kubernetes 中,存活度和就緒度的 Kubernetes 概念 代表應用程式狀態的各個方面。
應用程式的存活狀態告訴您內部狀態是否有效。如果存活度中斷,則表示應用程式本身處於失敗狀態,並且無法從中恢復。在這種情況下,最佳的處理方式是重新啟動應用程式實例。例如,如果依賴本地快取的應用程式的本地快取已損壞且無法修復,則應使其存活狀態失敗。
就緒狀態告訴您應用程式是否已準備好接受客戶端請求。如果就緒狀態為未就緒,Kubernetes 不應將流量路由到此實例。如果應用程式太忙於處理任務佇列,則它可以宣告自己處於忙碌狀態,直到其負載再次變得可管理。
這些存活度和就緒度概念不僅適用於 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 支援來配置 存活度和就緒度 HTTP 探針。
Actuator 將從 ApplicationAvailability
收集「存活度」和「就緒度」資訊,並在專用的健康指標中使用該資訊:LivenessStateHealthIndicator
和 ReadinessStateHealthIndicator
。 這些指標將顯示在全域健康端點("/actuator/health"
)上。 它們也將使用 Health Groups 作為單獨的 HTTP 探針公開:"/actuator/health/liveness"
和 "/actuator/health/readiness"
。
在 Kubernetes 上執行的應用程式將顯示以下健康報告
// https://127.0.0.1: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"
]
}
Kubernetes 在呼叫 Liveness 群組時將獲得以下資訊
// https://127.0.0.1:8080/actuator/health/liveness
// HTTP/1.1 200 OK
{
"status": "UP",
"components": {
"livenessstate": {
"status": "UP"
}
}
}
標記為未就緒的應用程式將報告以下 Readiness 群組資訊
// https://127.0.0.1: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
配置屬性手動啟用探針來在本地試用。 由於探針是 Health Groups,您將獲得許多額外功能,例如配置 HTTP 狀態對應器、安全性、詳細資訊可見性...
您當然可以配置其他健康指標以成為探針的一部分,檢查外部系統的狀態:資料庫、Web API、共用快取。 給定現有的 CacheCheckHealthIndicator
,您可以透過以下方式擴充存活度探針
management.endpoint.health.group.liveness.include=livenessstate,cacheCheck
您應該仔細考慮將外部狀態連結到存活度或就緒度,這就是 Spring Boot 預設情況下不新增任何內容的原因。 每個應用程式和部署都不同,但我們致力於在社群的幫助下提供指導並調整預設值 - 請查看 我們參考文件中的「使用 Kubernetes 探針檢查外部狀態」章節。
結合優雅關閉,此功能將幫助您管理 Kubernetes 中應用程式和容器的生命週期 - 我們已開始提供有關 參考文件中 Kubernetes 部署和配置的指導。
此新功能將在 即將推出的 2.3 里程碑 中提供;我們迫不及待地想聽到您的意見!