摘要:@ApolloConfigChangeListener(value="zuul-config-apollo") 中value的默認參數是 application ,因爲這裏我們自定義了namespace,所以需要指定,我們使用 @ApolloConfigChangeListener 監聽Apollo的配置下發,有配置更新時會調用 refreshZuulProxy() 刷新路由信息。答案當然是肯定的,Zuul作爲一個老牌的開源服務網關組件,動態路由對它來講是一個十分必要的功能,畢竟我們不能隨便重啓服務網關,服務網關是一個微服務系統的大門,今天我們介紹的Zuul動態路由的解決方案來自於攜程開源的配置中心Apollo。

Springboot: 2.1.7.RELEASE
SpringCloud: Greenwich.SR2

上一篇文章我們介紹了Gateway基於Nacos動態網關路由的解決方案 《 Gateway基於Nacos動態網關路由》 ,同爲Spring Cloud服務網關組件的Spring Cloud Zuul在生產環境中使用更爲廣泛,那麼它有沒有方便的動態路由解決方案呢?答案當然是肯定的,Zuul作爲一個老牌的開源服務網關組件,動態路由對它來講是一個十分必要的功能,畢竟我們不能隨便重啓服務網關,服務網關是一個微服務系統的大門,今天我們介紹的Zuul動態路由的解決方案來自於攜程開源的配置中心Apollo。

Apollo概述

Apollo(阿波羅)是攜程框架部門研發的開源配置管理中心,能夠集中化管理應用不同環境、不同集羣的配置,配置修改後能夠實時推送到應用端,並且具備規範的權限、流程治理等特性。

Apollo支持4個維度管理Key-Value格式的配置:

  1. application (應用)

  2. environment (環境)

  3. cluster (集羣)

  4. namespace (命名空間)

Apollo相比於Spring Cloud Config優勢

前面的文章我們也介紹了Spring Cloud Config《跟我學SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh》,但是它和我們今天要使用的相比,又有什麼劣勢呢?

Spring Cloud Config的精妙之處在於它的配置存儲於Git,這就天然的把配置的修改、權限、版本等問題隔離在外。通過這個設計使得Spring Cloud Config整體很簡單,不過也帶來了一些不便之處。

功能點 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

  1. 工程依賴pom.xml如下:

代碼清單:chapter16/pom.xml

  1. 配置文件

app.properties如下:

代碼清單:chapter16/src/main/resources/META-INF/app.properties

這裏配置的 app.id 是在Apollo中創建項目時配置的。

application.yml如下:

代碼清單:chapter16/src/main/resources/application.yml

在Apollo上新建一個命名空間 zuul-config-apollo

其餘的配置都配置在Apollo中,具體如圖:

  1. 啓動主類Chapter16Application.java如下:

代碼清單:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java

其中 @EnableZuulProxy 表示開啓Zuul網關代理, @EnableApolloConfig 表示開啓Apollo配置。

  1. 路由刷新

代碼路徑:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java

@ApolloConfigChangeListener(value="zuul-config-apollo") 中value的默認參數是 application ,因爲這裏我們自定義了namespace,所以需要指定,我們使用 @ApolloConfigChangeListener 監聽Apollo的配置下發,有配置更新時會調用 refreshZuulProxy() 刷新路由信息。

  1. 測試

我們啓動Client-Apollo工程和Zuul-Apollo工程,打開瀏覽器訪問:http://localhost:9091/client/hello ,頁面可以正常顯示,我們在Apollo中修改路由信息,具體如圖:

修改完後點擊發布,待發布成功後,我們刷新瀏覽器,之前的路由訪問已經報錯404,我們使用修改過後的路由http://localhost:9091/client_new/hello ,頁面可以正常顯示 Hello,i am devfromapollo update. ,測試成功,我們通過Apollo實現了Zuul的路由信息動態刷新。

相關文章