全部產品
Search
文件中心

Microservices Engine:MSE Nacos自訂標籤灰階

更新時間:Nov 19, 2024

為瞭解決基於IP灰階的局限性,MSE Nacos對灰階發布進行了功能更新,支援自訂標籤灰階的能力,結合原先的IP灰階,可以給業務提供更加靈活更加易用的灰階發布能力,為業務穩定性保駕護航。

背景介紹

配置中心被廣泛使用

配置中心是Nacos的核心功能之一,允許線上修改應用配置而無需重啟,降低了軟體構建及部署的成本,提升了效率,為業務發展提速。

image

上圖展示了Nacos在微服務、高可用、前端、資料庫等多個領域的廣泛應用,配置中心在這些情境中扮演關鍵角色,如流量管理、路由設定、應急響應、業務開關與資料庫配置等,確保這些配置的準確性對於線上業務的穩定運行至關重要。

配置變更的風險

動態配置變更能顯著提升軟體迭代效率,但也引入了穩定性風險,對線上配置的誤操作,可能導致線上程式執行出錯,進而對業務產生影響。若變更流程不完善,動態配置變更從某種角度上來說會擴大線上穩定性問題的敞口,業界由於配置變更導致的故障時有發生,因此對於配置的變更管控是非常必要的。

出於穩定性考慮,變更需具有可灰階,可監控,可復原三個基本要求:

  • 可灰階:要求任何變更都可以控制其生效範圍,在變更過程中可逐步擴大生效範圍。

  • 可監控:要求對業務的各項指標都有可視化展示,可正確清晰地反應業務的運行狀態。

  • 可復原:在變更期間,如觀測到業務異常,可以快速使業務回退至變更前的狀態。

灰階發布是配置中心用於控制配置變更風險的一個非常重要且基礎的功能。

一個規範的配置變更流程如下圖所示:

先選取一部分低風險應用伺服器作為第一個版本的灰階,下發新配置,觀察伺服器的系統及業務指標,確認業務正常後,逐步擴大灰階範圍,直至發布正式版本完成整體的配置變更流程,如果期間業務出現異常,選擇終止灰階,先前已灰階的伺服器也同時復原至變更前的配置,以快速恢複業務。

基於IP灰階的局限

在之前的版本中,Nacos 提供了基於 IP 位址的灰階發布方式,使用者在發布正式版本配置前,可以選擇一些 IP 位址下發新配置進行驗證,確認業務正常,觀察期過後,選擇全量發布。

image

對於小型應用,基於IP的灰階發布已足夠。但對中大型應用而言,一個配置可能被大量應用節點訂閱,這些節點可能來自不同業務,對線上業務的影響範圍也不同。當節點IP數量較大時,易用性大大降低。IP地址由底層基礎網路設施決定,難以直接關聯具體業務。擴大灰階範圍時,需手動篩選符合特定業務需求的IP列表。此外,在K8s容器化環境中,節點重啟後IP變化可能導致灰階策略失效。

自訂標籤灰階

自訂標籤灰階允許應用根據實際情境給不同的節點設定不同的標籤,如應用,機房,環境等標籤,例如在阿里集團內部,同一個應用在不同開發分支下,可以給各開發分支部署的節點打上相應的標籤,藉助標籤灰階的能力實現不同的專案環境下發不同的配置內容。以下我們將介紹應用如何接入自訂標籤灰階的能力。

image.png

版本要求

  • 為了實現自訂應用標籤灰階功能,您需要確保開源Nacos-Client的版本更新至2.3.2或更高版本。

  • 使用通過環境變數注入標籤的能力,需升級Nacos-Client至2.4.2及以上。

  • 對於MSE Nacos,其版本應升級至2.2.3.3或以上,以支援應用標籤灰階特性。

單標籤灰階

對於一些中小型應用來說,使用單標籤灰階就可以滿足自訂灰階的需求。

用戶端設定應用標籤

