【Dubbo3終極特性】「流量治理體系」一文教你如何透過Dubbo-Admin實現動態進行流量隔離機制

洛神灬殤發表於2023-01-18

背景資訊

如果一個應用有多個版本線上上同時執行,部署在不同環境中,如日常環境和特殊環境,則
可以使用標籤路由對不同環境中的不同版本進行流量隔離,將秒殺訂單流量或不同渠道訂單流量路由到特殊環境,將正常的流量路由到日常環境。即使特殊環境異常,本應進入特殊環境的流量也不會進入日常環境,不影響日常環境的使用。

啟動執行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頁面。

透過原始碼打包執行

  1. dubbo-admin-server/src/main/resources/application.properties中指定註冊中心地址
  2. 構建
    • mvn clean package -Dmaven.test.skip=true
  3. 啟動
    • mvn --projects dubbo-admin-server spring-boot:run
      或者
    • cd dubbo-admin-distribution/target; java -jar dubbo-admin-${project.version}.jar
  4. 訪問 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服務的日誌

小夥伴們,你們學會了嘛?

相關文章