路由规则

在 Dubbo 中透過路由規則進行服務治理

路由規則在發起 RPC 呼叫之前,會對目標伺服器的地址進行過濾,過濾後的地址清單將作為消費者最終發起 RPC 呼叫的候選地址。

  • 條件路由。支援在服務或消費者應用程式粒度上配置路由規則。
  • 標籤路由。在提供者應用程式粒度上配置路由規則。

未來,我們計劃在 2.6.x 版本的基礎上繼續增強腳本路由功能。

條件路由

您可以在服務管理控制台 Dubbo-Admin 中隨時編寫路由規則

簡介

  • 應用程式粒度

    # The consumer of app1 can only consume all service instances with port 20880
    # The consumers of app2 can only consume all service instances with port 20881
    ---
    scope: application
    force: true
    runtime: true
    enabled: true
    key: governance-conditionrouter-consumer
    conditions:
      - application=app1 => address=*:20880
      - application=app2 => address=*:20881
    ...
    
  • 服務粒度

    # The sayHello method of DemoService can only consume all service instances with port 20880
    # The sayHi method of DemoService can only consume all service instances with port 20881
    ---
    scope: service
    force: true
    runtime: true
    enabled: true
    key: org.apache.dubbo.samples.governance.api.DemoService
    conditions:
      - method=sayHello => address=*:20880
      - method=sayHi => address=*:20881
    ...
    

詳細規則

每個欄位的含義

  • scope 表示路由規則的粒度,scope 的值將決定 key 的值。 必填
    • service 服務粒度
    • application 應用程式粒度
  • Key 指定規則主體作用於哪個服務或應用程式。 必填
    • 當 scope=service 時,key 值為 [{group}:]{service}[:{version}] 的組合
    • 當 scope=application 時,key 值為應用程式名稱
  • enabled=true 目前路由規則是否有效,可以留空,預設為有效。
  • force=false 當路由結果為空時,是否強制執行,如果不強制執行,路由結果為空的路由規則將自動失效,可以留空,預設為 false
  • runtime=false 是否每次呼叫都執行路由規則,否則只在提供者地址清單變更時預先執行並快取結果,呼叫時直接從快取中取得路由結果。如果使用參數路由,則必須設定為 true。需要注意的是,該設定會影響呼叫效能。可以留空,預設為 false
  • priority=1 是路由規則的優先順序,用於排序,優先順序越高,執行順序越靠前,可以留空,預設為 0
  • conditions 定義特定的路由規則內容。必填

條件規則主體

The `conditions` part is the main body of the rule, which consists of 1 to any number of rules. Below we describe the configuration syntax of each rule in detail:
  1. 格式
  • => 之前是消費者匹配條件,所有參數與消費者的 URL 進行比較,當消費者符合匹配條件時,才會對消費者執行後面的過濾規則。
  • => 之後,是提供者地址列表的過濾條件。所有參數與提供者的 URL 進行比較,消費者最終只會拿到過濾後的地址列表。
  • 如果匹配條件為空,表示適用於所有消費者,例如:=> host != 10.20.153.11
  • 如果過濾條件為空,則禁止訪問,例如:host = 10.20.153.10 =>
  1. 表達式

參數支援

  • 服務呼叫資訊,例如:方法、參數等,目前不支援參數路由
  • URL 本身的欄位,例如:protocol、host、port 等。
  • 以及 URL 上的所有參數,例如:application、organization 等。

條件支援

  • 等號 = 表示「匹配」,例如:host = 10.20.153.10
  • 不等號 != 表示「不匹配」,例如:host != 10.20.153.10

值支援

  • 多個值用逗號 , 分隔,例如:host != 10.20.153.10,10.20.153.11
  • 以星號 * 結尾,表示萬用字元,例如:host != 10.20.*
  • 以錢字號 $ 開頭,表示引用消費者參數,例如:host = $host
  1. 條件範例
  • 排除預發佈機器
=> host != 172.22.3.91
  • 白名單
register.ip != 10.20.153.10,10.20.153.11 =>
  • 黑名單
register.ip = 10.20.153.10,10.20.153.11 =>
  • 服務部署在應用程式上,只暴露一部分機器,防止整個叢集掛掉
=> host = 172.22.3.1*,172.22.3.2*
  • 重要應用加機器
