代码git地址java
上篇文章介绍了SpringCloud灰度的实现及流程,每次修改服务的元数据信息metadata-map
值须要从新调用一次eureka的RestFul接口,不只如此当服务重启后又会从新读最初的配置值,这样不只麻烦并且还不可靠。git
在通过与SpringCloud Config 、Disconf、Apollo等配置中心做出对比后,发现被Apollo友好方便的管理端所深深吸引,再加上该配置中心支持配置文件的灰度发布简直不要太完美。github
让多个实例共享一个配置文件,示例配置spring
spring.application.name = provide-test server.port = 7770 eureka.client.service-url.defaultZone = http://localhost:1111/eureka/
而后新起一个灰度配置,让对应的服务使用该配置。segmentfault
eureka.instance.metadata-map.version = v1
监听Apollo事件,当发现配置文件中的eureka.instance.metadata-map.version
值若发生改变,则调用eureka接口更改metadata-map
元数据app
@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更改元数据的值。ide
在网关zuul整合了动态路由功能,监听Apollo配置文件使其修改配置文件后能够立刻生效。此处不对此功能作过多的介绍,详情见代码url
配置示例spa
url.map.provide-test = /pt/**
url.map.
为固定写法,provide-test
为服务名称,/pt/**
为映射路径.net
在启动类添加注解
@SpringBootApplication @EnableDiscoveryClient @EnableGrayConfig public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }