
# 使用灰度发布
#### 流量灰度
为保障新特性平稳上线，可以先选择少部分用户试用，待新特性成熟以后，再让所有用户使用。灰度发布可以保证整体系统的稳定，在初始灰度的时候就可以发现、调整问题，以减少其影响。
基于Servicecomb Java Chassis和Spring Cloud Huawei框架注册到微服务引擎的微服务，使用灰度功能只需通过配置下发即可使用。
Servicecomb Java Chassis依赖handler-router和Spring Cloud Huawei依赖spring-cloud-starter-huawei-router实现微服务灰度能力，下发规则遵守如下规范：
```
servicecomb:
    routeRule:  
      provider: | #服务名
        - precedence: 2 #优先级
          match:        #匹配策略
            headers:          #header匹配
              region:            
                exact: 'providerRegion'
              type:         
                exact: gray
          route: #路由规则
            - weight: 100 #权重值
              tags:
                version: 1.0.0
              
        - precedence: 1
          route:
            - weight: 20
              tags:
                version: 0.0.1
                canaryProperty: group-a
            - weight: 80
              tags:
                version: 0.0.2
```
上述配置的具体含义如下：
- 匹配特定请求由match配置，匹配条件是headers。headers中的字段的匹配支持精准匹配。如果未定义match，则可匹配任何请求。
- 转发权重定义在routeRule.{targetServiceName}.route下，由weight配置，weight数值表示百分数，需要满足加和等于100，不满足100的部分会用最新版本填充。
- 服务分组定义在routeRule.{targetServiceName}.route下，由tags配置，version是特殊的tag，表示微服务版本。还可以配置其他属性，这些属性在实例的属性里面定义。
- 优先级数量越大优先级越高。
Servicecomb Java Chassis依赖darklaunch实现的微服务灰度能力，也是当前微服务引擎页面下发的规则，遵守如下规范：
```
{
  "policyType":"RULE",
  "ruleItems":[
    {
      "groupName":"self_rule_test",
      "groupCondition":"version=0.0.1",
      "policyCondition":"name=11111",
      "versions":["0.0.1"]
     }],
   "empty":false
}
```
上述配置的具体含义如下：
- policyCondition路由规则匹配条件，本条规则匹配的是请求参数为name，值为11111时匹配当前路由规则。
- groupName路由规则名称。
- groupCondition规则的目标分组，本条路由规则在匹配到name=11111的条件下，路由到version=0.0.1的微服务实例。
- 配置项固定为：cse.darklaunch.policy.${serviceName}。
**Spring Cloud Huawei** **：**
Spring Cloud Huawei使用灰度发布，需要在项目中增加如下依赖。如果项目中已经直接或者间接引入依赖，无需重复引入。
```
<dependency>
  <groupId>com.huaweicloud</groupId>
  <artifactId>spring-cloud-starter-huawei-router</artifactId>
</dependency>
```
灰度规则依赖的headers参数设置：
- 1.10.7及之后版本header参数需要在配置文件中设置，用户请求当中的header不会透传到下游服务：
  ```
  spring:
    cloud:
      servicecomb:
        context:
          headerContextMapper:
            canary: canary
  ```
  
- 1.10.7之前的版本设置header参数：请求中设置的header参数进行透传。
**Java Chassis**：
Java Chassis使用灰度发布，需要在项目中增加如下依赖。如果项目中已经直接或者间接引入依赖，无需重复引入。
```
<dependency>
  <groupId>org.apache.servicecomb</groupId>
  <artifactId>handler-router</artifactId>
</dependency>
```
或者
```
<dependency>
    <groupId>org.apache.servicecomb</groupId>
    <artifactId>darklaunch</artifactId>
</dependency>
```
并在配置文件中增加配置项：
```
servicecomb.router.type: router
```
Java Chassis默认不会传递非参数header到各个微服务，如果灰度发布依赖于非参数header，可以增加如下配置项：
```
servicecomb.router.header: canaryHeader1,canaryHeader2
```
Java Chassis会将这些非参数header用于灰度发布的匹配。
如果请求经过Edge Service转发，Edge Service也需要增加灰度发布相关的配置。
