灰度发布是指在应用从旧版本到新版本间平滑过渡的一种发布方式。本文为您介绍全链路灰度发布对微服务带来的价值,并在阿里云混合云企业版V3.10.0版本的EDAS中,为您演示混合云全链路的灰度发布。

前提条件

企业版V3.9.0前(不包含V3.9.0)的版本不支持全链路灰度发布。

背景信息

  • 最佳实践概述:

    本文将基于HSF Pandora Boot开发的应用,指导全链路灰度的使用。在EDAS上部署了四个标准的HSF Pandora Boot应用,并通过详细的步骤指导HSF Pandora Boot应用的开发。从Maven工程的构建、需要导入的依赖包、配置文件及代码的开发等多方位为您提供参考。本文还将指导全链路灰度能力的使用,并展示在不同场景下全链路灰度发布的能力。

  • 最佳实践价值:

    对于购买了企业版V3.9.0及之后版本的客户,如果部署在EDAS中的HSF微服务应用多而复杂,出现问题时,您可以通过全链路灰度流量控制,排查链路中具体应用的实际问题,提升排查效率,保证整个微服务应用正常运行。

实际环境展示

  1. 登录ASCM控制台。
  2. 在顶部菜单栏中,选择产品 > 企业级分布式应用服务EDAS
    EDAS
本次测试通过EDAS部署四个标准的HSF Pandora Boot应用,分别是:
  • hsf-pandora-boot-consumer
  • hsf-pandora-boot-broker
  • hsf-pandora-boot-bridge
  • hsf-pandora-boot-provider
其中consumer对外暴露HTTP请求方式,consumer、broker、bridge和provider应用之间调用方式为RPC通讯。
EDAS控制台

