You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2021/06/17 09:59:20 UTC
[dubbo-website] branch master updated: docs: Supplement the
documentation related traffic management and routing rule (#829)
This is an automated email from the ASF dual-hosted git repository.
liujun 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 c1a13c3 docs: Supplement the documentation related traffic management and routing rule (#829)
c1a13c3 is described below
commit c1a13c32876a402c6a3d448fd28e4fcf59c80754
Author: Xiong, Pin <pi...@foxmail.com>
AuthorDate: Thu Jun 17 04:59:11 2021 -0500
docs: Supplement the documentation related traffic management and routing rule (#829)
1. introduce what traffic management
2. improve routing rule's description partly
3. adjust the structure of traffic managememt and routing rule
---
.../zh/docs/v3.0/concepts/traffic-management.md | 25 +-
content/zh/docs/v3.0/examples/routing-rule.md | 944 ---------------------
content/zh/docs/v3.0/examples/routing/_index.md | 7 +
.../v3.0/examples/routing/ab-testing-deployment.md | 19 +
.../v3.0/examples/routing/blue-green-deployment.md | 19 +
.../v3.0/examples/routing/canary-deployment.md | 20 +
.../v3.0/examples/routing/demo-rule-deployment.md | 349 ++++++++
.../examples/routing/dynamic-rule-deployment.md | 78 ++
.../examples/routing/weight-rule-deployment.md | 48 ++
content/zh/docs/v3.0/references/routers/_index.md | 265 +++++-
.../v3.0/references/routers/destination-rule.md | 94 ++
.../zh/docs/v3.0/references/routers/routerule.md | 944 ---------------------
.../docs/v3.0/references/routers/virtualservice.md | 481 +++++++++++
.../imgs/v3/concepts/what-is-traffic-control.png | Bin 0 -> 307011 bytes
14 files changed, 1402 insertions(+), 1891 deletions(-)
diff --git a/content/zh/docs/v3.0/concepts/traffic-management.md b/content/zh/docs/v3.0/concepts/traffic-management.md
index 5ccff84..3921b6d 100644
--- a/content/zh/docs/v3.0/concepts/traffic-management.md
+++ b/content/zh/docs/v3.0/concepts/traffic-management.md
@@ -6,4 +6,27 @@ weight: 3
description: "通过 Dubbo 定义的路由规则,实现对流量分布的控制"
---
-流量控制
\ No newline at end of file
+### 流量管理
+
+`Dubbo`提供了强大的流量管理能力。流量管理的本质是将请求根据制定好的路由规则分发到应用服务上,如下图所示:
+
+![What is traffic control](/imgs/v3/concepts/what-is-traffic-control.png)
+
+其中:
++ 路由规则可以有多个,不同的路由规则之间存在优先级。如:Router(1) -> Router(2) -> …… -> Router(n)
++ 一个路由规则可以路由到多个不同的应用服务。如:Router(2)即可以路由到Service(1)也可以路由到Service(2)
++ 多个不同的路由规则可以路由到同一个应用服务。如:Router(1)和Router(2)都可以路由到Service(2)
++ 路由规则也可以不路由到任何应用服务。如:Router(m)没有路由到任何一个Service上,所有命中Router(m)的请求都会因为没有对应的应用服务处理而导致报错
++ 应用服务可以是单个的实例,也可以是一个应用集群。
+
+### 应用场景
+`Dubbo`支持生产上常用的流量应用场景。
+
+##### 蓝绿部署
+蓝绿部署是让线上的老版本继续运行,直接部署新版本然后进行测试,当新版本测试通过以后,将流量切到新版本,最后将老版本同时也升级到新版本。整个过程无需停机,风险较小且可控。
+
+##### AB测试
+AB测试是用来测试应用功能的一种方案。通过科学的实验设计、样本采样、流量分割和校验等方式来获得具有代表性的实验结论,并确信该结论再推广到全部流量可信。
+
+##### 金丝雀部署
+金丝雀部署是在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”,测试新版本的性能和表现,在保障整体系统稳定的前提下,尽早发现、及时调整。
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing-rule.md b/content/zh/docs/v3.0/examples/routing-rule.md
deleted file mode 100644
index 65da3c5..0000000
--- a/content/zh/docs/v3.0/examples/routing-rule.md
+++ /dev/null
@@ -1,944 +0,0 @@
----
-type: docs
-title: "路由规则"
-linkTitle: "路由规则"
-weight: 12
-description: "使用路由规则管控服务流量。"
----
-
-### 基本思想:基于路由链,采用 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/content/zh/docs/v3.0/examples/routing/_index.md b/content/zh/docs/v3.0/examples/routing/_index.md
new file mode 100644
index 0000000..e1bc90f
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/_index.md
@@ -0,0 +1,7 @@
+---
+type: docs
+title: "路由规则"
+linkTitle: "路由规则"
+weight: 12
+description: "Dubbo在不同场景下使用的路由方案"
+---
diff --git a/content/zh/docs/v3.0/examples/routing/ab-testing-deployment.md b/content/zh/docs/v3.0/examples/routing/ab-testing-deployment.md
new file mode 100644
index 0000000..29a87e6
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/ab-testing-deployment.md
@@ -0,0 +1,19 @@
+---
+type: docs
+title: "Ab测试"
+linkTitle: "Ab测试"
+weight: 30
+description: "在线上的老版本继续运行的前提下,直接部署新版本然后进行测试,当新版本测试通过以后,将流量切到新版本,最后将老版本同时也升级到新版本。"
+---
+
+#### 场景描述
+描述当前IDC、服务部署、服务信息、希望实现的效果等相关情况
+#### 操作工艺
+
++ 步骤1
+ + 路由配置
+ + 验证方案
+
++ 步骤2
+ + 路由配置
+ + 验证方案
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing/blue-green-deployment.md b/content/zh/docs/v3.0/examples/routing/blue-green-deployment.md
new file mode 100644
index 0000000..17a207e
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/blue-green-deployment.md
@@ -0,0 +1,19 @@
+---
+type: docs
+title: "蓝绿部署"
+linkTitle: "蓝绿部署"
+weight: 20
+description: "在线上的老版本继续运行的前提下,直接部署新版本然后进行测试,当新版本测试通过以后,将流量切到新版本,最后将老版本同时也升级到新版本。"
+---
+
+#### 场景描述
+描述当前IDC、服务部署、服务信息、希望实现的效果等相关情况
+#### 操作工艺
+
++ 步骤1
+ + 路由配置
+ + 验证方案
+
++ 步骤2
+ + 路由配置
+ + 验证方案
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing/canary-deployment.md b/content/zh/docs/v3.0/examples/routing/canary-deployment.md
new file mode 100644
index 0000000..57fc22b
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/canary-deployment.md
@@ -0,0 +1,20 @@
+---
+type: docs
+title: "金丝雀部署"
+linkTitle: "金丝雀部署"
+weight: 40
+description: "在原有版本可用的情况下,同时部署一个新版本应用作为“金丝雀”,测试新版本的性能和表现,在保障整体系统稳定的前提下,尽早发现、及时调整。"
+---
+
+
+#### 场景描述
+描述当前IDC、服务部署、服务信息、希望实现的效果等相关情况
+#### 操作工艺
+
++ 步骤1
+ + 路由配置
+ + 验证方案
+
++ 步骤2
+ + 路由配置
+ + 验证方案
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing/demo-rule-deployment.md b/content/zh/docs/v3.0/examples/routing/demo-rule-deployment.md
new file mode 100644
index 0000000..85a9471
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/demo-rule-deployment.md
@@ -0,0 +1,349 @@
+---
+type: docs
+title: "使用案例"
+linkTitle: "使用案例"
+weight: 18
+description: "基于实际情况来制定路由规则。"
+---
+
+#### 应用服务
+
+```yaml
+com.taobao.hsf.DemoService:1.0.0
+```
+
+#### 服务地址
+
+```yaml
+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
+
+```
+#### 路由规则
+
+```yaml
+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:
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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
+
+```yaml
+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 机房发起调用,匹配了
+
+```yaml
+ - name: na62-samesite-route // 把 na62 机房的流量打到 na62 机房
+ match:
+ - sourcelables:
+ sigma.ali/site: na62
+ route:
+ - destination:
+ host: demo
+ subset: na62
+
+```
+
+
+这个规则,那么就是选取
+
+na62
+
+```yaml
+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
+
+```yaml
+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
+
+```
+
+
+两个取交集的结果为
+
+```yaml
+ 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
+
+```
+
+这个结果将做为一下路由的输出,重复前面的动作;
+
+如果这个路由规则已经结束,那么调用的地址将为
+
+```yaml
+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
+
+```
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing/dynamic-rule-deployment.md b/content/zh/docs/v3.0/examples/routing/dynamic-rule-deployment.md
new file mode 100644
index 0000000..fc71c2c
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/dynamic-rule-deployment.md
@@ -0,0 +1,78 @@
+---
+type: docs
+title: "动态路由"
+linkTitle: "动态路由"
+weight: 15
+description: "类groovy脚本动态路由。"
+---
+
+```yaml
+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
+```
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/examples/routing/weight-rule-deployment.md b/content/zh/docs/v3.0/examples/routing/weight-rule-deployment.md
new file mode 100644
index 0000000..65a4d1c
--- /dev/null
+++ b/content/zh/docs/v3.0/examples/routing/weight-rule-deployment.md
@@ -0,0 +1,48 @@
+
+---
+type: docs
+title: "权重路由"
+linkTitle: "权重路由"
+weight: 16
+description: "基于用户自定权重实现路由功能。"
+---
+
+```yaml
+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
+```
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/references/routers/_index.md b/content/zh/docs/v3.0/references/routers/_index.md
index 04fd14e..1bf9ff8 100644
--- a/content/zh/docs/v3.0/references/routers/_index.md
+++ b/content/zh/docs/v3.0/references/routers/_index.md
@@ -3,5 +3,266 @@ type: docs
title: "路由规则"
linkTitle: "路由规则"
weight: 40
-description: "Dubbo 支持的路由类型及配合方式"
----
\ No newline at end of file
+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 处理,保证业务在正确性的前提下,能够顺利找到有效地址。
+
+首先我们看一下以下规则
+
+```yaml
+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,如果是空,我们可以向上一级是寻找地址,也就是方法级去寻找地址,具体的配置为下
+
+```yaml
+ - 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,直接报错,我们可以这样配置
+
+
+```yaml
+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 上存着的路由规则配置为例,配置的格式如下:
+
+```yaml
+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 链的组装。
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/references/routers/destination-rule.md b/content/zh/docs/v3.0/references/routers/destination-rule.md
new file mode 100644
index 0000000..57b563a
--- /dev/null
+++ b/content/zh/docs/v3.0/references/routers/destination-rule.md
@@ -0,0 +1,94 @@
+---
+type: docs
+title: "DestinationRule"
+linkTitle: "DestinationRule"
+weight: 40
+description: "目标地址规则"
+---
+
+
+#### DestinationRule
+`DestinationRule`用来处理目标地址的规则,与`DestinationRule`相关的`ServiceEntry`, `WorkloadEntry`等定义与开源保持一致
++ 使用示例
+
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+ name: demo-route
+spec:
+ host: demo
+ subsets:
+ trafficPolicy:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 规则的名字,方便识别规则用意 | YES |
+| host | string | 注册中心里面对应的key值,现在是接口名 | YES |
+| trafficPolicy | TrafficPolicy | 流量策略 | NO |
+| subsets | Subset[] | 服务的单一版本或多版本的命名 | YES |
+
+#### Subset
+`Subset`应用服务的命名,可以是单个也可以是多个版本
++ 使用示例
+
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+ name: demo-route
+spec:
+ subsets: #Subnet[]
+ - name:
+ labels:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 服务版本名称 | YES |
+| labels | map<string, string> | 打在服务身上的标签 | YES |
+
+#### TrafficPolicy
+`TrafficPolicy`表示负载均衡策略
++ 使用示例
+
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+ name: demo-route
+spec:
+ trafficPolicy: #TrafficPolicy
+ loadBalancer:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| loadBalancer | LoadBalancerSettings | 负载均衡设置 | YES |
+
+#### LoadBalancerSettings
+`LoadBalancerSettings`用来表示负载均衡相关的配置
++ 使用示例
+
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: DestinationRule
+metadata:
+ name: demo-route
+spec:
+ trafficPolicy:
+ loadBalancer: #LoadBalancerSettings
+ simple:
+ consistentHash:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| simple | string | 负载均衡策略,其中包括:`ROUND_ROBIN`, `LEAST_CONN`, `RANDOM`, `PASSTHROUGH` | YES |
+| consistentHash | ConsistentHashLB | 一致性Hash策略(未实现) NO
+ | NO |
\ No newline at end of file
diff --git a/content/zh/docs/v3.0/references/routers/routerule.md b/content/zh/docs/v3.0/references/routers/routerule.md
deleted file mode 100644
index 11a3b0e..0000000
--- a/content/zh/docs/v3.0/references/routers/routerule.md
+++ /dev/null
@@ -1,944 +0,0 @@
----
-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/content/zh/docs/v3.0/references/routers/virtualservice.md b/content/zh/docs/v3.0/references/routers/virtualservice.md
new file mode 100644
index 0000000..b02f6e4
--- /dev/null
+++ b/content/zh/docs/v3.0/references/routers/virtualservice.md
@@ -0,0 +1,481 @@
+---
+type: docs
+title: "VirtualService"
+linkTitle: "VirtualService"
+weight: 30
+description: "入站流量的规则"
+---
+
+#### VirtualService
+`VirtualService`是用来处理入站流量的规则,也就是说用来描述哪些入站流量适用于该路由规则。
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 应以 `应用名/Router类型`的方式来命名。`name`属性一经定义Router类型就确定下来了 | YES |
+| hosts | string[] | 一般指应用名 | NO |
+| dubbo | DubboRoute[] | dubbo 路由规则,顺序执行,符合条件立即返回 | NO |
+
+Router类型如下:
+
+| name| Description |
+| --- | --- |
+| StandardRouter | 完全使用标准 VirtualService 描述的 Router |
+| 待补充 | 待补充 |
+
+
+#### DubboRoute
+`DubboRoute`是`VirtualService`中的属性,用来描述路由策略的边界。
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo: #DubboRoute
+ - name:
+ service:
+ fault:
+ mirror:
+ retries:
+ timeout:
+ routedetail:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 规则的名字,方便识别规则用意 | NO |
+| services | StringMatch[] | 规则生效的服务名列表,可使用具体的服务名,也可以使用正则 * 的方式进行匹配;默认不配置,则代表所有的服务都生效 | |
+| fault | dubboFaultInject[] | 故障注入(未实现) | NO |
+| mirror | Destination | 镜像流量(未实现) | NO |
+| retries | DubboRetry[] | 重试相关(未实现) | NO |
+| timeout | DubboTimeout[] | 超时相关(未实现) | NO |
+| routedetail | DubboRouteDetail[] | 具体的流量规则,顺序执行,符合条件立即返回 | YES |
+
+#### DubboRouteDetail
+`DubboRouteDetail`用来描述详细的路由规则
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail: #DubboRouteDetail
+ - name:
+ match:
+ route:
+ mirror:
+ retries:
+ timeout:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 规则详情的名字,方便识别规则用意 | NO |
+| match | DubboMatchRequest[] | 匹配条件 | YES |
+| route | DubboRouteDestination[] | 符合条件的流量的实际目标地址 | YES |
+| mirror | Destination | 镜像流量(未实现) | NO |
+| retries | DubboRetry[] | 重试相关(未实现) | NO |
+| timeout | DubboTimeout[] | 超时相关(未实现) | NO |
+
+
+#### DubboMatchRequest
+`DubboMatchRequest`用来描述请求的匹配规则
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match: #DubboMatchRequest
+ - name:
+ method:
+ sourceLabels:
+ attachments:
+ headers:
+ threshold:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name | string | 匹配规则名称 | YES |
+| method | DubboMethodMatch | 方法相关的匹配 | YES |
+| sourceLabels | map\<string, string\> | 调用端打的相关 lables, 包含应用名、机器分组、机器环境变量信息等; 对于 HSF-JAVA 来说,可以从上报的 URL 拿到对应的 key/value | YES |
+| attachments | DubboAttachmentMatch | 请求附带的其他信息,比如 HSF 请求上下文、Eagleeye 上下文等 | NO |
+| headers | map\<string, StringMatch\> | 通用的请求协议字段等,如接口名、方法名、超时等 | NO |
+| threshold | DoubleMatch | 调用的 subset 列表的机器,占整个 host 的阀值 | NO |
+
+由于 headers 、attachemes 、method 之间可能存在字段一样重复的情况,TODO 进一步细化
+
+#### DubboMethodMatch
+`DubboMethodMatch`是用来实现方法的匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method: #DubboMethodRequest
+ - name_match:
+ argc:
+ args:
+ argp:
+ headers:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| name_match | StringMatch | 匹配请求中的调用方法名 | YES |
+| argc | int | 匹配请求的参数个数 | NO |
+| args | DubboMethodArg[]| 为 DubboMethodArg 类型的数组,表示每个参数值需要满足的条件 | NO |
+| argp | StringMatch[] | 匹配请求的参数类型 | NO |
+| headers | map\<string, StringMatch\> | 预留 | NO |
+
+#### DubboMethodArg
+`DubboMethodArg`用来实现方法参数的匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args: #DubboMethodArg
+ - index:
+ str_value:
+ type:
+ num_value:
+ bool_value:
+ reserve:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| index | uint32 | 匹配参数的位置,index字段从1开始(即第$index个参数) | YES |
+| type | string | 匹配参数的类型,以java的 string 类型为例,该字段取值 java.lang.String,该字段默认为 java.lang.String | YES |
+| str_value | ListStringMatch | 匹配参数的值,根据$type进行解析 ListStringMatcher:匹配 java.lang.String) | NO |
+| num_value | ListDoubleMatch | 数值类型匹配 | NO |
+| bool_value | BoolMatch | bool 值类型匹配| NO |
+| reserve | reserve | 复杂类型的匹配,暂时不定义| NO |
+
+
+#### DubboAttachmentMatch
+`DubboAttachmentMatch`用来对任意对象的完全匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - attachments: #DubboAttachmentMatch
+ eagleeyecontext:
+ dubbocontext:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| eagleeyecontext| map\<string, StringMatch\> | 鹰眼上下文 | NO |
+| dubbocontext| map\<string, StringMatch\> | Dubbo 请求上下文 | NO |
+
+#### ListStringMatch
+`ListStringMatch`是一组`StringMatch`集合,任何一个 `StringMatch`匹配则匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ str_value: #ListStringMatch
+ oneof:
+ - regex: "*abc*"
+ - exact: parameter-1
+```
+
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| oneof | StringMatch[] | 任何一个`StringMatch`匹配则匹配 | NO |
+
+#### StringMatch
+`StringMatch`用来描述字符串匹配规则
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - service: #StringMatch
+ - exact: org.apache.dubbo.demoService:1.0.0
+ - prefix: org.apache.dubbo.hello
+ - regex: org.apache.dubbo.*Service:2.0.0
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | string (oneof) | 完全匹配 | NO |
+| prefix | string (oneof) | 前缀匹配 | NO |
+| regex | string (oneof) | [正则匹配](https://github.com/google/re2/wiki/Syntax) | NO |
+| noempty | string (oneof) | 非空字符匹配 | NO |
+| empty | string (oneof) | 空字符匹配 | NO |
+
+
+#### ListDoubleMatch
+`ListDoubleMatch`是一组`DoubleMatch`集合,任何一个 `DoubleMatch`匹配则匹配参数
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ type: java.lang.Double
+ num_value: #ListDoubleMatch
+ oneof:
+ - range:
+ start: 1
+ end: 100
+
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| oneof | DoubleMatch[] | 任何一个`DoubleMatch`匹配则匹配 | NO |
+
+#### DoubleMatch
+`DoubleMatch`用于匹配 `int`, `long`, `double`类型的数值
+
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ type: java.lang.Double
+ num_value:
+ oneof: #DoubleMatch[]
+ - range:
+ start: 1
+ end: 100
+ #假设当前输入的Double类型的参数值为x,
+ #则下面表达式的意思是:x%mode=exact,
+ #即当x%10=6才匹配
+ - exact: 6
+ mode: 10
+
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | double(oneof) | 数值完全匹配| NO |
+| range | DoubleRangeMatch(oneof) | 数值范围匹配 | NO |
+| mode | double | 取模操作,需要与上面两个语义一起配置使用 | NO |
+
+#### DoubleRangeMatch
+`DoubleRangeMatch`是对`double`值的范围进行匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ type: java.lang.Double
+ num_value:
+ oneof:
+ - range: #DoubleRangeMatch
+ start: 1.2
+ end: 1000.5
+
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| start | double | 数值大于或等于 | YES |
+| end | double | 数值小于 | YES |
+
+
+#### BoolMatch
+`BoolMatch`用来对`true`, `false`的完全匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ type: java.lang.Boolean
+ bool_value: #BoolMatch
+ - exact: true
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| exact | bool(oneof) | `true`, `false` ,完全匹配 | |
+
+#### ObjectMatch(未实现)
+`ObjectMatch`用来对任意对象的完全匹配
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - match:
+ - method:
+ - args:
+ - index: 1
+ type: java.lang.String
+ str_value:
+ oneof:
+ - regex: "*abc*"
+ - exact: parameter-1
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| type | string | 匹配参数的类型,以java的 string 类型为例,该字段取值 java.lang.String,该字段默认为 java.lang.String | YES |
+| str_value | ListStringMatch | 匹配参数的值,根据$type进行解析 ListStringMatcher:匹配 java.lang.String) | NO |
+| num_value | ListDoubleMatch | | NO |
+| bool_value | BoolMatch | | NO |
+
+#### DubboRouteDestination
+`DubboRouteDestination`用来描述流量到目标地址的策略
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - route: #DubboRouteDestination
+ destination:
+ weight: 50
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| destination | DubboDestination | 路由目标 Destination | YES |
+| weight | int | 路由权重 | NO |
+
+#### DubboDestination
+`DubboDestination`用来描述路由流量的目标地址
++ 使用示例
+```yaml
+apiVersion: service.dubbo.apache.org/v1alpha1
+kind: VirtualService
+metadata:
+ name: demo/StandardRouter
+spec:
+ hosts:
+ dubbo:
+ - routedetail:
+ - route: #DubboRouteDestination
+ destination:
+ host:
+ subnet:
+ port:
+ fallback:
+```
++ 属性说明
+
+| Field | Type | Description | Required |
+| --- | --- | --- | --- |
+| host | string | 注册中心里面对应的`key`值,现在是接口名 |YES|
+| subset | string | 地址列表 | YES |
+| port | int| 端口号 | YES |
+| fallback | DubboDestination | fallback到的另外一个地址列表 | NO |
\ No newline at end of file
diff --git a/static/imgs/v3/concepts/what-is-traffic-control.png b/static/imgs/v3/concepts/what-is-traffic-control.png
new file mode 100644
index 0000000..7b98460
Binary files /dev/null and b/static/imgs/v3/concepts/what-is-traffic-control.png differ