MSE註冊配置中心支援灰階發布,即在配置正式發布前先進行小部分的發布驗證,降低配置推送的風險。本文介紹如何在MSE上為Nacos執行個體配置灰階發布。
前提條件
用戶端Nacos Client建議使用2.x版本。
背景資訊
在使用配置中心對叢集配置進行集中管理時,如果對某個配置進行了修改,一般情況下新的配置將會覆蓋舊的配置,同時會全量地推送到叢集中。這種情況下,由於是全量推送,一旦配置出錯,可能會導致整個叢集都無法運行,風險極大。
因此,在需要對配置進行編輯時,推薦先進行灰階發布,讓叢集中一部分機器先收到新版本的配置內容,預先進行功能的驗證,如果驗證通過,再逐步擴大灰階,直至全量正式發布,降低配置變更風險。
在配置變更過程中,需要選擇灰階節點來進行灰階發布。目前,MSE Nacos支援兩種灰階發布的方式:基於IP地址的灰階和基於標籤的灰階。
基於IP地址灰階
基於IP的灰階發布是一種基礎的灰階方式,可以通過選擇IP地址清單來確定需要灰階的機器,在一些小型業務系統中,這種方式可以滿足灰階的需求,能夠大大降低配置推送的風險,減少因配置出錯導致的故障。
建立Beta配置
登入MSE註冊配置中心控制台,並在頂部功能表列選擇地區。
在左側導覽列,選擇注册配置中心 > 实例列表。
在实例列表頁面,單擊目標執行個體名稱。
在左側導覽列,選擇配置管理 > 配置列表。
在目標配置的操作列單擊编辑。在编辑配置面板,发布方式選擇基於IP灰階發布。

單擊應用節點 IP輸入框,在IP地址清單中選擇待灰階推送的IP地址。
您也可以選擇手動輸入IP地址,手動輸入支援IP地址補全。
說明IP地址指訂閱了該配置的機器IP,多個IP用英文逗號(,)分隔。
修改完配置後,單擊发布灰度。在配置内容对比對話方塊中確認當前正式版本內容和本次發布內容,然後單擊发布。
查看Beta配置
登入MSE註冊配置中心控制台,並在頂部功能表列選擇地區。
在左側導覽列,選擇注册配置中心 > 实例列表。
在实例列表頁面,單擊目標執行個體名稱。
在左側導覽列,選擇配置管理 > 配置列表。
在正在Beta發布的目標配置的操作列單擊编辑。
在编辑配置面板,單擊Beta(IP)頁簽,查看Beta(IP)發布資訊。

其他動作
停止灰階:在编辑配置的Beta(IP)頁簽中,單擊停止灰度,即可取消Beta發布。
全量發布:在编辑配置的Beta(IP)頁簽中,單擊全量发布,在彈出的配置内容对比對話方塊中確認配置資訊,單擊全量发布,Beta發布的內容將會發布為正式版本,當前Beta版本也將終止。
基於IP地址的灰階存在以下問題:
在Nacos1.x版本的用戶端中,因為經過了一層SLB的中轉,服務端無法精準擷取用戶端的IP地址。
基於K8s的架構,節點的重建可能會導致機器的IP地址變化,導致基於IP的灰階版本失效。
基於應用標籤灰階
在MSE Nacos 2.2.3.3及以上版本中,支援基於應用標籤灰階的方式進行灰階發布,您可以在用戶端對應用節點進列標籤設定並針對標籤進行灰階發布。
MSE Nacos版本在2.2.3.3及以上支援應用標籤灰階,您需要升級引擎版本至2.2.3.3及以上。
開源Nacos-Client版本在2.3.2及以上支援自訂應用標籤灰階,您需要升級用戶端版本至2.3.2及以上。
通過環境變數注入標籤的能力,需升級Nacos-Client至2.4.2及以上。
用戶端設定應用標籤
您可以通過以下方式設定應用的標籤,應用標籤為key-value格式。可以通過properties,JVM參數和環境變數三種方式指定。相同key的情況下,預設優先順序:properties > JVM參數 > env環境變數,nacos.config.gray.label是Nacos內建的預設配置灰階標籤。
//1.properties形式傳入
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "your endpoint");
properties.put("project.name", "your app name");
properties.put("nacos.config.gray.label","yourgrayname");
//2.JVM參數設定
設定啟動參數-Dnacos.config.gray.label=yourgrayname
//3.env環境變數指定
設定環境變數 nacos_config_gray_label=yourgrayname
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);
}
});服務端發布標籤灰階
查看監聽者標籤
用戶端完成應用標籤注入後,可以通過服務端查看配置的監聽者列表,查看每個監聽者攜帶的標籤。

