全鏈路灰度的挑戰、實現思路與解決方案

微服務架構下的灰度發佈挑戰

在傳統的單體應用架構中,灰度發佈相對簡單。只需要在服務的流量入口處進行分流,通過使用 K8s Service 或各種類型的網關即可實現。然而,微服務架構引入了新的複雜性,服務之間的依賴關係錯綜複雜。有時候,某個功能的發佈可能依賴於多個服務,要求灰度流量在整個調用鏈中準確路由到灰度版本的服務。傳統的單個服務流量入口設置分流的做法無法滿足這一需求。爲了解決微服務架構下的灰度發佈問題,全鏈路灰度發佈引入了泳道(Lane)的概念。泳道將灰度視角從單個服務擴展到整個請求的調用鏈上,確保流量能夠精確地在一組指定規則的服務之間流動,就像在預先設置好的泳道中一樣。全鏈路灰度發佈方案專爲微服務架構設計,旨在應對微服務架構下的灰度發佈挑戰。

全鏈路灰度發佈的實現思路

全鏈路灰度發佈的核心在於流量泳道概念的實現,而泳道正如上文所說,是對滿足指定規則的流量定下一個活動範圍,它有以下兩種實現思路:

第一種思路:完整環境隔離

泳道實現的主要難點在於,流量在服務間調用的過程中如何路由到正確的服務版本,但有一個簡單的實現思路可以規避這個問題:複製一個包含所有微服務的完整環境,將需要灰度的服務替換爲灰度版本。然後只需要在兩個環境的流量入口處通過網關對流量進行規則分流,由於兩套環境間存在網絡隔離,灰度環境天然成爲了一個灰度流量泳道。

然而,對於服務數量較多的微服務項目來說,這種方法會浪費資源,因爲在灰度環境中創建非灰度服務會消耗額外的資源。如果要同時灰度多個版本,就需要創建多套完整環境,進一步增加了資源的浪費。

第二種思路:服務流量路由

若能賦予每個服務路由流量的能力,泳道的設置就可以共用正常服務從而充分利用資源,多版本的全鏈路灰度發佈也可以同時在同一個環境中進行。具體而言,需要兩個能力:全鏈路流量路由和全鏈路數據透傳。

全鏈路流量路由

流量路由指的是服務本身發送流量時,可以根據指定規則將其路由到正確的目的地,例如帶有灰度標的流量應該優先發往灰度版本的服務,全鏈路流量路由則要求每個服務都具備這種能力。

全鏈路流量路由目前有兩種主流實現:

  1. 基於 Istio:採用 Istio 這個開源 Service Mesh 組件,通過在每個服務的容器中部署 Envoy 透明代理,攔截服務之間的網絡通信並按指定規則轉發,從而實現了全鏈路流量路由,無需對現有代碼進行修改。
  2. 基於服務發現組件:通過支持爲服務設置元數據的服務註冊中心,如 Nacos,可以標記服務實例的特徵,例如灰度版本。每個服務可以通過註冊中心獲取其他服務實例的版本信息,並通過修改代碼邏輯或 Java Agent 實現流量路由。

全鏈路數據透傳

爲了實現全鏈路灰度發佈,流量路由規則基於流量染色標記,因此需要將染色標記傳遞到整個請求鏈路中,即實現全鏈路數據透傳能力。簡單的數據透傳可以基於原生的 HTTP Header、Query Parameters 等資源來實現,但在複雜的微服務場景下,應該使用 Tracing Baggage 機制。Tracing Baggage 是分佈式鏈路跟蹤工具提供的一種能力,可以攜帶用戶自定義的鍵值對,主流的跟蹤工具如 Skywalking 和 OpenTelemetry 都支持該功能。使用分佈式鏈路追蹤框架可以方便地進行日誌記錄和問題排查,特別適用於灰度發佈場景下的需求。

企業發佈現狀的痛點分析

目前企業在選擇和實施發佈策略時面臨以下困境:

1. 從傳統部署模式轉變爲雲原生模式後,缺乏相關能力的人才進行技術架構改造,使得企業在發佈策略方面難以入手。

2. 已經找到適合產品現狀的發佈策略,但缺乏自動化平臺或工具的支持,仍然依賴手工逐步執行,可能導致流程遺漏或人工操作失誤,造成生產事故。

3. 僅實現了服務級別的灰度能力,逐個發佈服務耗時長,導致發佈過程緩慢,驗證效果不佳。

針對以上問題,ZadigX 提供了灰度發佈的解決方案,幫助企業應對這些痛點。

全鏈路灰度發佈的實現方案

主要有 Istio、JavaAgent 等主流方案,基於流量路由的能力,ZadigX 提供了兩套通用方案:

阿里雲 MSE + ZadigX

阿里雲 MSE 爲 Java 應用提供了便捷實現全鏈路灰度的能力。MSE 微服務引擎是基於 Java Agent 實現的無侵入式企業生產級服務治理產品,不需要修改任何一行業務代碼,即可擁有不限於全鏈路灰度的治理能力,並且支持近 5 年內所有的 Spring Boot、Spring Cloud 和 Dubbo。

使用 MSE 進行灰度發佈的過程中,ZadigX 可以便捷得創建灰度環境和灰度 K8S 資源、結合發佈工作流編排能力,自動爲 K8S 資源設置 MSE 所需的資源標記,集成了 MSE API 降低重複工作量。

Istio + Distributed Tracing + ZadigX

Istio 可以無侵入地實現全鏈路流量路由能力,同時還可以設置基於比例、權重、HTTP Header 等條件的流量路由,但全鏈路數據透傳需要服務本身實現,爲此需要服務接入支持 Baggage 的分佈式鏈路追蹤框架,若還沒接入則會涉及到一定的改造成本。

ZadigX 可以根據指定的灰度任務與灰度標記規則,結合發佈工作流編排能力與環境的監測管理能力,自動創建 Istio VirtualService 與 DistinationRule 資源以實現相應的泳道,達到了讓開發者輕鬆進行全鏈路灰度發佈的效果。

作者:ZadigX

點擊立即免費試用雲產品 開啓雲上實踐之旅!

原文鏈接

本文爲阿里雲原創內容,未經允許不得轉載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章