無損下線Spring Cloud應(yīng)用
對于任何一個線上應(yīng)用,重啟、下線等操作不可避免,無損下線能夠?qū)崿F(xiàn)服務(wù)消費者無感知,保持業(yè)務(wù)連續(xù)無損。您無需對應(yīng)用進行任何配置、也無需在EDAS控制臺進行任何操作,EDAS默認(rèn)支持Spring Cloud應(yīng)用無損下線。
為什么需要無損下線
無損下線是為了保證從應(yīng)用停止到恢復(fù)服務(wù)期間不影響正常運行的消費者的業(yè)務(wù)請求。理想條件下,在整個服務(wù)沒有請求時再進行更新是安全可靠的。但實際情況下,無法保證在服務(wù)下線的同時沒有任何調(diào)用請求。
傳統(tǒng)的解決方式是通過將應(yīng)用更新流程劃分為手工摘除流量、停應(yīng)用、更新重啟三個步驟,由人工操作實現(xiàn)客戶端對更新無感知。
如果在容器或框架級別提供某種自動化機制,自動進行摘除流量并確保處理完已到達(dá)的請求,不僅能保證業(yè)務(wù)不受更新影響,還可以極大地提升更新應(yīng)用時的運維效率。該機制就是無損下線。
EDAS無損下線的優(yōu)勢
開源Spring Cloud可以通過shutdownHook、Spring Boot Actuator和Ribbon實現(xiàn),不僅有一定的開發(fā)工作量,而且部分注冊中心會導(dǎo)致短暫的流量損失。
EDAS將無損下線的流程整合在發(fā)布流程中,對應(yīng)用進行停止、部署、回滾、縮容、重置等操作時,無損下線會自動執(zhí)行。相對于開源的方案,EDAS無損下線具有以下優(yōu)勢:
分類 | 開源Spring Cloud | EDAS |
版本 | 使用ServiceRegistryEndpoint,需要依賴Actuator組件,且需要升級到適配的版本。 | 無需任何操作,無侵入地支持Spring Cloud Dalston及以上版本。 |
注冊中心和流量損失 | 依賴注冊中心,有些注冊中心會導(dǎo)致流量損失。
| 無需依賴任何注冊中心,對于任何注冊均不存在流量損失。 |
場景 |
| ECS和K8s全部覆蓋,且不影響對應(yīng)用的任何操作與配置。 |
客戶端緩存 | 需要權(quán)衡利弊配置合理的Ribbon緩存的刷新時間,過長會導(dǎo)致下線有流量損失,過短會影響性能。 | 增強Ribbon下線刷新機制,通過反應(yīng)式響應(yīng)方式主動刷新Ribbon緩存。您無需關(guān)心緩存刷新。 |
如何驗證無損下線是否生效
您可以直接根據(jù)實際業(yè)務(wù)驗證應(yīng)用的無損下線是否已經(jīng)生效。另外,EDAS也提供了兩個應(yīng)用Demo,您可以使用這兩個Demo在容器服務(wù)K8s集群中驗證EDAS的無損下線。
無損下線驗證流程如下:
將應(yīng)用Demo部署到容器服務(wù)K8s集群。
其中,Provider的實例個數(shù)為2,Consumer的實例個數(shù)為1。部署的詳細(xì)操作步驟,請參見創(chuàng)建和部署應(yīng)用概述(K8s)。
查看應(yīng)用調(diào)用現(xiàn)狀。
登錄部署Consumer的Pod,執(zhí)行以下命令不停地訪問服務(wù)端的服務(wù)。
#!/usr/bin/env bash while true do echo `curl -s -XGET http://localhost:18091/user/rest` done
查看調(diào)用請求的響應(yīng)。
從響應(yīng)中可以看到,Consumer隨機訪問Provider的兩個實例(IP為172.20.0.221和172.20.0.223)。
重要調(diào)用請求的響應(yīng)窗口不要關(guān)閉,后續(xù)仍然會用到。
將Provider的實例縮容到1,模擬實例重啟的場景。詳情請參見應(yīng)用生命周期管理(K8s)。
再次查看調(diào)用請求的響應(yīng)結(jié)果,驗證無損下線。
一直觀察客戶端請求情況,可以看到無損下線的情況,同時觀察客戶端日志,不存在任何相關(guān)問題,客戶端完全無感知。
從響應(yīng)中可以看到,Consumer會固定訪問Provider剩余的一個實例(IP為172.20.0.221),而不會發(fā)生調(diào)用異常,避免影響Consumer。