路由规则
路由規則在發起 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:
- 格式
=>
之前是消費者匹配條件,所有參數與消費者的 URL 進行比較,當消費者符合匹配條件時,才會對消費者執行後面的過濾規則。=>
之後,是提供者地址列表的過濾條件。所有參數與提供者的 URL 進行比較,消費者最終只會拿到過濾後的地址列表。- 如果匹配條件為空,表示適用於所有消費者,例如:
=> host != 10.20.153.11
- 如果過濾條件為空,則禁止訪問,例如:
host = 10.20.153.10 =>
- 表達式
參數支援
- 服務呼叫資訊,例如:方法、參數等,目前不支援參數路由
- 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
- 條件範例
- 排除預發佈機器
=> 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,目前標籤包含的實例列表
降級約定
當
dubbo.tag=tag1
時,標記為tag=tag1
的供應者會被優先選擇。如果叢集中沒有對應請求標籤的服務,預設會降級到請求標籤為空的供應者;如果您想更改此預設行為,也就是沒有匹配 tag1 的供應者時會返回例外,則需要設定dubbo.force.tag=true
。當未設定
dubbo.tag
時,只會匹配標籤為空的供應者。即使叢集中有可用的服務,如果標籤不匹配,也無法呼叫。這與約定 1 不同。帶有標籤的請求可以降級到無標籤的服務,但沒有標籤/具有其他類型標籤的請求永遠無法存取其他帶標籤的服務。