發布灰階標籤配置
單擊編輯配置,選擇基於標籤灰階發布,然後選擇應用節點當前存在的標籤索引值對,可以看到選擇的索引值對所匹配到的節點數。

發布灰階標籤版本後,在監聽查詢可以看到當前用戶端所匹配的配置版本。在配置詳情可以看到當前灰階版本的詳情。
在進行第一批灰階觀察後,可以通過擴大編輯標籤的值範圍來逐步擴大灰階,直到進行全量發布,單擊全量發布後,將停止對應的灰階版本。如果在灰階過程中發現業務異常,可以單擊停止灰階進行一鍵自動復原。
相關問題
應用標籤設定的進階用法
除了設定單個標籤nacos.config.gray.label之外,Nacos還支援設定多個標籤以及自訂標籤Collector SPI的形式來設定標籤,支援更加靈活自訂標籤擷取邏輯。
設定多值標籤。
Nacos支援在應用標籤中注入多個標籤索引值對。可以在properties和JVM參數中指定
nacos.app.conn.labels參數(格式樣本:nacos.app.conn.labels="k1=v1,k2=v2,k3=v3"),或者在環境變數中指定nacos_app_conn_labels參數。//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參數設定 設定啟動參數-Dnacos.app.conn.labels="app=demo,site=hangzhou-c,otherkey=othervaue" //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); } });自訂應用標籤SPI
Nacos-Client定義了自訂應用標籤的SPI,可以通過實現
com.alibaba.nacos.common.labels.LabelsCollector介面,並將具體實作類別發布為service的方式實現自訂的應用標籤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; } }
多灰階版本並行
對於一個配置來說,可能存在多個配置的版本,包括正式版本,基於IP的灰階版本,基於標籤的灰階版本,其中基於標籤的灰階發行就緒多個版本。當一個配置存在多個版本時,Nacos服務端的配置查詢及推送將以如下的優先順序規則進行匹配。 基於IP的灰階版本>基於標籤的灰階版本>正式版本。
在處理多個基於標籤的灰階版本時,按照優先順序priority欄位的值進行排序,優先順序priority值越大,優先順序越高;如果優先順序priority值相等,則按照灰階版本名稱進行排序,建議將不同的灰階版本設定明確的優先順序。
當設定了一個應用標籤的應用節點,優先匹配是否存在針對當前應用節點IP的灰階版本,如果存在,則返回基於IP灰階的配置版本,如果不存在,則嘗試按照優先順序匹配基於標籤的灰階版本,如果匹配成功,則返回對應的配置灰階版本,如果沒有匹配的標籤灰階版本,則返回當前配置的正式版本。可以在MSE控制台的監聽查詢介面查看每個應用節點當前所匹配到的配置版本。
MSE Nacos 2.3.0+版本支援多灰階版本並行,對一個配置所發布的最大灰階版本數量有一定限制,預設最大支援5個標籤灰階的版本,超過上限時,灰階發布將被攔截。
應用標籤規劃
在規劃應用節點的標籤時,推薦根據業務影響範圍的大小維度進列標籤規劃,以逐步灰階並降低變更風險。以下是常見的最佳實務:
將應用程式名稱作為標籤。先對部分非關鍵鏈路上的應用進行灰階,觀察確認無異常之後再擴大灰階至核心鏈路的應用。
業務側可以通過流量入口側對系統上下遊的機器進行流量隔離。例如,針對公司內部使用者確定一批灰階機器,可以為這部分機器設定單獨的灰階標籤,以達到內部使用者灰階的效果。
應用標籤的格式
標籤索引值key-value允許使用的字元包括英文字母大小寫、數字、底線“_”、橫杠“-”和點“.”。如果傳入其他格式的標籤將被忽略處理。如果通過參數nacos.app.conn.labels指定多個索引值對時,格式必須遵循 "k1=v1,k2=v2,k3=v3" 格式。如果傳入"k1=v1,k2",那麼k2參數將會被忽略,最終解析成k1=v1。