灰度部署
业务背景
- 支持SaaS租户级&用户级的功能灰度发布
- 支持微服务(节点多,域名多)的部分应用灰度发布
- 多应用共用域名(一个域名供多个服务和前端站点使用)
在阅读本文前,请先浏览: 灰度部署方案设计
实现步骤:
- 在配置服务中新增:1个全局参数
- 在配置服务中新增:2个配置文件
- 部署 Nebula.GateWay 服务
- 登录时指定用户的灰度标记
1,配置参数
在配置服务中新增全局参数:
Nebula_GrayDeploy_Enable = 1
2,配置文件
在配置服务中,新增2个配置文件。
1)Nebula.GateWay.ProxyMapRule.xml
配置示例
<ProxyMapRule>
<Rules>
<rule src="http://app1.com/v20/api/[any]" dest="http://app1/v20/api/[any]" /> <!-- 后端服务 -->
<rule src="http://app1.com/[any]" dest="http://app1-ui/[any]" /> <!-- 前端站点 -->
<rule src="http://*.app1.com/[any]" dest="http://app1-ui/[any]" /> <!-- 前端站点 -->
<rule src="http://app2.com/v20/api/[any]" dest="http://app2/v20/api/[any]" /> <!-- 后端服务 -->
<rule src="http://app2.com/[any]" dest="http://app2-ui/[any]" /> <!-- 前端站点 -->
</Rules>
</ProxyMapRule>
说明:
- src: 是指请求的传入地址,通常是外网地址
- dest: 是指转发到内网的地址
- [any] 表示可匹配任何字符,它可同时用于 src,dest中
- * 字符只用于 src,可匹配任何字符,一般用于SaaS模式下的租户名匹配
- 上面示例中,"/v20/api/" 是后端服务的URL路径前缀
- 上面示例中,没有前缀的URL都认为是前端路径
- 规则匹配采用【自上而下】的次序执行,特殊规则一定要放在靠前的位置
2)Nebula.Public.NodeGrayRule.xml
配置示例
<NodeGrayRule>
<Rules>
<rule normal="http://app1/" gray="http://app1-gray/" />
<rule normal="http://app2/" gray="http://app2-gray/" />
<rule normal="http://app1-ui/" gray="http://app1-ui-gray/" />
<rule normal="http://app2-ui/" gray="http://app2-ui-gray/" />
</Rules>
</NodeGrayRule>
注意:不需要灰度发布的应用或服务,不用在上面配置!
示例解释:
http://app1/ 是服务X的 正常 访问地址
http://app1-gray/ 是服务X的 灰度 访问地址
http://app1-ui/ 是前端站点X的 正常 访问地址
http://app1-ui-gray/ 是前端站点X的 灰度 访问地址
3,部署服务
需要部署以下服务:
- Nebula.GateWay
- 它将接受所有的外网HTTP请求
- 然后根据【用户身份】和【上面2个配置文件】转发到内部的服务节点
4,登录时指定用户的灰度标记
参考以下代码:主要是设置:userInfo.GrayFlag = 1
public int Login(string usercode, string password, string tenantId)
{
// 示例代码中忽略用户名和密码的校验逻辑………………
// 构造用户身份对象
WebUserInfo userInfo = new WebUserInfo {
TenantId = tenantId,
UserId = userId,
UserName = "某某某",
UserRole = "Admin",
GrayFlag = 1 // 标记当前用户访问灰度功能
};
int seconds = 1200; // 设置身份凭证的有效期(用户持续操作时会自动续期)
AuthenticationManager.Login(userInfo, seconds);
return 1;
}