路由規(guī)則

2022-04-24 16:16 更新

Dubbo支持的路由類型及配合方式

基本思想

基于路由鏈,采用Pipeline的處理方式,如下圖所示:

route-rule1.png

可以把路由鏈的邏輯簡單的理解為 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ì)算。

route-rule2.png

另外一方面,如果 router(n) 需要執(zhí)行 fallback 邏輯的時(shí)候,那么需要經(jīng)過 router(n) 就應(yīng)該決定好 fallback 邏輯

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)錯

fallback 處理原則總結(jié)

  • 我們應(yīng)該在 VirtualService route 中配置好 Destination 的 fallback 處理邏輯
  • 在 fallback subset 時(shí),如果對應(yīng)的 subset 也配置有 fallback subset 時(shí),也應(yīng)遞歸處理;fallback subset 之間的關(guān)系也應(yīng)該是從具體到廣泛
  • 我們在編寫匹配條件時(shí),應(yīng)該遵循從 具體條件到廣泛條件 的原則

RouteChain 的組裝模式 (目前未實(shí)現(xiàn))

route-rule3.png

我們看到上面的圖,在路由的過程當(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 鏈的組裝。

VirtualService

入站流量的規(guī)則

DestinationRule

目標(biāo)地址規(guī)則


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號