對于任何一個線上應用,如何在服務更新部署過程中保證客戶端無感知是開發者必須要解決的問題,即從應用停止到重啟恢復服務這個階段不能影響正常的業務請求。在應用執行部署、停止、回滾、縮容、重置時,需要通過無損下線的配置來保證應用正常關閉。
為什么需要無損下線
無損下線是為了保證從應用停止到恢復服務期間不影響正常運行的消費者的業務請求。理想條件下,在整個服務沒有請求時再進行更新是安全可靠的。但實際情況下,無法保證在服務下線的同時沒有任何調用請求。
傳統的解決方式是通過將應用更新流程劃分為手工摘除流量、停應用、更新重啟三個步驟,由人工操作實現客戶端對更新無感知。
如果在容器或框架級別提供某種自動化機制,自動進行摘除流量并確保處理完已到達的請求,不僅能保證業務不受更新影響,還可以極大地提升更新應用時的運維效率。該機制就是無損下線。
EDAS無損下線的優勢
開源Dubbo可以通過shutdownHook和QoS實現,不僅有一定的開發工作量,而且對Dubbo有版本要求,還有一些遺留問題,最終影響正常使用。
EDAS將無損下線的流程整合在發布流程中,對ECS集群或K8s集群中的應用進行停止、部署、回滾、縮容、重置等操作時,無損下線會自動執行。您無需對應用或在EDAS控制臺進行任何關于無損下線的操作,而且沒有流量損失。
如何驗證無損下線是否生效
您可以直接根據實際業務驗證應用的無損下線是否已經生效。另外,EDAS也提供了兩個應用Demo,您可以使用這兩個Demo在容器服務K8s集群中驗證EDAS的無損下線。
無損下線驗證流程如下:
將應用Demo部署到容器服務K8s集群。
其中,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。