全部產品
Search
文件中心

Enterprise Distributed Application Service:無損下線Spring Cloud應用

更新時間:Jun 30, 2024

對於任何一個線上應用,重啟、下線等操作不可避免,無損下線能夠實現服務消費者無感知,保持業務連續無損。您無需對應用進行任何配置、也無需在EDAS控制台進行任何操作,EDAS預設支援Spring Cloud應用無損下線。

為什麼需要無損下線

無損下線是為了保證從應用停止到恢複服務期間不影響正常啟動並執行消費者的業務請求。理想條件下,在整個服務沒有請求時再進行更新是安全可靠的。但實際情況下,無法保證在服務下線的同時沒有任何調用請求。

傳統的解決方式是通過將應用程式更新流程劃分為手工摘除流量、停應用、更新重啟三個步驟,由人工操作實現用戶端對更新無感知。

如果在容器或架構層級提供某種自動化機制,自動進行摘除流量並確保處理完已到達的請求,不僅能保證業務不受更新影響,還可以極大地提升更新應用時的營運效率。該機制就是無損下線。

EDAS無損下線的優勢

開源Spring Cloud可以通過shutdownHook、Spring Boot Actuator和Ribbon實現,不僅有一定的開發工作量,而且部分註冊中心會導致短暫的流量損失。

EDAS將無損下線的流程整合在發布流程中,對應用進行停止、部署、復原、縮容、重設等操作時,無損下線會自動執行。相對於開源的方案,EDAS無損下線具有以下優勢:

分類

開源Spring Cloud

EDAS

版本

使用ServiceRegistryEndpoint,需要依賴Actuator組件,且需要升級到適配的版本。

無需任何操作,無侵入地支援Spring Cloud Dalston及以上版本。

註冊中心和流量損失

依賴註冊中心,有些註冊中心會導致流量損失。

  • ZooKeeper不存在流量損失。

  • Eureka存在3s流量損失。

  • Nacos存在用戶端緩衝,會造成最長10s的流量損失。

無需依賴任何註冊中心,對於任何註冊均不存在流量損失。

情境

  • ECS情境需結合變更詳情。

  • K8s情境可以配合prestop介面,但是prestop介面只能配置一個動作。

ECS和K8s全部覆蓋,且不影響對應用的任何操作與配置。

用戶端緩衝

需要權衡利弊配置合理的Ribbon緩衝的重新整理時間,過長會導致下線有流量損失,過短會影響效能。

增強Ribbon下線重新整理機制,通過反應式回應程式式主動重新整理Ribbon緩衝。您無需關心緩衝重新整理。

如何驗證無損下線是否生效

您可以直接根據實際業務驗證應用的無損下線是否已經生效。另外,EDAS也提供了兩個應用Demo,您可以使用這兩個Demo在Container ServiceK8s叢集中驗證EDAS的無損下線。

無損下線驗證流程如下:

  1. 下載應用Demo(ProviderConsumer)。

  2. 將應用Demo部署到Container ServiceK8s叢集。

    其中,Provider的執行個體個數為2,Consumer的執行個體個數為1。部署的詳細操作步驟,請參見建立和部署應用概述(K8s)

    部署應用

  3. 查看應用調用現狀。

    1. 登入部署Consumer的Pod,執行以下命令不停地訪問服務端的服務。

      #!/usr/bin/env bash
      while true
      do
          echo `curl -s -XGET http://localhost:18091/user/rest`
      done
    2. 查看調用請求的響應。

      正常調用結果

      從響應中可以看到,Consumer隨機訪問Provider的兩個執行個體(IP為172.20.0.221和172.20.0.223)。

      重要

      調用請求的響應視窗不要關閉,後續仍然會用到。

  4. 將Provider的執行個體縮容到1,類比執行個體重啟的情境。詳情請參見應用生命週期管理(K8s)

  5. 再次查看調用請求的響應結果,驗證無損下線。

    調用請求響應-無損下線

    一直觀察用戶端請求情況,可以看到無損下線的情況,同時觀察用戶端日誌,不存在任何相關問題,用戶端完全無感知。

    從響應中可以看到,Consumer會固定訪問Provider剩餘的一個執行個體(IP為172.20.0.221),而不會發生調用異常,避免影響Consumer。