乐趣区

SpringCloud灰度发布实践(整合Apollo配置中心)

代码 git 地址
feature

[x] 灰度服务
[x] 配置中心
[x] 动态路由

前言
上篇文章介绍了 SpringCloud 灰度的实现及流程,每次修改服务的元数据信息 metadata-map 值需要重新调用一次 eureka 的 RestFul 接口,不仅如此当服务重启后又会重新读最初的配置值,这样不仅麻烦而且还不可靠。
在经过与 SpringCloud Config、Disconf、Apollo 等配置中心作出对比后,发现被 Apollo 友好方便的管理端所深深吸引,再加上该配置中心支持配置文件的灰度发布简直不要太完美。
Apollo 灰度配置
让多个实例共享一个配置文件,示例配置
spring.application.name = provide-test
server.port = 7770
eureka.client.service-url.defaultZone = http://localhost:1111/eureka/
然后新起一个灰度配置, 让对应的服务使用该配置。
eureka.instance.metadata-map.version = v1

事件监听
监听 Apollo 事件,当发现配置文件中的 eureka.instance.metadata-map.version 值若发生改变,则调用 eureka 接口更改 metadata-map 元数据
@ApolloConfigChangeListener(“application”)
private void someOnChange(ConfigChangeEvent changeEvent) {
changeEvent.changedKeys().forEach(key -> {
ConfigChange change = changeEvent.getChange(key);
// 灰度配置
if(“eureka.instance.metadata-map.version”.equals(change.getPropertyName())) {
String appname = eurekaInstanceConfig.getAppname();
String instanceId = eurekaInstanceConfig.getInstanceId();
String value = StringUtils.isEmpty(change.getNewValue()) ? “” : change.getNewValue();

//TODO 调用 eureka 更改元数据接口
}

});
}
这样一来,只需要通过修改配置文件然后就会触发监听事件从而自动触发请求 eureka 更改元数据的值。
动态路由
在网关 zuul 整合了动态路由功能,监听 Apollo 配置文件使其修改配置文件后可以马上生效。此处不对此功能做过多的介绍,详情见代码
配置示例
url.map.provide-test = /pt/**
url.map. 为固定写法,provide-test 为服务名称,/pt/** 为映射路径
参考文章
灰度使用
在启动类添加注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableGrayConfig
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}

退出移动版