背景資訊
如果一個應用有多個版本線上上同時執行,部署在不同環境中,如日常環境和特殊環境,則
可以使用標籤路由對不同環境中的不同版本進行流量隔離,將秒殺訂單流量或不同渠道訂單流量路由到特殊環境,將正常的流量路由到日常環境。即使特殊環境異常,本應進入特殊環境的流量也不會進入日常環境,不影響日常環境的使用。
啟動執行Dubbo-Admin
在執行之前,我們需要保障進行執行對應的Dubbo-Admin服務,可以參考 【Dubbo3終極特性】「流量治理體系」一文教你如何搭建Dubbo3的控制檯服務Dubbo-Admin,進行搭建和執行啟動Dubbo-Admin服務。
因為dubbo-admin-server會將dubbo-admin-ui打包為資原始檔,所以啟動dubbo-admin-server就可直接訪問頁面了
我們在這裡可以直接下載clone原始碼
git clone https://github.com/apache/dubbo-admin.git
直接可以下載到IDE中
- dubbo-admin-distribution:主要用於操作安裝和打包使用的專案元件
- dubbo-admin-server:dubbo-admin服務的後臺服務springboot型別的專案
- dubbo-admin-test:dubbo-admin服務的測試服務
- dubbo-admin-ui:dubbo-admin的ui服務,主要會顯示前端的ui頁面。
透過原始碼打包執行
- 在
dubbo-admin-server/src/main/resources/application.properties
中指定註冊中心地址 - 構建
mvn clean package -Dmaven.test.skip=true
- 啟動
mvn --projects dubbo-admin-server spring-boot:run
或者cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar
- 訪問
http://localhost:38080
可以直接再IDE的md檔案中進行允許編譯對應的dubbo-admin的程式碼以及執行服務。
Dubbo-Admin 動態進行流量隔離
Dubbo提供動態流量隔離的服務治理能力,可以在無需重啟應用的情況下,動態進行流量隔離。Dubbo可以透過XML配置,註解配置,動態配置實現流量隔離,這裡主要介紹動態配置的方式。
允許多個Provider端服務
你可以直接進行執行服務進行執行多個例項。如下所示。
當然也可以透過VM引數進行調整為不同的dubbo.protocol.port,方便我們進行路由轉發機制。
標籤路由規則
將服務提供者進行分組,約束流量只在指定分組中流轉,從而實現流量隔離的目的,有兩種方式可以完成例項分組,分別是動態規則打標和靜態規則打標
2.1 動態規則相較於靜態規則優先順序更高
標籤路由
登入Dubbo-Admin控制檯
使用者名稱為root,密碼為root。
在左側導航欄選擇服務治理 > 標籤路由。
點選建立按鈕,在建立新標籤規則皮膚中,填寫規則內容,然後單擊儲存。
配置模板
---
force: false
runtime: true
enabled: true
key: application-provider
tags:
- name: tag1
addresses: ["127.0.0.1:20880"]
- name: tag2
addresses: ["127.0.0.1:20881"]
...
對於流量隔離場景,只需要理清楚以下問題基本就知道配置該怎麼寫了:
修改服務所屬提供者應用的配置。
應用:scope: application, key: app-name(還可使用services指定某幾個服務)。
當路由結果為空,是否強制返回。
- force=false: 當路由結果為空,降級請求tag為空的提供者。
- force=true: 當路由結果為空,直接返回異常。
路由規則的優先順序
priority=1: 路由規則的優先順序,用於排序,優先順序越大越靠前執行,可不填,預設為 0。
配置是否只對某幾個特定例項生效。
所有例項:addresses: ["0.0.0.0"] 或addresses: ["0.0.0.0:*"] 具體由side值決定。
指定例項:addersses[例項地址列表]。
執行服務提供者
可以從dubbo-admin中看到對應的服務已經註冊上來了
開發服務消費者
RpcContext.getContext().setAttachment("dubbo.tag",name);
切換不同的tag引數,即可完成流量轉發:tag1 tag2
我們透過name引數進行切換標籤
請求 GET http://127.0.0.1:8082/add?name=tag1&age=12
我們可以看到列印了對應provider1服務的日誌
請求 GET http://127.0.0.1:8082/add?name=tag2&age=12
我們可以看到列印了對應provider2服務的日誌
小夥伴們,你們學會了嘛?