對於任何一個線上應用,如何在服務更新部署過程中保證用戶端無感知是開發人員必須要解決的問題,即從應用停止到重啟恢複服務這個階段不能影響正常的業務請求。在應用執行部署、停止、復原、縮容、重設時,需要通過無損下線的配置來保證應用正常關閉。
為什麼需要無損下線
無損下線是為了保證從應用停止到恢複服務期間不影響正常啟動並執行消費者的業務請求。理想條件下,在整個服務沒有請求時再進行更新是安全可靠的。但實際情況下,無法保證在服務下線的同時沒有任何調用請求。
傳統的解決方式是通過將應用程式更新流程劃分為手工摘除流量、停應用、更新重啟三個步驟,由人工操作實現用戶端對更新無感知。
如果在容器或架構層級提供某種自動化機制,自動進行摘除流量並確保處理完已到達的請求,不僅能保證業務不受更新影響,還可以極大地提升更新應用時的營運效率。該機制就是無損下線。
EDAS無損下線的優勢
開源Dubbo可以通過shutdownHook和QoS實現,不僅有一定的開發工作量,而且對Dubbo有版本要求,還有一些遺留問題,最終影響正常使用。
EDAS將無損下線的流程整合在發布流程中,對ECS叢集或K8s叢集中的應用進行停止、部署、復原、縮容、重設等操作時,無損下線會自動執行。您無需對應用或在EDAS控制台進行任何關於無損下線的操作,而且沒有流量損失。
如何驗證無損下線是否生效
您可以直接根據實際業務驗證應用的無損下線是否已經生效。另外,EDAS也提供了兩個應用Demo,您可以使用這兩個Demo在Container ServiceK8s叢集中驗證EDAS的無損下線。
無損下線驗證流程如下:
將應用Demo部署到Container ServiceK8s叢集。
其中,Provider的執行個體個數為2,Consumer的執行個體個數為1。部署的詳細操作步驟,請參見建立和部署應用概述(K8s)。
查看應用調用現狀。
登入部署Consumer的Pod,執行以下命令不停地訪問服務端的服務。
#!/usr/bin/env bash while true do echo `curl -s -XGET http://localhost:18091/user/rest` done
查看調用請求的響應。
從響應中可以看到,Consumer隨機訪問Provider的兩個執行個體(IP為172.20.0.221和172.20.0.223)。
重要調用請求的響應視窗不要關閉,後續仍然會用到。
將Provider的執行個體縮容到1,類比執行個體重啟的情境。詳情請參見應用生命週期管理(K8s)。
再次查看調用請求的響應結果,驗證無損下線。
一直觀察用戶端請求情況,可以看到無損下線的情況,同時觀察用戶端日誌,不存在任何相關問題,用戶端完全無感知。
從響應中可以看到,Consumer會固定訪問Provider剩餘的一個執行個體(IP為172.20.0.221),而不會發生調用異常,避免影響Consumer。