示例代码调用说明

  1. 打开Maven项目下的pom.xml文件,添加Pandora boot版本信息。
    <properties>
           <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
           <pandora-boot.version>2019-06-stable</pandora-boot.version>
    </properties>
    1. 添加Pandora boot和Spring boot声明依赖信息。
      <dependencyManagement>
             <dependencies>
                    <dependency>
                           <groupId>org.springframework.boot</groupId>
                           <artifactId>spring-boot-dependencies</artifactId>
                           <version>{spring-boot.version}</version>
                           <type>pom</type>
                           <scope>import</scope>
                    </dependency>
                    <dependency>
                           <groupId>com.taobao.pandora</groupId>
                           <artifactId>pandora-boot-starter-bom</artifactId>
                           <version>{pandora-boot.version}</version>
                           <type>pom</type>
                           <scope>import</scope>
                    </dependency>
                    <dependency>
                           <groupId>io.micrometer</groupId>
                           <artifactId>micrometer-registry-atlas</artifactId>
                           <version>1.2.0</version>
                    </dependency>
                    <dependency>
                           <artifactId>spring-jcl</artifactId>
                           <groupId>org.springframework</groupId>
                           <version>999-not-exist-SNAPSHOT</version>
                    </dependency>
                    <dependency>
                           <groupId>org.slf4j</groupId>
                           <artifactId>jcl-over-slf4j</artifactId>
                           <version>1.7.26</version>
                    </dependency>
             </dependencies>
      </dependencyManagement>
    2. 添加Pandora boot和Spring boot,导入具体依赖包。
      <dependencies>
             <dependency>
                    <groupId>com.alibaba.boot</groupId>
                    <artifactId>pandora-hsf-spring-boot-starter</artifactId>
             </dependency>
             <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
             </dependency>
             <dependency>
                    <groupId>org.slf4j</groupId>
                    <artifactId>jcl-over-slf4j</artifactId>
             </dependency>
             <dependency>
                    <groupId>com.taobao.pandora</groupId>
                    <artifactId>pandora-boot-test</artifactId>
                    <scope>test</scope>
             </dependency>
             <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
             </dependency>
      </dependencies>
    3. 添加Pandora boot提供的Maven打包插件,可以将Pandora boot hsf工程编译成为可以执行的FatJar,并在EDAS Container中部署运行。
      <build>
        <plugins>
           <plugin>
              <groupId>com.taobao.pandora</groupId>
                <artifactId>pandora-boot-maven-plugin</artifactId>
                <version>2.1.11.8</version>
                 <executions>
                   <execution>
                      <phase>package</phase>
                        <goals>
                       <goal>repackage</goal>
                       </goals>
                       </execution>
                </executions>
           </plugin>
         </plugins>
      </build>
  2. 创建服务提供者代码如下。
    HSF服务框架基于接口进行服务通信,当接口定义好了之后,生产者将通过该接口发布服务,消费者也可以基于该接口去订阅和消费服务。
    public interface EchoService {
        String echo(String string);
     
        String echoHSFMix(int id);
     
        String echoMQConsumer(String str);
    }
    1. 添加服务提供者的具体实现类EchoProviderServiceImpl,并通过注解发布服务。
      @HSFProvider(serviceInterface = EchoService.class, serviceVersion = "1.0.0")
      public class EchoServiceImpl implements EchoService {
       
          @Autowired
          private EchoDao echoDao;
          @Autowired
          private SimpleMQConsumer simpleMQConsumer;
          @Autowired
          private SimpleMQProduce simpleMQProduce;
       
          public String echo(String str) {
              return "welcome --" + str;
          }
       
          public String echoHSFMix(int id) {
              //写消息
              simpleMQProduce.sendMsg(id+"");
              return echoDao.findById(id).getUserName();
          }
       
          public String echoMQConsumer(String str) {
              //订阅消息
              simpleMQConsumer.receive();
              return str;
          }
      }
    2. 在该Maven项目Resources目录下的application.properties文件中配置应用名和监听端口号。
      spring.application.name=hsf-provider
      spring.hsf.version=1.0.0
      spring.hsf.timeout=3000
    3. 服务提供者启动的main函数入口。
      @SpringBootApplication
      public class HSFProviderApplication {
       
          public static void main(String[] args) {
              // 启动Pandora Boot用于加载Pandora容器。
              PandoraBootstrap.run(args);
              SpringApplication.run(HSFProviderApplication.class, args);
              // 标记服务启动完成,并设置线程wait。防止用户业务代码运行完毕退出后,导致容器退出。
              PandoraBootstrap.markStartupAndWait();
          }
      }
  3. 创建服务消费者,将服务提供者所发布的API服务接口拷贝到本地。
        com.alibaba.edas.service.EchoService:
    public interface EchoService {
        String echo(String string);
     
        String echoHSFMix(int id);
     
        String echoMQConsumer(String str);
    }
    1. 通过注解的方式将服务消费者的实例注入到Spring的Context中。
      @Configuration
      public class HsfConfig {
       
          @HSFConsumer(clientTimeout = 3000, serviceVersion = "1.0.0")
          private EchoService echoService;
       
          @HSFConsumer(clientTimeout = 3000, serviceVersion = "1.0.0")
          private MiddleService middleService;
       
      }
    2. 为了便于测试,使用ConsumerController来暴露一个/hsf-echo-mid的HTTP接口,实现HSF RPC调用服务提供者。
      @RestController
      @RequestMapping(value = "/poc")
      @Api(description = "HSF-POC功能测试接口")
      public class ConsumerController {
       
          @Autowired
          private EchoService echoService;
          @Autowired
          private MiddleService middleService;
       
          @NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
          private String useLocalCache;
       
          @ApiOperation(value = "获取服务者返回信息 A->D")
          @RequestMapping(value = "/hsf-echo-mid", method = RequestMethod.GET)
          public String echo(@RequestParam("str") String str) {
              return echoService.echo(str) + "\r\n";
          }
       
          @ApiOperation(value = "通过ID查询数据库获取返回信息、RocketMQ写信息 A->D")
          @RequestMapping(value = "/hsf-echo-mix", method = RequestMethod.GET)
          public String echoHSFMix(@RequestParam("id") int id) {
              return echoService.echoHSFMix(id) + "\r\n";
        }
      }

