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 提供了 健康組支援,允許開發人員選擇一組健康指示器並將它們分組為單一的、相關的健康狀態。

即使有了這個新功能,我們也發現我們可以為 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 將使用健康支援來配置 存活和就緒 HTTP 探針

Actuator 將從 ApplicationAvailability 收集“存活”和“就緒”資訊,並在專用的健康指示器中使用這些資訊: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"
  ]
}

Kubernetes 在呼叫存活組時將獲得以下資訊。

// https://:8080/actuator/health/liveness
// HTTP/1.1 200 OK

{
  "status": "UP",
  "components": {
    "livenessstate": {
      "status": "UP"
    }
  }
}

標記為未就緒的應用程式將為就緒組報告以下內容。

// 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,您可以透過以下方式增強存活探針:

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 社群所有即將舉行的活動。

檢視所有