Spring Boot 的存活度和就緒度探針

工程 | Brian Clozel | 2020年3月25日 | ...

更新:這篇部落格文章已針對 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 不應將流量路由到此實例。如果應用程式太忙於處理任務佇列,則它可以宣告自己處於忙碌狀態,直到其負載再次變得可管理。

將存活度和就緒度提升為核心 Spring Boot 概念

這些存活度和就緒度概念不僅適用於 Kubernetes,而且通常很有用,無論部署平台為何。我們正在引入 LivenessStateReadinessState,它們是這些概念的不可變表示形式。您可以隨時從 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 相關的探針。

透過 Spring Boot Actuator 公開 Kubernetes 探針

您可能會對一個非常常見的用例感興趣:在 Kubernetes 上部署 web 應用程式並配置 HTTP 探針。 將 Spring Boot Actuator 依賴項新增至您的應用程式是唯一的要求! Actuator 將使用 Health 支援來配置 存活度和就緒度 HTTP 探針

Actuator 將從 ApplicationAvailability 收集「存活度」和「就緒度」資訊,並在專用的健康指標中使用該資訊:LivenessStateHealthIndicatorReadinessStateHealthIndicator。 這些指標將顯示在全域健康端點("/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 探針檢查外部狀態」章節

在 Spring Boot 2.3.0.RC1 中可用

結合優雅關閉,此功能將幫助您管理 Kubernetes 中應用程式和容器的生命週期 - 我們已開始提供有關 參考文件中 Kubernetes 部署和配置的指導

此新功能將在 即將推出的 2.3 里程碑 中提供;我們迫不及待地想聽到您的意見!

取得 Spring 新聞通訊

與 Spring 新聞通訊保持聯繫

訂閱

取得領先

VMware 提供培訓和認證,以加速您的進度。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將舉辦的活動

查看 Spring 社群中所有即將舉辦的活動。

查看全部