路由规则

路由规则介绍

《微服务Mesh路由方案草案V2》

简介

路由规则,简单来说就是根据特定的条件,将特定的请求流量发送到特定的服务提供者。从而实现流量的分配。

在 Dubbo3 统一路由规则的定义中,需要提供两个yaml格式的资源:virtual service 和 destination rule。其格式和 service mesh 定义的路由规则非常相似。

  • virtual service

定义host,用于和destination rule建立联系。
定义 service 匹配规则
定义 match 匹配规则
匹配到特定请求后,进行目标集群的查找和验证,对于为空情况,使用 fallback 机制。

  • destination rule

定义特定集群子集,以及子集所适配的标签,标签从 provider 端暴露的 url 中获取,并尝试匹配。

提供能力

基于配置中心的路由配置

sample示例参见Mesh Router

1. 路由规则文件注解

路由规则只针对客户端,对于服务端,只需要在服务提供时打好特定的参数标签即可。

1.1 virtual-service
  1. apiVersion: service.dubbo.apache.org/v1alpha1
  2. kind: VirtualService
  3. metadata: {name: demo-route}
  4. spec:
  5. dubbo:
  6. # 使用正则表达式匹配service名,只有个满足该service名的请求才能路由。
  7. # 就此例子来说,不满足service名的请求会直接找不到provider
  8. # - services:
  9. # - { regex: org.apache.dubbo.UserProvider* }
  10. - routedetail:
  11. - match:
  12. # 匹配规则,如果(sourceLabel)客户端url满足存在参数 `trafficLabel: xxx` 的才能匹配成功
  13. - sourceLabels: {trafficLabel: xxx}
  14. name: xxx-project
  15. route: # 一旦匹配上述match规则,将选择 dest_rule 里定义的名为 isolation 的子集
  16. - destination: {host: demo, subset: isolation}
  17. - match:
  18. - sourceLabels: {trafficLabel: testing-trunk}
  19. name: testing-trunk
  20. route: # 一旦匹配上述match规则,将选择 dest_rule 里定义的名为 testing-trunk 的子集
  21. - destination: {host: demo, subset: testing-trunk}
  22. - name: testing # 没有match,兜底逻辑,上述不满足后一定会被匹配到。
  23. route:
  24. - destination: {host: demo, subset: testing}
  25. services:
  26. - {exact: com.apache.dubbo.sample.basic.IGreeter}
  27. hosts: [demo] # 匹配dest_rule.yml里面的 host 为demo
1.2 destination-rule
  1. apiVersion: service.dubbo.apache.org/v1alpha1
  2. kind: DestinationRule
  3. metadata: { name: demo-route }
  4. spec:
  5. host: demo
  6. subsets:
  7. - labels: { env-sign: xxx, tag1: hello }
  8. name: isolation
  9. - labels: { env-sign: yyy }
  10. name: testing-trunk
  11. - labels: { env-sign: zzz }
  12. name: testing
  13. trafficPolicy:
  14. loadBalancer: { simple: ROUND_ROBIN }

2. client、server 路由参数设置

  • client 端

    dubbogo.yml

    定义配置中心

  1. config-center:
  2. protocol: zookeeper
  3. address: 127.0.0.1:2181
  4. data-id: "dubbo-go-samples-configcenter-zookeeper-client"

在代码中通过 API 将配置发布至配置中心,也可预先手动配置。

  1. dynamicConfiguration, err := config.GetRootConfig().ConfigCenter.GetDynamicConfiguration()
  2. if err != nil {
  3. panic(err)
  4. }
  5. // publish mesh route config
  6. err = dynamicConfiguration.PublishConfig("dubbo.io.MESHAPPRULE", "dubbo", MeshRouteConf)
  7. if err != nil {
  8. return
  9. }

server 端

  1. dubbo:
  2. registries:
  3. demoZK:
  4. protocol: zookeeper
  5. timeout: 3s
  6. address: 127.0.0.1:2181
  7. protocols:
  8. triple:
  9. name: tri
  10. port: 20000
  11. provider:
  12. services:
  13. GreeterProvider:
  14. interface: com.apache.dubbo.sample.basic.IGreeter # must be compatible with grpc or dubbo-java
  15. params:
  16. env-sign: zzz # server label, 对应 destination Rule中的testing,即兜底逻辑

3. 运行方法

直接使用goland运行本示例

运行后,可观测到所有客户端流量都路由至 server,根据source label,没有命中的virtualService,因此路由至兜底testing。

最后修改 December 16, 2022: Fix check (#1736) (97972c1)