W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
Dubbo支持的路由類型及配合方式
基于路由鏈,采用Pipeline的處理方式,如下圖所示:
可以把路由鏈的邏輯簡單的理解為 target = rn(…r3(r2(r1(src))))。對于每一個 router 內(nèi)部的邏輯,可以抽象為輸入地址 addrs-in 與 router 中按全量地址 addrs-all 實(shí)現(xiàn)切分好的 n 個互不相交的地址池 addrs-pool-1 … addrs-pool-n 按實(shí)現(xiàn)定義好的規(guī)則取交集作為輸出 addrs-out。以此類推,完成整個路由鏈的計(jì)算。
另外一方面,如果 router(n) 需要執(zhí)行 fallback 邏輯的時(shí)候,那么需要經(jīng)過 router(n) 就應(yīng)該決定好 fallback 邏輯
由于多個 router 之間多個條件組件之后,很容易出現(xiàn)地址被篩選為空的情況,那么我們需要針對這情況進(jìn)行 fallback 處理,保證業(yè)務(wù)在正確性的前提下,能夠順利找到有效地址。
首先我們看一下以下規(guī)則
apiVersion: service.dubbo.apache.org/v1alpha1
kind: VirtualService
metadata:
name: demo-route
spec:
hosts:
- demo // 統(tǒng)一定義為應(yīng)用名
dubbo:
- service:
- exact: com.taobao.hsf.demoService:1.0.0
- exact: com.taobao.hsf.demoService:2.0.0
routedetail:
- name: sayHello-String-method-route
match:
- method:
name_match:
exact: "sayHello"
.....
argp:
- string
route:
- destination:
host: demo
subset: v1
fallback:
destination:
host: demo
subset: v2
fallback:
destination:
host: demo
subset: v3
- name: sayHello-method-route
match:
- method:
name_match:
exact: "s-method"
route:
- destination:
host: demo
subset: v2
fallback:
destination:
host: demo
subset: v3
- name: interface-route
route:
- destination:
host: demo
subset: v3
- service:
....
---
apiVersion: service.dubbo.apache.org/v1alpha1
kind: DestinationRule
metadata:
name: demo-route
spec:
host: demo
subsets:
- name: v1
labels:
sigma.ali/mg: v1-host
- name: v2
labels:
sigma.ali/mg: v2-host
- name: v3
labels:
sigma.ali/mg: v3-host
我們以腳本路由為例,這個腳本路由的匹配條件是遵循一個原則的,就是匹配的范圍是從精確到廣泛的一個過程,在這個示例來說,就是 sayHello(string)參數(shù) -> sayHello 方法 -> 接口級路由 的一個匹配查找過程。
那么如果我們已經(jīng)滿足某個條件,但是選到的 subset 地址為空,我們將如何進(jìn)行 fallback 處理呢?
以匹配 sayHello(string)參數(shù) 條件為例,我們選擇到的是 v1 subset,如果是空,我們可以向上一級是尋找地址,也就是方法級去尋找地址,具體的配置為下
- name: sayHello-String-method-route
match:
- method:
name_match:
exact: "sayHello"
.....
argp:
- string
route:
- destination:
host: demo
subset: v1
fallback:
destination:
host: demo
subset: v2
fallback:
destination:
host: demo
subset: v3
此時(shí)我們選到的地址是 v2 方法級地址,如果 v2 還是沒有地址,根據(jù)規(guī)則的定義,我們是可以 fallback 到 v3 接口級。
假設(shè)我們有一個方法匹配時(shí),如果沒有地址,需要不進(jìn)行 fallback,直接報(bào)錯,我們可以這樣配置
apiVersion: service.dubbo.apache.org/v1alpha1
kind: VirtualService
metadata:
name: demo-route
spec:
hosts:
- demo // 統(tǒng)一定義為應(yīng)用名
dubbo:
- service:
- exact: com.taobao.hsf.demoService:1.0.0
- exact: com.taobao.hsf.demoService:2.0.0
routedetail:
- name: sayHello-String-method-route
match:
- method:
name_match:
exact: "sayHello"
.....
argp:
- string
route:
- destination:
host: demo
subset: v1
fallback:
destination:
host: demo
subset: v2
fallback:
destination:
host: demo
subset: v3
- name: sayHello-method-route
match:
- method:
name_match:
exact: "s-method"
route:
- destination:
host: demo
subset: v2
fallback:
destination:
host: demo
subset: v3
- name: some-method-route
match:
- method:
name_match:
exact: "some-method"
route:
- destination:
host: demo
subset: v4
- name: interface-route
route:
- destination:
host: demo
subset: v3
- service:
....
---
apiVersion: service.dubbo.apache.org/v1alpha1
kind: DestinationRule
metadata:
name: demo-route
spec:
host: demo
subsets:
- name: v1
labels:
sigma.ali/mg: v1-host
- name: v2
labels:
sigma.ali/mg: v2-host
- name: v3
labels:
sigma.ali/mg: v3-host
從這個規(guī)則我們看出來匹配到 some-method 條件時(shí)對應(yīng)的是 v4 subset,那么 v4 為空時(shí),因?yàn)闆]有配置 fallback ,此時(shí)會直接報(bào)錯
我們看到上面的圖,在路由的過程當(dāng)中,我們是 Pipeline 的處理方式,Pipeline 的 Router 節(jié)點(diǎn)存在順序,并且每個 Router 都有一個唯一對應(yīng)的 VirtualService 和 多個 相應(yīng)的 DestinationRule 進(jìn)行描述。
以 Nacos 上存著的路由規(guī)則配置為例,配置的格式如下:
DataId: Demo.rule.yaml
GROUP: HSF
content:
VirtualService A
---
DestinationRule A1
---
DestinationRule A2
---
VirtualService B
---
DestinationRule B
---
VirtualService C
---
DestinationRule C
---
...
VirtualService A 與 DestinationRule A1 、DestinationRule A2 組成一個 Router A,VirtualService B 與 DestinationRule B 組成 Router B,以此類推,完成整個 router 鏈的組裝。
入站流量的規(guī)則
目標(biāo)地址規(guī)則
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: