本文介紹Spring Cloud及Dubbo應用如何按泳道灰度策略進行金絲雀發布。
背景信息
K8s類型應用支持按泳道灰度策略進行金絲雀發布。基于全鏈路流控泳道的環境隔離機制,在應用灰度發布過程中,被添加至灰度泳道的灰度分批實例將與基線版本實例隔離。只有滿足流控泳道入口規則的流量才會被發送至泳道中的灰度分批實例中。
在相同微服務空間下,多個應用支持同時發布至同一泳道。滿足泳道入口規則的流量將被染色,并在泳道中全鏈路透傳,以實現全鏈路灰度控制。
泳道流控規則為避免流量中斷,默認存在Fallback策略:
當滿足泳道流控規則的流量沒有對應灰度服務提供者時,流量會Fallback至基線。
當不滿足泳道流控規則的流量沒有對應基線服務提供者時,流量會Fallback至灰度。
Spring Cloud應用進行金絲雀泳道發布
前提條件
已在EDAS控制臺部署完成本示例的四個應用:Zuul網關應用、應用A、應用B和應用C,且每個應用副本數≥2。具體操作,請參見創建和部署應用概述(K8s)。
步驟一:創建泳道組
登錄EDAS控制臺。
在左側導航欄,選擇 。
在全鏈路流量控制頁面頂部菜單欄選擇地域,在頁面中選擇目標微服務空間,然后單擊創建。
在創建泳道組對話框中設置泳道組相關參數,然后單擊確定。
步驟二:創建泳道
選擇并切換至步驟一:創建泳道組中創建好的泳道組,并單擊點擊創建第一個分流泳道。
在創建流控泳道面板中配置相關參數后,單擊確定。
入口規則本示例設置為基于
Header
的條件,當存在tag
為grey
時,流量進入灰度泳道。接收打標流量應用中無需添加應用,應用與泳道的關聯由應用的金絲雀發布策略托管。
步驟三:應用按泳道策略進行金絲雀發布
步驟四:配置確認
在變更記錄頁面查看當前灰度批次及灰度泳道配置。
在流量管理 > 微服務治理 > 全鏈路流量控制頁面,可以看到應用的灰度批次已經加入指定泳道。
步驟五:流量驗證
在應用總覽頁面的基本信息區域,單擊運行狀態右側的點擊查看,查看灰度批次實例IP地址。
在應用配置詳情面板,單擊Zuul應用的終端進入本地IP,發送灰度流量。
for i in {1..10}; do curl -H "tag: grey" http://47.111.XX.XX/sc-A/a ;sleep 0.1; echo ""; done Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220] Agrey[10.14.2.95] -> Bgrey[10.14.1.224] -> C[10.14.1.220]
在應用配置詳情面板,單擊Zuul應用的終端進入本地IP,發送非灰度流量。
for i in {1..10}; do curl http://47.111.XX.XX/sc-A/a ;sleep 0.1; echo ""; done A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220] A[10.14.1.214] -> B[10.14.2.92] -> C[10.14.1.220]
Dubbo應用進行金絲雀泳道發布
操作流程
預期效果
應用A按特定判斷條件進行分發,滿足特定條件的流量會被轉發至應用B的灰度批次,并透傳至相同泳道中的其他應用灰度批次。
使用限制
由于目前泳道入口規則基于HTTP協議設定,所以泳道規則對于Dubbo協議間的調用不會生效。
應用的灰度分批選擇及添加至泳道,實際上是為當前應用的灰度分批實例打標簽。所以,流量識別并染色需自行注入流量標簽。
步驟一:創建泳道組
登錄EDAS控制臺。
在左側導航欄,選擇 。
在全鏈路流量控制頁面頂部菜單欄選擇地域,在頁面中選擇目標微服務空間,然后單擊創建。
在創建泳道組對話框中設置泳道組相關參數,將上述流量鏈路中涉及的應用添加至泳道組涉及所有應用中,然后單擊確定。
步驟二:創建泳道
選擇并切換至已創建的泳道組,單擊點擊創建第一個分流泳道。
在創建流控泳道面板中配置相關參數后,單擊確定。
對于Dubbo協議的服務,泳道入口規則無實際效果,故填寫任意條件即可。
接收打標流量應用中無需添加應用,應用與泳道的關聯由應用的金絲雀發布策略托管。
在全鏈路流量控制頁面,查看創建的流控泳道。
步驟三:消費端應用流量標注入
本示例中為應用A。
在程序
pom.xml
中引入以下依賴。<dependency> <groupId>com.alibaba.arms.apm</groupId> <artifactId>arms-sdk</artifactId> <version>1.7.3</version> </dependency>
在代碼中增加流量判斷條件,并實現流量標注入。
public String test(String param) { if ("grey".equals(param)) { injectGreyTrafficTag(); } return demoService.echo(param); } // 注意:此處的laneTag替換為創建泳道時設置的泳道標,其他配置不變。 private void injectGreyTrafficTag() { String laneTag = "testbaggage"; Span span = Tracer.builder().getSpan(); Map<String, String> baggageItems = span.baggageItems(); JSONObject tag = new JSONObject(); tag.put("name", laneTag); tag.put("priority", 100); baggageItems.put("__microservice_tag__", JSONObject.toJSONString(Arrays.asList(tag))); baggageItems.put("cs", laneTag + "(DEFAULT)"); span.withBaggage(baggageItems); }
步驟四:應用按泳道策略進行金絲雀發布
登錄EDAS控制臺。
在左側導航欄,選擇應用管理 > 應用列表,單擊需要進行金絲雀發布的應用名稱,如本示例中的應用B、應用C。
在應用總覽頁面右上角,選擇部署 > 部署。
在選擇部署模式頁面,選擇金絲雀發布(灰度),并單擊開始部署。
在發布策略區域,單擊按泳道灰度,切換至泳道策略選擇框。
(可選)新建泳道發布策略需單擊添加策略。
在添加泳道灰度策略面板,選擇已創建好的泳道組和泳道,單擊確定。配置項信息,請參見c.設置灰度規則。
說明只有添加至泳道組中的應用,才支持選擇泳道組及其泳道。
在選擇策略框,選擇已創建的發布策略,然后單擊確定,觸發應用進行金絲雀發布。
步驟五:配置確認
在變更記錄頁面查看當前灰度批次及灰度泳道配置。
在流量管理>微服務治理>全鏈路流量控制頁面,可以看到應用的灰度批次已經加入指定泳道。
步驟六:流量驗證
在應用總覽頁面的基本信息區域,單擊運行狀態右側的點擊查看,查看灰度批次實例IP地址。
在應用配置詳情面板,單擊操作列的終端,發送灰度流量。
for i in {1..10}; do curl http://127.0.0.1:8088/traffic?param=grey;sleep 0.1; echo ""; done A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212] A[10.14.1.213] -> B[10.14.1.210] -> C[10.14.1.212]
在應用配置詳情面板,單擊操作列的終端,發送非灰度流量。
for i in {1..10}; do curl http://127.0.0.1:8088/traffic;sleep 0.1; echo ""; done A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251] A[10.14.1.213] -> B[10.14.2.51] -> C[10.14.1.251]