灰度部署

业务背景

  • 支持SaaS租户级&用户级的功能灰度发布
  • 支持微服务(节点多,域名多)的部分应用灰度发布
  • 多应用共用域名(一个域名供多个服务和前端站点使用)

在阅读本文前,请先浏览: 灰度部署方案设计

实现步骤:

  1. 在配置服务中新增:1个全局参数
  2. 在配置服务中新增:2个配置文件
  3. 部署 Nebula.GateWay 服务
  4. 登录时指定用户的灰度标记



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;
}