代碼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); } }