在您完成用戶端和服務端版本升級至所需版本後,接下來可以為您的應用添加自訂標籤以實現灰階發布。

如何設定應用標籤

應用標籤採用索引值對(key-value)形式,以下是設定應用標籤的三種常見方式:

  1. 使用Properties屬性設定標籤:nacos.config.gray.label是Nacos內建的預設配置灰階標籤,您可以通過設定nacos.config.gray.label={value}來給應用打標。

    Properties properties = new Properties();
    properties.put(PropertyKeyConst.SERVER_ADDR, "{server addr}");
    // 添加其他配置項...
    properties.put("nacos.config.gray.label", "yourgrayname");
    ConfigFactory.createConfigService(properties);
  2. 通過JVM參數設定標籤:在啟動應用的命令列中,添加-Dnacos.config.gray.label={value}參數。

    java -Dnacos.config.gray.label=yourgrayname -jar your-app.jar
  3. 通過環境變數設定標籤:在環境變數中設定nacos_config_gray_label為{value}

    export nacos_config_gray_label=yourgrayname
設定方式的作用範圍與優先順序
  • Properties屬性:只對當前ConfigService對象生效,作用範圍最小。

  • JVM參數:對當前進程內的所有ConfigService生效。

  • 環境變數:對當前節點上的所有ConfigService生效。

  • 優先順序:當三種方式設定的標籤key存在重複時,讀取的優先順序從高到低依次為:properties > JVM參數 > 環境變數。

服務端發布標籤灰階

查看監聽者標籤

在用戶端設定完應用標籤,並重啟應用後,可以通過MSE Nacos控制台查看配置的監聽查詢列表,查看每個監聽者攜帶的標籤。

image

發布灰階標籤配置

在 MSE Nacos控制台配置列表頁面,單擊編輯配置,選擇基於標籤灰階發布,設定灰階版本名稱,選擇應用節點的標籤索引值對,可以看到預期匹配到的應用節點數量以及節點列表,在介面右側配置內容框中編輯配置內容,單擊發布灰階完成配置發布。

image

發布灰階標籤版本後,開啟配置詳情頁,單擊配置內容頁簽,可以看到正式Beta兩個版本。

image

切換至監聽查詢頁簽,可以看到對應的業務節點當前的匹配的版本, 展示的版本為Beta({灰階版本名稱}), Md5為對應版本的Md5,推送狀態為推送成功。

image

此外,在推送軌跡頁簽也可以看到標籤發布以及用戶端查詢灰階版本的軌跡,在節點的配置推送軌跡詳情中可以看到具體推送的配置版本。

image

在進行第一批灰階觀察後,可以通過擴大編輯標籤的值範圍來逐步擴大灰階,直到進行全量發布,單擊全量發布後,將停止對應的灰階版本。如果在灰階過程中發現業務異常,可以單擊停止灰階進行一鍵自動復原。

以下我們簡單介紹幾種常見的逐步擴大灰階的用法:

方法一:基於應用標籤的灰階發布

  1. 為不同應用設定各自的標籤:給應用A的所有伺服器分配nacos.config.gray.label=A的標籤;給應用B的所有伺服器分配nacos.config.gray.label=B

  2. 初步灰階部署:首先,僅針對帶有nacos.config.gray.label=A標籤的應用A進行新版本的灰階測試。

  3. 擴充灰階範圍:當確認新版本在應用A上運行良好後,可以通過修改灰階規則(如改為nacos.config.gray.label=A,B),將應用B也納入到灰階測試中。

方法二:基於環境分組的灰階發布

  1. 將生產環境中的機器劃分為多個小組,並分別為這些小組指定不同的標籤值,例如nacos.config.gray.label=gray1,nacos.config.gray.label=gray2,nacos.config.gray.label=gray3等。同時,保持未參與灰階測試的正式環境使用nacos.config.gray.label=online作為其標籤。

  2. 通過調整設定檔中的標籤值來控制哪些特定環境或分組能夠接收到最新的灰階版本更新。

  3. 在每個階段結束後,根據實際表現逐漸增加更多具有相同標籤屬性的伺服器進入灰階測試流程,直到最終覆蓋整個目標群體。

