Spring Boot 專案實戰(六)整合 Apollo
上篇介紹了 Spring Boot 整合 Dubbo,使我們的系統打下了分散式的基礎。隨著程式功能的日益複雜,程式的配置日益增多:各種功能開關、引數配置、伺服器地址等;對程式配置的期望值也越來越高:配置修改後實時生效,灰度釋出,分環境、分叢集管理配置,完善的許可權、稽核機制等;在這樣的大環境下,傳統的通過配置檔案、資料庫等方式已經越來越無法滿足開發人員對配置管理的需求。分散式配置中心應運而生。本篇將主要介紹分散式配置中心 Apollo 的整合過程。
二、部署 Apollo
① 部署教程見官方文件: https://github.com/ctripcorp/apollo/wiki/分散式部署指南
三、使用 Apollo
① 登入 Apollo 管理控制檯後建立專案,其中應用 ID 全域性唯一。

② 建立成功後跳轉到專案維護介面,左側上方為環境列表,中間區域為專案資訊,下方可操作叢集及 namespace 。右側為預設 namespace : application ,具體配置項在此區域維護。

四、Spring Boot 整合 Apollo
4.1 引入 Apollo 依賴包
① 首先在專案父 pom 檔案中宣告 Apollo 依賴。
<dependencyManagement> <dependencies> ...省略其餘部分... <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.2.0</version> </dependency> </dependencies> </dependencyManagement>
② 其次在 demo-biz 層中的 pom 檔案新增上述 Apollo 依賴。
<dependencies> ...省略其餘部分... <dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> </dependency> </dependencies>
4.2 新增 Apollo 配置項
① 在 application.properties 檔案中的新增 Apollo 相關的配置項:
# 應用全域性唯一的身份標識 app.id = 20000 # Apollo Meta Server 地址 apollo.meta = http://xxx.xxx.xxx.xxx:7881 # 自定義本地配置檔案快取路徑 apollo.cacheDir = ./config # 設定在應用啟動階段就載入 Apollo 配置 apollo.bootstrap.enabled = true # 注入 application namespace apollo.bootstrap.namespaces = application
② 將 application.properties 檔案中的除了 Apollo 及 Logback 的其他配置項都轉移到 Apollo 控制檯中維護。

4.3 驗證 Apollo
① 啟動日誌中可以看到 Apollo 從 Meta Server 拉取配置項,並快取到本地 config 目錄。


② 訪問 http://localhost:8080/demo/test?id=1 介面正常返回。
4.4 託管 Logback 配置項
① Apollo 1.2.0 版本後支援託管日誌相關配置項,只需要在 application.properties 檔案中增加以下 Apollo 配置項。
# 將 Apollo 配置載入提到初始化日誌系統之前,需要託管日誌配置時開啟 apollo.bootstrap.eagerLoad.enabled = true
② 將 Logback 配置項轉移到 Apollo 控制檯中維護。
4.5 本地開發模式
某些情況下比如 Dubbo 介面本地聯調,需要修改依賴方的介面版本,此時可以開啟本地開發模式,在本地開發模式下,Apollo 只會從本地檔案讀取配置資訊,不會從 Apollo 伺服器讀取配置。通過 設定 JVM 引數 開啟。

4.6 Dubbo 及 Apollo 的相容問題
官方在整合 Dubbo 及 Apollo 時提供了兩種方式:
- ① 純 Spring Boot 方式;即依賴 dubbo-spring-boot-starter 包。
- ② 原生 Dubbo 方式;即依賴 dubbo 、zookeeper 、 zkclient 、curator-framework 包,然後通過 XML 方式配置,配置項用 ${} 佔位符。
而我當時為了能清楚知道,對外提供了哪些 Dubbo 介面以及依賴了哪些外部 Dubbo 介面,使用 Spring XML 的形式配置 Dubbo,同時又依賴了 dubbo-spring-boot-starter 包,結果將 Dubbo 配置項託管至 Apollo 後,出現無法找到 Dubbo 配置項的情況。原因是 通過 Spring XML 方式配置 Dubbo 時所依賴的 OverrideDubboConfigApplicationListener 執行時機太早了(遠早於 Apollo 配置載入的時機) 。Apollo 1.2.0 版本支援「 apollo.bootstrap.eagerLoad.enabled 」配置項後雖然能解決這個問題,但還是不推薦 dubbo-spring-boot-starter + XML 這種形式的配置方式,推薦純 Spring Boot 方式。
注:詳見 https://github.com/ctripcorp/apollo/issues/1600
五、結語
至此 Spring Boot 整合 Apollo 的過程介紹完畢,相關程式碼已同步至 GitHub 。