服務網關 Zuul 基於 Apollo 動態路由
摘要:@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格式的配置:
-
application (應用)
-
environment (環境)
-
cluster (集羣)
-
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
-
工程依賴pom.xml如下:
代碼清單:chapter16/pom.xml
-
配置文件
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中,具體如圖:
-
啓動主類Chapter16Application.java如下:
代碼清單:chapter16/src/main/java/com/springcloud/chapter16/Chapter16Application.java
其中 @EnableZuulProxy
表示開啓Zuul網關代理, @EnableApolloConfig
表示開啓Apollo配置。
-
路由刷新
代碼路徑:chapter16/src/main/java/com/springcloud/chapter16/config/ZuulProxyRefresher.java
@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 devfromapollo update.
,測試成功,我們通過Apollo實現了Zuul的路由信息動態刷新。