灰度发布升级单应用

在ECS集群中部署了V1版本。V2版本开发完成后,需要先在一个实例进行验证,验证通过后,再将另一个实例从V1版本升级到V2,从而完成应用A的升级。

您可以按照以下步骤进行单应用的灰度发布升级。

  1. 登录ASCM控制台。
  2. 在顶部菜单栏中,选择产品 > 企业级分布式应用服务EDAS
    EDAS
  3. 选择组织地域后,单击EDAS按钮。
  4. 在左侧导航栏中,选择应用管理 > 应用列表
  5. 应用列表页面,单击应用名称。
  6. 应用详情页面,单击实例部署信息页签,然后在页面右上方单击创建新分组
  7. 在对话框中输入分组名,然后单击创建
    创建新分组
  8. 您可以使用灰度流量控制先进行小规模验证,然后再全量升级。流量控制包含HTTP和HSF两种方式。
    • 基于HTTP进行流量控制:
      1. 单击基本信息页签,在应用设置区域的流量管理右侧,单击开启开启流量管理如果未开启流量管理,则无法设置HTTP流控规则。
      2. 实例部署信息页面,单击灰度实例分组右侧的流量控制,选择 HTTP流控
      3. 在流量控制页面,选择启用下面的配置来控制进入当前应用分组的 HTTP请求流量
      4. 流量控制页面设置流控规则,单击保存流量控制
        参数 说明
        Path 输入HTTP的相对路径。
        场景规则 如果配置了多条规则,则要设置这些规则生效的条件。包括满足所有条件或满足条件之一。
        条件列表 参数类型 包含Cookie值HTTP Header值URL参数值3种方式。
        参数 输入参数,参数长度不能超过64个字符。
        条件 选择条件,包括=、!=、>、<、>=、<=、白名单或按100取模。
        输入参数取模或列表的值。
    • 基于HSF进行流量控制:

      如果设置HSF流控,不需要开启流量管理,但需要保证应用的容器EDAS Container为V3.5.3及以上版本。

      1. 实例部署信息页面,单击灰度实例分组右侧流量控制,选择HSF流控设置流控1
      2. 流量控制页面,选中启用下面的配置来控制进入当前应用分组的HSF请求流量
      3. 流量控制页面设置流控规则,单击保存设置流控2
        参数 说明
        选择服务 在下拉列表中,选择入口应用中的服务。
        选择方法 选择入口应用中选定服务中的方法。如果不选择,则表示访问该服务的所有请求都进行规则匹配。
        条件模式 如果配置了多条规则,则要设置这些规则生效的条件。包括满足所有条件或满足条件之一。
        条件列表 参数 自动列出该服务、方法下的参数,命名格式为参数i。i代表参数的序号,从0开始。
        参数值获取表达式 表达式有两个字段拼接而成,格式为argsi.xxx。第一部分argsi由参数的选择决定。如果在参数选择了参数0,则argsi为args0。第二部分.xxx为您根据您的需求自定义的字段。
        条件 选择条件,包括=、!=、>、<、>=、<=、白名单或按100取模。
        输入参数值。字符串要使用双引号(””),布尔值以truefalse表示。

创建灰度环境