application != kylin => host != 172.22.3.95,172.22.3.96
  • 讀寫分離
method = find*,list*,get*,is* => host = 172.22.3.94,172.22.3.95,172.22.3.96
method != find*,list*,get*,is* => host = 172.22.3.97,172.22.3.98
  • 前後端分離
application = bops => host = 172.22.3.91,172.22.3.92,172.22.3.93
application != bops => host = 172.22.3.94,172.22.3.95,172.22.3.96
  • 隔離不同機房的網段
host != 172.22.3.* => host != 172.22.3.*
  • 提供者與消費者部署在同一個叢集中,本地機器只訪問本地服務
=> host = $host

標籤路由規則

簡介

標籤路由將一個或多個服務提供者劃分到同一個分組,並限制流量只在指定分組內流動,從而達到流量隔離的目的,可用作藍綠發布、灰度發布等場景的能力基礎。

提供者

標籤主要指提供端應用程式實例的分組。目前,完成實例分組的方式有兩種,分別是`動態規則標記`和`靜態規則標記`,其中動態規則的優先順序高於靜態規則,當兩者同時存在且發生衝突時,以動態規則為準。

- 動態規則標記,可在服務治理控制台隨時發布標籤分組規則

# The governance-tagrouter-provider application adds two tag groups tag1 and tag2
# tag1 contains an instance 127.0.0.1:20880
# tag2 contains an instance 127.0.0.1:20881
---
  force: false
  runtime: true
  enabled: true
  key: governance-tagrouter-provider
  tags:
    - name: tag1
      addresses: ["127.0.0.1:20880"]
    - name: tag2
      addresses: ["127.0.0.1:20881"]
 ...
  • 靜態標記

    <dubbo:provider tag="tag1"/>
    

    <dubbo:service tag="tag1"/>
    

    java -jar xxx-provider.jar -Ddubbo.provider.tag={the tag you want, may come from OS ENV}
    

消費者

RpcContext.getContext().setAttachment(Constants.TAG_KEY,"tag1");

請求標籤的作用域是每次呼叫。使用附加資訊來傳遞請求標籤。需要注意的是,儲存在附加資訊中的值會在一次完整的遠端呼叫中持續傳遞。得益於此特性,我們只需要在呼叫時,透過一行程式碼的設定,即可實現標籤的持續傳輸。

目前僅支援寫死程式碼設定 dubboTag。需要注意 RpcContext 是執行緒繫結的,要優雅地使用標籤路由功能,建議透過 servlet 過濾器(在 web 環境中)或自定義 SPI 過濾器來設定 dubboTag。

詳細規則

格式

  • Key 指定規則主體適用的應用程式。必填
  • enabled=true 目前路由規則是否有效,可以留空,預設為有效。
  • force=false 當路由結果為空時,是否強制執行,如果不強制執行,路由結果為空的路由規則將自動失效,可以留空,預設為 false
  • runtime=false 是否每次呼叫都執行路由規則,否則只在提供者地址清單變更時預先執行並快取結果,呼叫時直接從快取中取得路由結果。如果使用參數路由,則必須設定為 true。需要注意的是,該設定會影響呼叫效能。可以留空,預設為 false
  • priority=1 是路由規則的優先順序,用於排序,優先順序越高,執行順序越靠前,可以留空,預設為 0
  • tags 定義特定的標籤分組內容,可以定義任意 n 個 (n>=1) 標籤,並為每個標籤指定一個實例列表。必填
    • name,標籤名稱
  • addresses,目前標籤包含的實例列表

降級約定

  1. dubbo.tag=tag1 時,標記為 tag=tag1 的供應者會被優先選擇。如果叢集中沒有對應請求標籤的服務,預設會降級到請求標籤為空的供應者;如果您想更改此預設行為,也就是沒有匹配 tag1 的供應者時會返回例外,則需要設定 dubbo.force.tag=true

  2. 當未設定 dubbo.tag 時,只會匹配標籤為空的供應者。即使叢集中有可用的服務,如果標籤不匹配,也無法呼叫。這與約定 1 不同。帶有標籤的請求可以降級到無標籤的服務,但沒有標籤/具有其他類型標籤的請求永遠無法存取其他帶標籤的服務。


上次修改時間:2023 年 1 月 2 日:增強英文文件 (#1798) (95a9f4f6c1c)