使用 Spring Boot 實現 Liveness 和 Readiness 探針

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

更新: 本博文已根據 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 和 Readiness 這兩個 Kubernetes 概念代表了應用程式狀態的不同方面。

應用程式的 Liveness 狀態表示其內部狀態是否有效。如果 Liveness 損壞,意味著應用程式本身處於失敗狀態且無法從中恢復。在這種情況下,最好的辦法是重啟應用程式例項。例如,依賴本地快取的應用程式如果在本地快取損壞且無法修復時,應該使其 Liveness 狀態失敗。

Readiness 狀態表示應用程式是否已準備好接受客戶端請求。如果 Readiness 狀態未就緒,Kubernetes 不應將流量路由到該例項。如果應用程式正忙於處理任務佇列,則可以宣告自己處於忙碌狀態,直到其負載再次可管理。

將 Liveness 和 Readiness 提升為核心 Spring Boot 概念

這些 Liveness 和 Readiness 概念不僅適用於 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 支援來配置Liveness 和 Readiness HTTP 探針

Actuator 將從 ApplicationAvailability 中收集 “Liveness” 和 “Readiness” 資訊,並在專用的健康指標中使用這些資訊:LivenessStateHealthIndicatorReadinessStateHealthIndicator。這些指標將顯示在全域性健康端點("/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 探針檢查外部狀態”的部分

在 Spring Boot 2.3.0.RC1 中可用

結合優雅停機功能,此特性將有助於你管理 Kubernetes 中應用程式和容器的生命週期——我們已經在參考文件中開始提供關於 Kubernetes 部署和配置的指導

這個新功能將在我們即將釋出的 2.3 里程碑版本中提供;我們期待收到你的反饋!

訂閱 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

保持領先

VMware 提供培訓和認證,助你快速進步。

瞭解更多

獲取支援

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

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部