This is an automated email from the ASF dual-hosted git repository.

liujieqin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 3c634f5  添加路由规则规范说明
3c634f5 is described below

commit 3c634f594602fb1897ef07cc7647fa5b858cd8d3
Author: 未宇 <liujie....@alibaba-inc.com>
AuthorDate: Tue Apr 6 17:13:08 2021 +0800

    添加路由规则规范说明
---
 content/zh/docs/v3.0/references/routerule.md | 944 +++++++++++++++++++++++++++
 static/imgs/user/route-rule1.png             | Bin 0 -> 233685 bytes
 static/imgs/user/route-rule2.png             | Bin 0 -> 24570 bytes
 static/imgs/user/route-rule3.png             | Bin 0 -> 233685 bytes
 4 files changed, 944 insertions(+)

diff --git a/content/zh/docs/v3.0/references/routerule.md 
b/content/zh/docs/v3.0/references/routerule.md
new file mode 100644
index 0000000..11a3b0e
--- /dev/null
+++ b/content/zh/docs/v3.0/references/routerule.md
@@ -0,0 +1,944 @@
+---
+type: docs
+title: "路由规则规范说明"
+linkTitle: "路由规则规范说明"
+weight: 12
+description: "Dubbo 路由规则规范说明"
+---
+
+### 基本思想:基于路由链,采用 Pipeline 的处理方式
+
+![route-rule1.png](/imgs/user/route-rule1.png)
+
+
+可以把路由链的逻辑简单的理解为 target = rn(...r3(r2(r1(src))))。对于每一个 router 内部的逻辑,可以抽象为输入地址 
addrs-in 与 router 中按全量地址 addrs-all 实现切分好的 n 个互不相交的地址池 addrs-pool-1 ... 
addrs-pool-n 按实现定义好的规则取交集作为输出 addrs-out。以此类推,完成整个路由链的计算。
+
+![route-rule2.png](/imgs/user/route-rule2.png)
+
+另外一方面,如果 router(n) 需要执行 fallback 逻辑的时候,那么需要经过 router(n) 就应该决定好 fallback 逻辑
+
+
+### fallback 处理原则
+
+由于多个 router 之间多个条件组件之后,很容易出现地址被筛选为空的情况,那么我们需要针对这情况进行 fallback 
处理,保证业务在正确性的前提下,能够顺利找到有效地址。
+
+首先我们看一下以下规则
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo-route
+spec:
+  hosts:
+  - demo  // 统一定义为应用名 
+  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)参数 -> sayHello 方法 -> 接口级路由 的一个匹配查找过程。
+
+那么如果我们已经满足某个条件,但是选到的 subset 地址为空,我们将如何进行 fallback 处理呢?
+
+以匹配 sayHello(string)参数 条件为例,我们选择到的是 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
+```
+
+此时我们选到的地址是 v2 方法级地址,如果 v2 还是没有地址,根据规则的定义,我们是可以 fallback 到 v3 接口级。
+
+假设我们有一个方法匹配时,如果没有地址,需要不进行 fallback,直接报错,我们可以这样配置
+
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo-route
+spec:
+  hosts:
+  - demo  // 统一定义为应用名 
+  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
+```
+
+从这个规则我们看出来匹配到 some-method  条件时对应的是 v4 subset,那么 v4 为空时,因为没有配置 fallback ,此时会直接报错
+
+#### fallback 处理原则总结
+
+- 我们应该在 VirtualService route 中配置好 Destination 的 fallback 处理逻辑
+- 在 fallback subset 时,如果对应的 subset 也配置有 fallback subset 时,也应递归处理;fallback 
subset 之间的关系也应该是从具体到广泛
+- 我们在编写匹配条件时,应该遵循从 具体条件到广泛条件 的原则
+
+### RouteChain 的组装模式 (目前未实现)
+
+![route-rule3.png](/imgs/user/route-rule3.png)
+
+
+我们看到上面的图,在路由的过程当中,我们是 Pipeline 的处理方式,Pipeline 的 Router 节点存在顺序,并且每个 Router 
都有一个唯一对应的 VirtualService 和 **多个** 相应的 DestinationRule 进行描述。
+
+以 Nacos 上存着的路由规则配置为例,配置的格式如下:
+
+```
+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  name 规范,决定 Router 类型
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo/ScriptRouter
+```
+
+VirtualService 中的 name 属性,应以 `应用名/Router类型定义`
+
+Router类型有以下列表:
+
+| name|  Description |
+| --- | --- |
+| StandardRouter | 完全使用标准 VirtualService 描述的 Router |
+| 待补充 | 待补充 |
+
+
+
+#### VirtualService
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| hosts | string[] |  一般指应用名 | NO  |
+| dubbo | DubboRoute[] | dubbo 路由规则,顺序执行,符合条件立即返回 | NO |
+
+
+#### DubboRoute
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 规则的名字,方便识别规则用意 | NO |
+| services | StringMatch[] | 规则生效的服务名列表,可使用具体的服务名,也可以使用正则 * 
的方式进行匹配;默认不配置,则代表所有的服务都生效 | |
+| fault | dubboFaultInject[] | 故障注入 |  |
+| mirror | Destination | 镜像流量 |  |
+| retries | DubboRetry[]  | 重试相关 |  |
+| timeout | DubboTimeout[] | 超时相关 |  |
+| routedetail | DubboRouteDetail[] | 具体的流量规则,顺序执行,符合条件立即返回 | YES |
+
+
+#### DubboRouteDetail
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string |  | NO |
+| match | DubboMatchRequest[] |  |  |
+| route | DubboRouteDestination[] | | |
+| mirror | Destination |  |  |
+| retries | DubboRetry[]  |  |  |
+| timeout | DubboTimeout[] |  |  | 
+
+
+#### DubboMatchRequest
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string |  | NO |
+| method | DubboMethodMatch | 方法相关的匹配 |  |
+| sourceLabels | map\<string, string\> | 调用端打的相关 lables, 包含应用名、机器分组、机器环境变量信息等; 
对于 HSF-JAVA 来说,可以从上报的 URL 拿到对应的 key/value |  |
+| attachments | DubboAttachmentMatch | 请求附带的其他信息,比如 HSF 请求上下文、Eagleeye 上下文等 |  
|
+| headers | map\<string, StringMatch\> | 通用的请求协议字段等,如接口名、方法名、超时等 |  |
+| threshold | DoubleMatch | 调用的 subset 列表的机器,占整个 host 的阀值 | |
+
+由于 headers 、attachemes 、method 之间可能存在字段一样重复的情况,TODO 进一步细化
+
+#### DubboMethodMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name_match | StringMatch | 匹配请求中的调用方法名 | NO |
+| argc | int | 匹配请求的参数个数 |  |
+| args | DubboMethodArg[]| 为 DubboMethodArg 类型的数组,表示每个参数值需要满足的条件 |  |
+| argp | StringMatch[] | 匹配请求的参数类型 |  |
+| headers | map\<string, StringMatch\> | 预留 |  |
+
+#### DubboMethodArg
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| index | uint32 | 匹配参数的位置,index字段从1开始(即第$index个参数) | YES |
+| type | string | 匹配参数的类型,以java的 string 类型为例,该字段取值 java.lang.String,该字段默认为 
java.lang.String | |
+| str_value | ListStringMatch | 匹配参数的值,根据$type进行解析 ListStringMatcher:匹配 
java.lang.String) | NO |
+| num_value | ListDoubleMatch | 数值类型匹配 | NO |
+| bool_value | BoolMatch | bool 值类型匹配| NO |
+| reserve | reserve  | 复杂类型的匹配,暂时不定义| NO |
+
+
+
+```
+ListOfDubboMethodArgSamples:
+- index: 1
+  str_value:
+      oneof:
+      - regex: "*abc*"
+      - exact: parameter-1
+- index: 2
+  type: java.lang.Double
+  num_value:
+      oneof:
+      - range:
+          start: 100.1
+- index: 3
+  type: java.lang.Boolean
+- index: 4 
+  type: java.lang.Integer
+  num_value:
+      oneof:
+      - range:
+          start: 1
+          end: 100
+```
+
+#### ListStringMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| oneof | StringMatch[] | 任何一个 StringMatch 匹配则匹配 | |
+
+#### StringMatch
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | string (oneof)  | exact string match | |
+| prefix | string (oneof)  | prefix-based match | |
+| regex | string (oneof)  |RE2 style regex-based match 
(https://github.com/google/re2/wiki/Syntax)  | |
+| noempty | string (oneof)  | no empty string | |
+| empty | string (oneof)  | empty string | |
+
+
+#### ListDoubleMatch
+ListDoubleMatch 用于匹配 int/long/double 类型的数值参数
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| oneof | DoubleMatch[] | 任何一个 DoubleMatch 匹配则匹配 | |
+
+#### DoubleMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | double(oneof)  | 数值完全匹配| |
+| range | DoubleRangeMatch(oneof)  | 数值范围匹配 | |
+| mode | double | 取模操作,需要与上面两个语义一起配置使用 | |
+
+#### DoubleRangeMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| start | double | 数值大于或等于 | |
+| end | double  | 数值小于 | |
+
+
+#### BoolMatch
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | bool(oneof) | true/false ,完全匹配 | |
+
+#### ObjectMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| type | string | 匹配参数的类型,以java的 string 类型为例,该字段取值 java.lang.String,该字段默认为 
java.lang.String | |
+| str_value | ListStringMatch | 匹配参数的值,根据$type进行解析 ListStringMatcher:匹配 
java.lang.String) | NO |
+| num_value | ListDoubleMatch | | NO |
+| bool_value | BoolMatch | | NO |
+
+
+
+#### DubboAttachmentMatch
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| eagleeyecontext| map\<string, StringMatch\> | 鹰眼上下文 | NO |
+| dubbocontext| map\<string, StringMatch\> | Dubbo 请求上下文 | NO |
+| reserve | reserve | reserve | reserve | 
+
+#### DubboRouteDestination
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| destination | DubboDestination | 路由目标 Destination  | YES |
+| weight | int  | 路由权重  | NO  |
+
+#### DubboDestination
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| host | string | 注册中心里面对应的 key 值,现在是接口名 |YES|
+| subset | string | | |
+| port | PortSelector| | |
+| fallback | DubboDestination | fallback 到的另外一个地址列表 | |
+
+
+#### DestinationRule
+
+与 DestinationRule 相关的 ServiceEntry/WorkloadEntry 等定义与开源保持一致
+
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| host | string |  |  |
+| trafficPolicy | TrafficPolicy | | |
+| subsets | Subset[] | One or more named sets that represent individual 
versions of a service. Traffic policies can be overridden at subset level. |  |
+
+#### Subset
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string |  |  |
+| labels | map<string, string> | | |
+| trafficPolicy | trafficPolicy | | |
+
+
+### 规则示例
+
+#### 类 groovy 脚本动态路由
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo/StandardRouter
+spec:
+  hosts:
+  - demo
+  dubbo:
+    - services:
+      - exact: com.taobao.hsf.demoservice:1.0.0
+      routedetail:
+       - name: sayHello-route
+         match: 
+          - method:
+             name_match: 
+               exact: "s-method"
+             argc: 5
+             args:
+               - index: 2
+                 type: double
+                 num_value:
+                   oneof:
+                   - range:
+                       start: 100.1
+               - index: 1
+                 type: string 
+                 str_value:
+                   oneof:
+                   - regex: "*abc*"
+                   - exact: parameter-1
+               - index: 3
+                 type: bool
+               - index: 4 
+                 type: int
+                 num_value:
+                   oneof:
+                   - range:
+                       start: 1
+                       end: 100
+          - sourcelables:
+             sigma.ali/appName: "ump2"
+         route:
+          - destination:
+             host: demo
+             subset: v1
+             fallback:
+               host:demo 
+               subset: v2
+
+       - name: default-route
+         route:
+          - destination: 
+            host: demo 
+            subset: v2
+---
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+  name: reviews-route
+spec:
+  host: demo
+  subsets:
+    - name: v1
+      labels:
+        sigma.ali/mg: v1-host
+    - name: v2
+      labels:
+        sigma.ali/mg: v2-host
+```
+
+#### 权重路由
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: reviews-route
+spec:
+  hosts:
+  - reviews.prod.svc.cluster.local
+  dubbo:
+    - name: weightRoute
+      routedetail:
+       - name: weght
+         route:
+          - destination:
+             host: reviews.prod.svc.cluster.local
+             subset: v1
+             weight: 60
+
+          - destination:
+             host: reviews.prod.svc.cluster.local
+             subset: v2
+             weight: 40
+
+
+---
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+  name: reviews-route
+spec:
+  host: reviews.prod.svc.cluster.local
+  subsets:
+    - name: v1
+      labels:
+        version: v1
+    - name: v2
+      labels:
+        version: v2
+```
+
+
+### 具体示例
+
+现有名为 Demo 的应用,
+提供的服务有:
+
+```
+com.taobao.hsf.DemoService:1.0.0
+
+```
+
+服务提供者 IP 列表及 URL 如下
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+
+10.0.0.4:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+10.0.0.5:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+
+10.0.0.6:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+10.0.0.7:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+
+10.0.0.8:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.9:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.10:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+
+```
+
+```
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo/UnitRouter
+spec:
+  hosts:
+  - demo
+  dubbo:
+    - name: UnitServiceRoute
+      services:
+        - exact: com.taobao.hsf.DemoService:1.0.0
+      routedetail:
+       - name: center-env
+         match:
+          - context:
+              hsfcontext:
+                user_unit: 
+                  exact: CENTER
+         route:
+          - destination:
+              host: demo
+              subset: CENTER
+              fallback: // 单元化没有 fallback,直接报错
+       - name: unsh-env
+         match:
+          - context:
+              hsfcontext:
+                user_unit: 
+                  exact: UNSH
+            route:
+             - destination:
+                 host: demo
+                 subset: UNSH
+       - name: unsz-env
+         match:
+          - context:
+              hsfcontext:
+                user_unit: 
+                  exact: UNSZ
+            route:
+             - destination:
+                 host: demo
+                 subset: UNSZ
+       - name: zbmix-env
+         match:
+          - context:
+              hsfcontext:
+                user_unit: 
+                  exact: ZBMIX
+            route:
+             - destination:
+                 host: demo
+                 subset: ZBMIX
+
+---- 
+
+
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+  name: demo/UnitRouter
+spec:
+  host: demo // 这个和上面的保持一致
+  subsets:
+    - name: CENTER
+      labels:
+        sigma.ali/unit: CENTER
+    - name: UNSH
+      labels:
+        sigma.ali/unit: UNSH
+    - name: UNSZ
+      labels:
+        sigma.ali/unit: UNSZ
+    - name: ZBMIX
+      labels:
+        sigma.ali/unit: ZBMIX
+
+
+----
+
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+  name: demo/MachineRouter
+spec:
+  hosts:
+  - demo
+  dubbo:
+    - name: MachineRoomRouteDefault // 同机房
+      services:
+        - regex: *
+      routedetail:
+       - name: na61-samesite-route  // 把 na61 机房的流量打到 na61、na610 机房
+         match:
+          - sourcelables:
+              sigma.ali/site: na61
+         route:              
+           - destination:
+              host: demo
+              subset: na61
+           - destination:
+              host: demo
+              subset: na610
+              weight: 40
+       - name: na62-samesite-route  // 把 na62 机房的流量打到 na62 机房
+         match:
+          - sourcelables:
+             sigma.ali/site: na62
+         route:              
+          - destination:
+             host: demo
+             subset: na62
+       - name: default // 兜底路由,其他机房的流量随意打
+         route:
+          - destination:
+             host: demo
+    .....
+
+--------
+
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+  name: demo/MachineRouter
+spec:
+  host: demo// 这个和上面的保持一致
+  subsets:
+    - name: na61
+      labels:
+        sigma.ali/site: na61
+    - name: na610
+      labels:
+        sigma.ali/site: na610
+    - name: na62
+      labels:
+        sigma.ali/site: na62
+    - name: na620
+      labels:
+        sigma.ali/site: na620
+    .....
+
+```
+
+
+
+以上面的配置为例,假设消费者在 CENTER 标的 na62 机房,请求上下文中的 user_unit 属于 CENTER
+
+那么我们有以下路由流程:
+
+我们经过 UnitRouter 时,地址被划分为四个部份
+
+CENTER:
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+
+UNSH
+
+```
+10.0.0.4:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+10.0.0.5:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+
+```
+
+
+
+UNSZ
+
+```
+10.0.0.6:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+10.0.0.7:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+
+```
+
+UNZBMIX
+
+```
+10.0.0.8:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.9:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.10:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+
+```
+
+因为 user_unit 属于 CENTER ,所以我们选择 CENTER 的部分,作为 MachineRoomRouter 的地址输入,即为
+
+CENTER
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+在第二步中,MachineRoomRoute 可以被划分为五个部份
+
+
+na61
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+
+na610
+
+```
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+na62
+
+```
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.8:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.9:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.10:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+
+```
+
+na620
+
+```
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+fallback
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+
+10.0.0.4:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+10.0.0.5:12200?_p=hessian2&APP=demo&st=et12&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSH
+
+10.0.0.6:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+10.0.0.7:12200?_p=hessian2&APP=demo&st=SA128&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNSZ
+
+10.0.0.8:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.9:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.10:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+
+```
+
+由于消费者在 na62 机房发起调用,匹配了
+
+```
+       - name: na62-samesite-route  // 把 na62 机房的流量打到 na62 机房
+         match:
+          - sourcelables:
+             sigma.ali/site: na62
+         route:              
+          - destination:
+             host: demo
+             subset: na62
+
+```
+
+
+这个规则,那么就是选取
+
+na62
+
+```
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.8:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.9:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+10.0.0.10:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=UNZBMIX
+
+```
+
+而 UnitRouter 给 MachineRoomRouter 的输入为
+
+CENTER
+
+```
+10.0.0.1:12200?_p=hessian2&APP=demo&st=na61&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.3:12200?_p=hessian2&APP=demo&st=na610&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+10.0.0.4:12200?_p=hessian2&APP=demo&st=na620&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+
+两个取交集的结果为
+
+```
+ 
10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
+这个结果将做为一下路由的输出,重复前面的动作;
+
+如果这个路由规则已经结束,那么调用的地址将为
+
+```
+10.0.0.2:12200?_p=hessian2&APP=demo&st=na62&v=2.0&_TIMEOUT=3000&_ih2=y&mg=demohost&_CONNECTTIMEOUT=1000&_SERIALIZETYPE=hessian&ut=CENTER
+
+```
+
diff --git a/static/imgs/user/route-rule1.png b/static/imgs/user/route-rule1.png
new file mode 100644
index 0000000..2554e04
Binary files /dev/null and b/static/imgs/user/route-rule1.png differ
diff --git a/static/imgs/user/route-rule2.png b/static/imgs/user/route-rule2.png
new file mode 100644
index 0000000..c3e56cf
Binary files /dev/null and b/static/imgs/user/route-rule2.png differ
diff --git a/static/imgs/user/route-rule3.png b/static/imgs/user/route-rule3.png
new file mode 100644
index 0000000..2554e04
Binary files /dev/null and b/static/imgs/user/route-rule3.png differ

Reply via email to