灰階發布的後續步驟

  • 完成每次小規模灰階上線之後,請密切監控相關業務指標。

  • 如果一切正常,在經過一段觀察期後,您可以進一步擴大灰階測試的影響範圍,直至包含所有預期的目標節點。

  • 當所有的灰階測試均表明新版軟體穩定可靠時,則可執行全量發佈動作,使當前的灰階版本成為正式版本。成功發布正式版本後,當前的灰階版本將會終止。

這種方法允許開發人員以一種更加謹慎且可控的方式推出新的功能或改進,從而減少潛在風險並提高使用者體驗。

多標籤灰階

在處理較為複雜的中大型應用時,單一標籤可能難以滿足業務需求的多樣性。MSE提供了靈活的標籤管理機制,不對標籤鍵(key)做嚴格限制,允許使用者根據自身業務特性自訂標籤鍵,並支援為同一應用配置多個標籤,以實現更精細化的服務管理和灰階發布策略。接下來,我們將詳細介紹如何為您的業務節點添加和管理多個標籤索引值對,協助您更好地利用這一功能來應對複雜的應用情境。

用戶端設定應用標籤

和設定單個標籤類似,用戶端可以在properties及JVM參數,環境變數中設定多個標籤。

  1. 使用Properties屬性設定標籤:nacos.app.conn.labels=k1=v1,k2=v2,k3=v3

    //1.properties形式傳入
    Properties properties = new Properties();
    properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
    properties.put("project.name", "your app name");
    properties.put("nacos.app.conn.labels","app=demo,site=hangzhou-c,otherkey=othervaue");
  2. 通過JVM參數設定標籤:nacos.app.conn.labels=k1=v1,k2=v2,k3=v3

    //2.JVM參數設定
    設定啟動參數-Dnacos.app.conn.labels=app=demo,site=hangzhou-c,otherkey=othervaue
  3. 通過環境變數設定標籤:nacos_app_conn_labels=k1=v1,k2=v2,k3=v3

    //3.env環境變數指定
    設定環境變數 nacos_app_conn_labels=app=demo,site=hangzhou-c,otherkey=othervaue
    
    NacosConfigService configService = new NacosConfigService(properties);
    
    String dataId = "gray_test_dataid";
    String group = "test-group";
            
    configService.addListener(dataId, group, new Listener() {
            @Override
            public Executor getExecutor() {
                return null;
            }
                
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("receiveConfig:" + configInfo);
            }
    });
  4. 除了通過上述三種參數設定之外,對於較為複雜的標籤讀取邏輯,還可以選擇實現SPI介面來配置標籤。Nacos-Client 提供了一個定義自訂應用標籤的 SPI 機制。您需要實現 com.alibaba.nacos.common.labels.LabelsCollector 介面,並將其實作類別通過在 META-INF/services/ 目錄下發布為服務提供者(Service Provider Interface, SPI)。這樣做的好處是能夠更加靈活地控制和擴充標籤的收集與處理邏輯,以適應不同應用情境下的需求。

    自訂配置標籤程式碼範例

    package your.demo.test;
    
    import com.alibaba.nacos.common.labels.LabelsCollector;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;
    
    /**
     * TestLabelsCollector.
     *
     * @author yourname
     */
    public class TestLabelsCollector implements LabelsCollector {
        
        @Override
        public String getName() {
            return "testlables";
        }
        
        @Override
        public Map<String, String> collectLabels(Properties properties) {
            Map<String, String> labels = new HashMap<>();
            labels.put("test", "implements your lables logic");
            return labels;
        }
    
      
        @Override
        public int getOrder() {
            return 1;
        }
    }

注意事項:

