W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
提示用戶dubbo使用的路由協(xié)議,介紹Dubbo-gov3采用的統(tǒng)一路由規(guī)則
路由規(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ī)則非常相似。
定義host,用于和destination rule建立聯(lián)系。定義 service 匹配規(guī)則定義 match 匹配規(guī)則匹配到特定請(qǐng)求后,進(jìn)行目標(biāo)集群的查找和驗(yàn)證,對(duì)于為空情況,使用 fallback 機(jī)制。
定義特定集群子集,以及子集所適配的標(biāo)簽,標(biāo)簽從 provider 端暴露的 url 中獲取,并嘗試匹配。
sample示例參見(jiàn)Mesh Router
路由規(guī)則只針對(duì)客戶端,對(duì)于服務(wù)端,只需要在服務(wù)提供時(shí)打好特定的參數(shù)標(biāo)簽即可。
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
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 }
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,即兜底邏輯
直接使用goland運(yùn)行本示例
運(yùn)行后,可觀測(cè)到所有客戶端流量都路由至 server,根據(jù)source label,沒(méi)有命中的virtualService,因此路由至兜底testing。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: