條件路由規則
條件路由規則會將符合特定條件的請求轉發到目標實例的子集。規則會匹配進來流量的請求參數,並將符合匹配條件的請求轉發到包含特定實例地址列表的子集。
以下是一個條件路由規則的示例。
基於以下範例規則,所有對 `org.apache.dubbo.samples.CommentService` 服務中 `getComment` 方法的調用都將轉發到標記為 `region=Hangzhou` 的地址子集。
configVersion: v3.0
scope: service
force: true
runtime: true
enabled: true
key: org.apache.dubbo.samples.CommentService
conditions:
- method=getComment => region=Hangzhou
您可以參考條件路由的具體範例代碼 這裡。
條件規則
條件路由規則的主體定義了路由規則將生效的目標服務或應用程式、流量過濾條件以及在某些特定情況下的行為。
欄位 | 類型 | 說明 | 必要 |
---|---|---|---|
configVersion | 字串 | 條件規則定義的版本,目前可用版本為 `v3.0` | 是 |
scope | 字串 | 支援 `service` 和 `application` 範圍規則。 | 是 |
key | 字串 | 此規則即將套用的目標服務或應用程式的識別碼。 - 如果設定為 `scope:service`,則應將 `key` 指定為此規則要控制的 Dubbo 服務金鑰。 - 如果設定為 `scope:application`,則應將 `key` 指定為此規則要控制的應用程式名稱,應用程式應始終為 Dubbo Consumer。 | 是 |
enabled | 布林值 | 是否啟用此規則,設定為 `enabled:false` 以停用此規則。 | 是 |
conditions | 字串[] | 此配置的條件路由規則定義。有關詳細資訊,請查看 條件 | 是 |
force | 布林值 | 路由後實例子集為空時的行為。`true` 表示返回無提供者異常,而 `false` 表示忽略此規則。 | 否 |
runtime | 布林值 | 每次 RPC 呼叫是否執行路由規則,或使用可用的路由快取。 | 否 |
條件
Condition
作為條件路由規則的主體,其類型為字串,具有複合結構,例如 method=getComment => region=Hangzhou
。這裡
=>
符號前的條件表示請求參數匹配條件。指定的匹配條件
會與消費者的請求上下文 (URL) 甚至方法參數進行比較。當消費者滿足匹配條件時,條件後面的地址子集過濾規則將應用於消費者。=>
符號後的條件表示地址子集過濾條件。指定的過濾條件
會與提供者實例地址 (URL) 進行比較。消費者只能訪問符合過濾條件的實例,確保流量僅發送到符合條件的地址子集。- 如果匹配條件為空,則表示該規則適用於所有請求,例如:
=> status != staging
- 如果過濾條件為空,則拒絕來自相應請求的訪問,例如:
application = product =>
- 如果匹配條件為空,則表示該規則適用於所有請求,例如:
匹配/過濾條件
支援的參數
- 服務呼叫上下文,例如介面、方法、群組、版本等。
- 請求上下文,例如 attachments[key] = value。
- 方法參數,例如 arguments[0] = tom。
- URL 本身中的欄位,例如 protocol、host、port 等。
- URL 上的附加參數,例如 application、organization 等。
- 支援開發人員自定義的擴充功能。
支援的條件
- 等號 (=) 表示「匹配」,例如:method = getComment。
- 不等號 (!=) 表示「不匹配」,例如:method != getComment。
支援的值
- 以逗號 (,) 分隔的多個值,例如:host != 10.20.153.10,10.20.153.11。
- 以星號 (*) 結尾表示萬用字元匹配,例如:host != 10.20..*。
- 以錢幣符號 ($) 開頭表示引用消費者參數,例如:region = $region。
- 整數值範圍,例如:userId = 1~100,userId = 101~。
- 支援開發人員自定義的擴充功能。
上次修改時間 2024 年 1 月 11 日:增強條件路由規則文件 (#2901) (2fe914296a3)