Spring boot2.3.0 碰見 Kubernetes

k01.jpg

Spring Boot 是經常使用 Java 微服務框架之一。Spring Cloud 擁有一組豐富的、良好集成的 Java 類庫,用於應對 Java 應用程序堆棧中發生的運行時問題;而 Kubernetes 則提供了豐富的功能集來運行多語言微服務。這些技術彼此互補,爲 Spring Boot 應用程序提供了強大的平臺。html

本文不是講述如何將Spring Boot 程序部署到Kubernetes中,網上已經有大量的部署實踐文章,你們有興趣的能夠查閱。主要講述Spring Boot社區爲了進一步簡化和規範Spring Boot on k8s而作出的一些功能加強。你們徹底能夠將這些新功能實踐到本身項目中。spring

Liveness 和 Readiness

首先咱們簡單介紹一下,kubernetes 中 Liveness 和 Readiness的含義。docker

在Kubernetes中,Liveness 和 Readiness表明了應用程序狀態的各個方面。數據庫

應用程序的Liveness狀態代表內部狀態是否有效,若是Liveness 失敗,則意味着應用程序自己處於故障狀態而且沒法從中恢復,在這種狀況下,最佳的操做方法是從新啓動應用程序例如,若是本地緩存已損壞且沒法修復,則依賴本地緩存的應用程序應使其Liveness檢測失敗。緩存

Readiness狀態告訴應用程序是否準備好接受客戶端請求;若是Readiness狀態還沒有就緒,則Kubernetes不該將流量路由到該實例;若是應用程序正忙於處理任務隊列,則它能夠將本身聲明爲繁忙,直到其執行負載能夠再次管理。安全

那麼接下來咱們看下Spring Boot怎麼支持Liveness 和 Readiness。服務器

Liveness 和 Readiness 成爲 Spring Boot 核心概念

Liveness 和 Readiness概念不只適用於Kubernetes,並且不管部署平臺如何,它們一般都有用。引入了LivenessStateReadinessState,它們是這些概念的不可變表示形式。您能夠隨時從ApplicationAvailability中獲取它們:app

// Available as a component in the application context
ApplicationAvailability availability;

LivenessState livenessState = availabilityProvider.getLivenessState();
ReadinessState readinessState = availabilityProvider.getReadinessState()

經過輪詢,獲取應用程序的狀態是不完整的。只有應用程序知道其生命週期(啓動,關閉),或者能夠提供有關運行時錯誤的上下文(在處理任務時以中斷狀態結束)。Spring Boot應用程序上下文在應用程序的生命週期內發佈這些事件,您的應用程序代碼也應對此作出適配。框架

這就是爲何咱們選擇使用Spring Application Event模型來更改可用性狀態並監聽更新的緣由:ide

/**
 * 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, 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"路徑上。若是須要進一步瞭解「Liveness」和「Readiness」信息,能夠經過"/actuator/health/liveness""/actuator/health/readiness"訪問得到。

在Kubernetes上運行的應用程序將顯示如下運行情況報告:

// http://localhost: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將得到如下信息:

// http://localhost:8080/actuator/health/liveness
// HTTP/1.1 200 OK

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

標記爲未就緒的應用程序將爲「就緒」組報告如下內容:

// http://localhost:8080/actuator/health/readiness
// HTTP/1.1 503 SERVICE UNAVAILABLE

{
  "status": "OUT_OF_SERVICE",
  "components": {
    "readinessProbe": {
      "status": "OUT_OF_SERVICE"
    }
  }
}

HTTP探針僅針對Kubernetes上運行的應用程序進行配置。您能夠經過使用management.health.probes.enabled = true配置屬性手動啓用探針在本地進行嘗試。因爲探針是運行情況組,所以您將得到許多其餘功能例如配置HTTP狀態映射器,安全性,詳細信息可見性…

固然,您能夠將其餘運行情況指示器配置爲探針的一部分,以檢查外部系統的狀態:數據庫,Web API,共享緩存。給定現有的CacheCheckHealthIndicator,您可使用如下方法擴充活動性探針:

management.endpoint.health.group.liveness.include=livenessProbe,cacheCheck

Graceful shutdown

因爲運行在Kubernetes中的Pod存在動態的特性,這就要求咱們的應用程序要作相應的適配。優雅關閉就是其中重要的一個。須要應用程序監聽SIGTERM信號,中止接受新的連接,處理已有的連接等等。此時框架提供了該功能,那麼咱們的業務代碼能夠更加簡單。

下面講了Spring boot 框架是怎麼實現的?

全部四個嵌入式Web服務器(Jetty,Reactor Netty,Tomcat和Undertow)以及基於響應的和基於Servlet的Web應用程序都支持正常關閉。啓用後,應用程序關閉將包括可配置持續時間的寬限期。寬限期內,現有請求將被容許完成,但新請求將被禁止。不容許新請求的確切方式因所使用的Web服務器而異,Jetty,Reactor Netty和Tomcat將中止接受請求Undertow將接受請求,但會當即以服務不可用(503)響應進行響應。

正常關閉是在應用程序關閉處理期間以及銷燬任何Bean以前的第一步,這確保了容許在運行中請求完成時發生的任何處理均可以使用這些Bean。 配置server.shutdown.grace-period 屬性,如如下示例所示:

server.shutdown.grace-period=30s

理論上該值應該和Kubernetes 部署yaml中的terminationGracePeriodSeconds設定的值相等。

固然除了這兩個比較重要的特性,還有Docker鏡像建立這個點,感興趣的能夠去了解一下,這裏再也不闡述。

相關文章
相關標籤/搜索