灰度发布是指在应用从旧版本到新版本间平滑过渡的一种发布方式。本文为您介绍全链路灰度发布对微服务带来的价值,并在阿里云混合云企业版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微服务应用多而复杂,出现问题时,您可以通过全链路灰度流量控制,排查链路中具体应用的实际问题,提升排查效率,保证整个微服务应用正常运行。
实际环境展示
- 登录ASCM控制台。
- 在顶部菜单栏中,选择。
本次测试通过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通讯。
示例代码调用说明
- 打开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>
- 添加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>
- 添加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>
- 添加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>
- 创建服务提供者代码如下。
HSF服务框架基于接口进行服务通信,当接口定义好了之后,生产者将通过该接口发布服务,消费者也可以基于该接口去订阅和消费服务。
public interface EchoService {
String echo(String string);
String echoHSFMix(int id);
String echoMQConsumer(String str);
}
- 添加服务提供者的具体实现类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;
}
}
- 在该Maven项目Resources目录下的application.properties文件中配置应用名和监听端口号。
spring.application.name=hsf-provider
spring.hsf.version=1.0.0
spring.hsf.timeout=3000
- 服务提供者启动的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();
}
}
- 创建服务消费者,将服务提供者所发布的API服务接口拷贝到本地。
com.alibaba.edas.service.EchoService:
public interface EchoService {
String echo(String string);
String echoHSFMix(int id);
String echoMQConsumer(String str);
}
- 通过注解的方式将服务消费者的实例注入到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;
}
- 为了便于测试,使用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的升级。
您可以按照以下步骤进行单应用的灰度发布升级。
- 登录ASCM控制台。
- 在顶部菜单栏中,选择。
- 选择组织和地域后,单击EDAS按钮。
- 在左侧导航栏中,选择。
- 在应用列表页面,单击应用名称。
- 在应用详情页面,单击实例部署信息页签,然后在页面右上方单击创建新分组。
- 在对话框中输入分组名,然后单击创建。
- 您可以使用灰度流量控制先进行小规模验证,然后再全量升级。流量控制包含HTTP和HSF两种方式。
创建灰度环境
灰度环境是灰度发布的核心,您需要在灰度环境中进行多个应用的流量控制。
- 在EDAS控制台左侧导航栏中,选择。
- 在灰度发布页面右上角,单击新建环境。
- 在基本信息页面,设置命名空间(包括地域和命名空间)、灰度环境名称、灰度标识和灰度环境描述,然后单击下一步。
- 在设置入口流量规则页面,选择入口应用并配置流量规则,然后单击下一步。
参数 |
说明 |
入口应用 |
在下拉菜单中按规划选择该灰度环境的入口应用。 |
协议类型 |
根据实际需求选择协议类型,HTTP或HSF。 |
path(适用于HTTP) |
输入访问资源的路径。 |
选择服务(适用于HSF) |
选择入口应用中的服务。 |
方法(适用于HSF) |
选择入口应用中的方法。 |
场景规则 |
如果配置了多条规则,则要设置这些规则生效的条件。包括满足所有条件或满足条件之一。 |
条件列表 |
参数类型 |
包括根据Cookie值、根据HTTP Header值和根据URL参数值。 |
参数 |
表达式有两个字段拼接而成,格式为argsi.xxx。第一部分argsi由参数的选择决定。如果在参数选择了参数0,则argsi为 args0。第二部分 .xxx为您根据您的需求自定义的字段。 |
条件 |
选择条件,包括 =、!=、>、<、>=、<=、白名单或按100取模。 |
值 |
输入参数值。字符串要使用双引号(””),布尔值以true/false表示。 |
说明
- 如果需要设置多个规则,单击添加规则条件。
- 如果需要创建多个入口流量规则,单击创建新的入口流量规则。
- 在选择应用中按规划选中应用前的复选框,单击图标添加到已选应用列表中,单击下一步。
- 在创建完成页面检查灰度环境相关设置,确认无误后,单击提交。
设置HTTP流量规则(单应用)
本次测试通过EDAS部署三个标准的HSF Pandora Boot应用,分别是hsf-pandora-boot-consumer、hsf-pandora-boot-broker、hsf-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
查看返回结果如下。
执行nohup ./curl.sh &
脚本命令请求应用,通过命令tail -f logs
查看返回结果如下。
按比例灰度设置规则,设置示例如下。
执行nohup ./curl.sh &
脚本命令请求应用,通过命令tail -f logs
查看返回结果如下。
全链路灰度设置HSF流量规则(多应用)
本次测试通过EDAS部署三个标准的HSF Pandora Boot应用,分别是hsf-pandora-boot-consumer、hsf-pandora-boot-broker、hsf-pandora-boot-bridge、hsf-pandora-boot-provider,consumer、broker、bridge和provider应用之间调用方式为RPC通讯。
- 按内容灰度设置规则,其中把hsf-pandora-boot-broker和hsf-pandora-boot-provider添加在同一个灰度环境里,设置示例如下。
- 为了方便测试,编写循环请求脚本
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
查看返回结果如下。