# 预发布灰度发布

从1.14.0开始支持预发布、灰度发布，可登陆`SOP-Admin`，然后选择`服务列表`进行操作。

## 使用预发布

SOP中预发布的思路如下：

假设网关工程sop-gateway在阿里云负载均衡有两台服务器，域名分别为：

|域名|说明|
|:---- |:----  |
|open1.domain.com  |网关服务器1  |
|openpre.domain.com | 网关服务器2，作为预发布请求入口|

SLB对外域名为：`open.domain.com`，即开放平台入口为：`http://open.domain.com`

访问`open.domain.com`会负载均衡到`open1.domain.com`和`openpre.domain.com`这两台实例

如果单独从`openpre.domain.com`访问，则会访问到预发布微服务。

SOP开启预发布步骤如下：

修改网关工程配置文件，指定预发布域名

```properties
# 预发布网关域名，多个用英文逗号（,）隔开
pre.domain=openpre.domain.com
```

重启网关


微服务启动参数添加：`--spring.cloud.nacos.discovery.metadata.env=pre`（eureka下是：`--eureka.instance.metadata-map.env=pre`）。
建议线上配两套启动脚本，其中预发布启动脚本添加启动参数`--spring.cloud.nacos.discovery.metadata.env=pre`

登录SOP-Admin，在服务列表中点击预发布。

从`openpre.domain.com`请求进来的用户都会进预发布服务器，从SLB域名进来请求路由到非预发服务器

## 使用灰度发布

灰度发布可允许指定的用户访问灰度服务器，其它用户还是走正常流程。

登录SOP-Admin，前往`服务列表`。

- 先设置灰度参数，指定灰度appId和灰度接口
- 服务器实例开启灰度


参考类：

- LoadBalanceServerChooser.java 预发布/灰度发布服务实例选择

### 自定义判断灰度用户

默认根据`appId`和`IP`来判断灰度用户，如果要通过其它维度来判断是否是灰度用户，可实现GrayUserBuilder接口，
然后在springboot main方法中调用如下方法

```java
ApiConfig.getInstance().addGrayUserBuilder(new XXGrayUserBuilder());
```
参考：com.gitee.sop.gatewaycommon.loadbalancer.builder.AppIdGrayUserBuilder.java