1. 程式人生 > >Spring Boot 項目實戰(六)集成 Apollo

Spring Boot 項目實戰(六)集成 Apollo

接口 start zookeepe 開啟 str 我們 sta 環境 server

一、前言

上篇介紹了 Spring Boot 集成 Dubbo,使我們的系統打下了分布式的基礎。隨著程序功能的日益復雜,程序的配置日益增多:各種功能開關、參數配置、服務器地址等;對程序配置的期望值也越來越高:配置修改後實時生效,灰度發布,分環境、分集群管理配置,完善的權限、審核機制等;在這樣的大環境下,傳統的通過配置文件、數據庫等方式已經越來越無法滿足開發人員對配置管理的需求。分布式配置中心應運而生。本篇將主要介紹分布式配置中心 Apollo 的集成過程。


二、部署 Apollo

① 部署教程見官方文檔:https://github.com/ctripcorp/apollo/wiki/分布式部署指南

② 架構剖析:https://mp.weixin.qq.com/s/-hUaQPzfsl9Lm3IqQW3VDQ
技術分享圖片


三、使用 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 。

Spring Boot 項目實戰(六)集成 Apollo