灰度环境是灰度发布的核心,您需要在灰度环境中进行多个应用的流量控制。

  1. EDAS控制台左侧导航栏中,选择应用管理 > 灰度发布
    灰度发布
  2. 灰度发布页面右上角,单击新建环境
  3. 基本信息页面,设置命名空间(包括地域和命名空间)、灰度环境名称灰度标识灰度环境描述,然后单击下一步
    基本信息
  4. 设置入口流量规则页面,选择入口应用并配置流量规则,然后单击下一步设置入口流量
    参数 说明
    入口应用 在下拉菜单中按规划选择该灰度环境的入口应用。
    协议类型 根据实际需求选择协议类型,HTTP或HSF。
    path(适用于HTTP) 输入访问资源的路径。
    选择服务(适用于HSF) 选择入口应用中的服务。
    方法(适用于HSF) 选择入口应用中的方法。
    场景规则 如果配置了多条规则,则要设置这些规则生效的条件。包括满足所有条件或满足条件之一。
    条件列表 参数类型 包括根据Cookie值、根据HTTP Header值和根据URL参数值。
    参数 表达式有两个字段拼接而成,格式为argsi.xxx。第一部分argsi由参数的选择决定。如果在参数选择了参数0,则argsi为 args0。第二部分 .xxx为您根据您的需求自定义的字段。
    条件 选择条件,包括 =、!=、>、<、>=、<=、白名单或按100取模。
    输入参数值。字符串要使用双引号(””),布尔值以true/false表示。
    说明
    • 如果需要设置多个规则,单击添加规则条件。
    • 如果需要创建多个入口流量规则,单击创建新的入口流量规则。
  5. 选择应用中按规划选中应用前的复选框,单击箭头图标添加到已选应用列表中,单击下一步
    添加应用
    说明
    • 选择应用列表中某些应用不可勾选,且应用名右侧有标识,则表示该应用只有默认分组,而默认分组不能添加到灰度环境中。
    • 已选应用列表中某些应用实例分组右侧同样有标识,则表示该分组下没有实例,需要添加实例。
  6. 创建完成页面检查灰度环境相关设置,确认无误后,单击提交
    提交

设置HTTP流量规则(单应用)

本次测试通过EDAS部署三个标准的HSF Pandora Boot应用,分别是hsf-pandora-boot-consumerhsf-pandora-boot-brokerhsf-pandora-boot-provider,consumer、broker和provider应用之间调用方式为RPC通讯。

按内容灰度设置规则,设置示例如下。

设置实例流量

编写循环请求脚本curl.sh,脚本内容如下。

#!/bin/bash
log="logs"
echo '测试开始时间:'`date +%F-%H:%M.%N` > "$log"
for((i=1;i<=10;i++))
do
        echo `date +%F-%H:%M.%N` "第$i次访问" >> "$log" &
        echo "第$i次访问结果:"`curl http://192.168.XX.XXX:8080/poc/echo-mid?str=2` >> "$log" &
        sleep 0.2
done

设置内容灰度规则之前,通过命令tail -f logs查看返回结果如下。

tail -f logs

执行nohup ./curl.sh &脚本命令请求应用,通过命令tail -f logs查看返回结果如下。

nohup ./curl.sh &

按比例灰度设置规则,设置示例如下。

灰度规则

执行nohup ./curl.sh &脚本命令请求应用,通过命令tail -f logs查看返回结果如下。

nohup ./curl.sh &灰度

全链路灰度设置HSF流量规则(多应用)

本次测试通过EDAS部署三个标准的HSF Pandora Boot应用,分别是hsf-pandora-boot-consumerhsf-pandora-boot-brokerhsf-pandora-boot-bridgehsf-pandora-boot-provider,consumer、broker、bridge和provider应用之间调用方式为RPC通讯。

  1. 按内容灰度设置规则,其中把hsf-pandora-boot-brokerhsf-pandora-boot-provider添加在同一个灰度环境里,设置示例如下。
    HSF规则
  2. 为了方便测试,编写循环请求脚本curl.sh,脚本内容如下。
    #!/bin/bash
    log="logs"
    echo '测试开始时间:'`date +%F-%H:%M.%N` > "$log"
    for((i=1;i<=10;i++))
    do
            echo `date +%F-%H:%M.%N` "第$i次访问" >> "$log" &
            echo "第$i次访问结果:"`curl http://192.168.XX.XXX:8080/poc/echo-mid?str=2` >> "$log" &
            sleep 0.2
    done
  3. 在开启设置的灰度环境之前,通过上述脚本请求访问四个应用,通过命令tail -f logs查看返回结果如下。
    访问应用
  4. 开启全链路灰度环境,执行上述脚本请求访问应用后,通过命令tail -f logs查看返回结果如下。
    返回结果返回结果2