Dubbo-go v3 統(tǒng)一路由規(guī)則

2022-04-15 10:22 更新

提示用戶dubbo使用的路由協(xié)議,介紹Dubbo-gov3采用的統(tǒng)一路由規(guī)則

Dubbo-go v3 Mesh路由規(guī)則

路由規(guī)則介紹

《微服務(wù)Mesh路由方案草案V2》

簡(jiǎn)介

路由規(guī)則,簡(jiǎn)單來(lái)說(shuō)就是根據(jù)特定的條件,將特定的請(qǐng)求流量發(fā)送到特定的服務(wù)提供者。從而實(shí)現(xiàn)流量的分配。

在 Dubbo3 統(tǒng)一路由規(guī)則的定義中,需要提供兩個(gè)yaml格式的資源:virtual service 和 destination rule。其格式和 service mesh 定義的路由規(guī)則非常相似。

  • virtual service

定義host,用于和destination rule建立聯(lián)系。定義 service 匹配規(guī)則定義 match 匹配規(guī)則匹配到特定請(qǐng)求后,進(jìn)行目標(biāo)集群的查找和驗(yàn)證,對(duì)于為空情況,使用 fallback 機(jī)制。

  • destination rule

定義特定集群子集,以及子集所適配的標(biāo)簽,標(biāo)簽從 provider 端暴露的 url 中獲取,并嘗試匹配。

提供能力

基于配置中心的路由配置

sample示例參見(jiàn)Mesh Router

1. 路由規(guī)則文件注解

路由規(guī)則只針對(duì)客戶端,對(duì)于服務(wù)端,只需要在服務(wù)提供時(shí)打好特定的參數(shù)標(biāo)簽即可。

1.1 virtual-service
apiVersion: service.dubbo.apache.org/v1alpha1
kind: VirtualService
metadata: {name: demo-route}
spec:
  dubbo:
    # 使用正則表達(dá)式匹配service名,只有個(gè)滿足該service名的請(qǐng)求才能路由。
    # 就此例子來(lái)說(shuō),不滿足service名的請(qǐng)求會(huì)直接找不到provider
    # - services:
    #   - { regex: org.apache.dubbo.UserProvider* }
    - routedetail:
        - match: 
          # 匹配規(guī)則,如果(sourceLabel)客戶端url滿足存在參數(shù) `trafficLabel: xxx` 的才能匹配成功
            - sourceLabels: {trafficLabel: xxx}
          name: xxx-project
          route:  # 一旦匹配上述match規(guī)則,將選擇 dest_rule 里定義的名為 isolation 的子集
            - destination: {host: demo, subset: isolation}
        - match:
            - sourceLabels: {trafficLabel: testing-trunk}
          name: testing-trunk
          route: # 一旦匹配上述match規(guī)則,將選擇 dest_rule 里定義的名為 testing-trunk 的子集
            - destination: {host: demo, subset: testing-trunk}
        - name: testing # 沒(méi)有match,兜底邏輯,上述不滿足后一定會(huì)被匹配到。
          route:
            - destination: {host: demo, subset: testing}
      services:
        - {exact: com.apache.dubbo.sample.basic.IGreeter}
  hosts: [demo] # 匹配dest_rule.yml里面的 host 為demo
1.2 destination-rule
apiVersion: service.dubbo.apache.org/v1alpha1
kind: DestinationRule
metadata: { name: demo-route }
spec:
  host: demo
  subsets:
    - labels: { env-sign: xxx, tag1: hello }
      name: isolation
    - labels: { env-sign: yyy }
      name: testing-trunk
    - labels: { env-sign: zzz }
      name: testing
  trafficPolicy:
    loadBalancer: { simple: ROUND_ROBIN }

2. client、server 路由參數(shù)設(shè)置

  • client 端dubbogo.yml定義配置中心
  config-center:
    protocol: zookeeper
    address: 127.0.0.1:2181
    data-id: "dubbo-go-samples-configcenter-zookeeper-client"

在代碼中通過(guò) API 將配置發(fā)布至配置中心,也可預(yù)先手動(dòng)配置。

dynamicConfiguration, err := config.GetRootConfig().ConfigCenter.GetDynamicConfiguration()
if err != nil {
  panic(err)
}

// publish mesh route config
err = dynamicConfiguration.PublishConfig("dubbo.io.MESHAPPRULE", "dubbo", MeshRouteConf)
if err != nil {
  return
}

server 端

dubbo:
  registries:
    demoZK:
      protocol: zookeeper
      timeout: 3s
      address: 127.0.0.1:2181
  protocols:
    triple:
      name: tri
      port: 20000
  provider:
    services:
      GreeterProvider:
        interface: com.apache.dubbo.sample.basic.IGreeter # must be compatible with grpc or dubbo-java
        params:
          env-sign: zzz # server label, 對(duì)應(yīng) destination Rule中的testing,即兜底邏輯

3. 運(yùn)行方法

直接使用goland運(yùn)行本示例

運(yùn)行后,可觀測(cè)到所有客戶端流量都路由至 server,根據(jù)source label,沒(méi)有命中的virtualService,因此路由至兜底testing。


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)