Springboot: 2.1.7.RELEASEhtml
SpringCloud: Greenwich.SR2java
[TOC]git
上一篇文章咱們介紹了Gateway基於Nacos動態網關路由的解決方案《Spring Cloud Alibaba | Gateway基於Nacos動態網關路由》,同爲Spring Cloud服務網關組件的Spring Cloud Zuul在生產環境中使用更爲普遍,那麼它有沒有方便的動態路由解決方案呢?答案固然是確定的,Zuul做爲一個老牌的開源服務網關組件,動態路由對它來說是一個十分必要的功能,畢竟咱們不能隨便重啓服務網關,服務網關是一個微服務系統的大門,今天咱們介紹的Zuul動態路由的解決方案來自於攜程開源的配置中心Apollo。github
Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,可以集中化管理應用不一樣環境、不一樣集羣的配置,配置修改後可以實時推送到應用端,而且具有規範的權限、流程治理等特性。web
Apollo支持4個維度管理Key-Value格式的配置:spring
前面的文章咱們也介紹了Spring Cloud Config《跟我學SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh》,可是它和咱們今天要使用的相比,又有什麼劣勢呢?數據庫
Spring Cloud Config的精妙之處在於它的配置存儲於Git,這就自然的把配置的修改、權限、版本等問題隔離在外。經過這個設計使得Spring Cloud Config總體很簡單,不過也帶來了一些不便之處。bootstrap
功能點 | Apollo | Spring Cloud Config | 備註 |
---|---|---|---|
配置界面 | 一個界面管理不一樣環境、不一樣集羣配置 | 無,須要經過git操做 | |
配置生效時間 | 實時 | 重啓生效,或手動refresh生效 | Spring Cloud Config須要經過Git webhook,加上額外的消息隊列才能支持實時生效 |
版本管理 | 界面上直接提供發佈歷史和回滾按鈕 | 無,須要經過git操做 | |
灰度發佈 | 支持 | 不支持 | |
受權、審覈、審計 | 界面上直接支持,並且支持修改、發佈權限分離 | 須要經過git倉庫設置,且不支持修改、發佈權限分離 | |
實例配置監控 | 能夠方便的看到當前哪些客戶端在使用哪些配置 | 不支持 | |
配置獲取性能 | 快,經過數據庫訪問,還有緩存支持 | 較慢,須要從git clone repository,而後從文件系統讀取 | |
客戶端支持 | 原生支持全部Java和.Net應用,提供API支持其它語言應用,同時也支持Spring annotation獲取配置 | 支持Spring應用,提供annotation獲取配置 | Apollo的適用範圍更廣一些 |
這裏須要準備一個Apollo配置中心,具體如何構建Apollo配置中心我這裏很少作介紹,你們能夠參考Apollo的官方文檔:https://github.com/ctripcorp/apollo/wiki瀏覽器
代碼清單:chapter16/pom.xml緩存
<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>${apollo-client.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency>
app.properties以下:
代碼清單:chapter16/src/main/resources/META-INF/app.properties
app.id=123456789
這裏配置的app.id
是在Apollo中建立項目時配置的。
application.yml以下:
代碼清單:chapter16/src/main/resources/application.yml
apollo: bootstrap: enabled: true namespaces: zuul-config-apollo Meta: http://localhost:8080
在Apollo上新建一個命名空間zuul-config-apollo
。
其他的配置都配置在Apollo中,具體如圖:
代碼清單:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy @EnableApolloConfig public class Chapter16Application { public static void main(String[] args) { SpringApplication.run(Chapter16Application.class, args); } }
其中@EnableZuulProxy
表示開啓Zuul網關代理,@EnableApolloConfig
表示開啓Apollo配置。
代碼路徑:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java
@Component public class ZuulProxyRefresher implements ApplicationContextAware { private ApplicationContext applicationContext; @Autowired private RouteLocator routeLocator; @ApolloConfigChangeListener(value = "zuul-config-apollo") public void onChange(ConfigChangeEvent changeEvent) { boolean zuulProxyChanged = false; for (String changedKey : changeEvent.changedKeys()) { if (changedKey.startsWith("zuul.")) { zuulProxyChanged = true; break; } } if (zuulProxyChanged) { refreshZuulProxy(changeEvent); } } private void refreshZuulProxy(ConfigChangeEvent changeEvent) { this.applicationContext.publishEvent(new EnvironmentChangeEvent(changeEvent.changedKeys())); this.applicationContext.publishEvent(new RoutesRefreshedEvent(routeLocator)); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
@ApolloConfigChangeListener(value = "zuul-config-apollo")
中value的默認參數是application
,由於這裏咱們自定義了namespace,因此須要指定,咱們使用@ApolloConfigChangeListener
監聽Apollo的配置下發,有配置更新時會調用refreshZuulProxy()
刷新路由信息。
咱們啓動Client-Apollo工程和Zuul-Apollo工程,打開瀏覽器訪問:http://localhost:9091/client/hello ,頁面能夠正常顯示,咱們在Apollo中修改路由信息,具體如圖:
修改完後點擊發布,待發布成功後,咱們刷新瀏覽器,以前的路由訪問已經報錯404,咱們使用修改事後的路由http://localhost:9091/client_new/hello ,頁面能夠正常顯示Hello, i am dev from apollo update.
,測試成功,咱們經過Apollo實現了Zuul的路由信息動態刷新。
原文出處:https://www.cnblogs.com/babycomeon/p/11489632.html