為了確保應用程式在使用標籤進行灰階發布時能夠平穩運行,Nacos對標籤的索引值做了一些約束:

  • 允許字元:標籤的鍵(key)與值(value)部分僅支援使用英文大小寫字母、數字、底線_、虛線-以及點.。任何包含非上述字元的標籤將被系統忽略。

  • 格式要求:當通過nacos.app.conn.labels參數指定多個索引值對時,請確保它們按照k1=v1,k2=v2,k3=v3的格式排列。例如,若輸入為k1=v1,k2,則只有k1=v1會被識別,而k2因缺少對應的值而被忽略。

  • 數量限制:對於每個應用節點而言,最多可以配置10個標籤索引值對。一旦超出此數目,系統將隨機移除多餘的標籤。因此,在規劃應用所需標籤時,請考慮這一上限因素。

此外,在設定灰階發布的匹配規則方面:

目前的版本支援基於多個不同的標籤值來篩選合格節點列表,但為了降低功能的複雜度,暫不支援在同一灰階規則內同時指定多個標籤鍵進行複合匹配。即,無法直接利用類似k1=v1&&k2=v2或者k1=v1||k2=v2這樣的邏輯運算式來精確控制或擴充灰階測試範圍。

多灰階版本並行

適用情境

MSE Nacos 支援在一個配置下發布多個灰階版本,支援根據不同條件靈活地為不同的服務節點提供定製化的配置資訊。例如,您可以為滿足 k1=v1 條件的節點下發 graycontent1 的配置內容,同時為滿足 k1=v2 條件的節點分配 graycontent2 的配置內容。

操作步驟

編輯配置的面板中,單擊“+”建立新的灰階版本。

重要

MSE對一個配置所發布的最大灰階版本數量有一定限制,預設最大支援5個標籤灰階的版本,超過上限時,灰階發布將被攔截。

image.png

成功建立多個灰階版本後,您可以在編輯配置面板中看到多個灰階版本以頁簽的形式展示。

說明

各個灰階版本的展示順序是根據其優先順序來排列的,您可以直觀地瞭解到每個版本的優先順序。如果需要調整某個灰階版本的優先順序,可以在編輯頁面修改相應的優先順序數值,並單擊發布以生效更改。

image.png

當存在多個並行的灰階版本時,選擇其中一個進行全量發布,則該灰階版本的配置將被設為正式版本。一旦正式版本成功發布,所選的那個灰階版本會自動終止;但請注意,其他仍在運行中的灰階版本不會受到影響,這些版本覆蓋範圍內的節點將繼續接收各自對應的灰階配置內容。

多灰階版本優先順序

當您的配置有多個灰階版本時,包括正式版本、基於IP的灰階版本以及基於標籤的灰階版本(其中基於標籤的灰階版本可以有多個),灰階的標籤索引值對可能匹配到完全不重合的節點列表,也可能匹配到同一個應用節點,Nacos服務端會根據基於IP的灰階版本> 基於標籤的灰階版本> 正式版本優先順序規則來決定哪個版本將被應用到特定節點上。以下是優先順序規則說明:

image.png

  1. 基於IP的灰階版本:如果一個節點同時滿足基於IP的灰階條件和其他類型的灰階條件,則該節點將使用基於IP的灰階版本。

  2. 基於標籤的灰階版本:對於不適用基於IP灰階規則但符合多個基於標籤灰階規則的情況,Nacos會首先查看每個標籤灰階版本定義中的priority欄位值。priority值越大,優先順序越高,priority值相同時,按灰階名稱的字元順序匹配,建議將不同的規則設定為不同的優先順序。

  3. 正式版本:只有在沒有任何灰階版本適用於當前節點時,才會回退至使用正式版本。

說明

建議:為了確保更精確地控制灰階發布的流程,請盡量為不同目的設定不同的priority值,併合理規劃您的灰階策略。這樣可以協助您更加靈活有效地管理配置變更對系統的影響。

相關文檔

關於MSE 配置灰階發布的操作步驟,您可參考配置灰階發布