前言
上篇文章介紹了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更改元數據的值。
灰度使用
在啓動類添加註解
@SpringBootApplication
@EnableDiscoveryClient
@EnableGrayConfig
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}