SpringBoot整合Apollo


一、Apollo快速搭建

apollo環境的搭建主要參考 官方文檔 ,我們就直接一步一步跟着官方文檔來

1、下載Quick Start安裝包

下載apollo-build-scripts項目

2、創建數據庫

之前有說過,apollo會有兩個數據庫: ApolloPortalDB 和 ApolloConfigDB

創建ApolloPortalDB

創建ApolloConfigDB

3、更新數據庫連接信息

在下載下來的Quick Start項目中,有個叫demo.sh的文件,我們需要 修改數據庫連接信息,修改里頭數據庫連接地址/用戶名/密碼

4、 啟動Apollo配置中心

上面三部就已經將環境搭建好,現在我們開始啟動Apollo配置中心,來看具體效果。

注意 這里默認暫用三個端口: 8070,8080,8090,所以要先看下這三個端口有木有被暫用。

啟動項目

./demo.sh start

5、登錄Apollo

網址:http://localhost:8070/

登錄界面

初始賬號密碼 : apollo/admin

進入首頁之后,我們可以看到: 默認的環境只有dev,m默認有一個SampleApp項目

我們在這里添加兩個配置

6. 測試客戶代碼

上面已經設置了兩個配置,這個時候我們就需要通過客戶端去獲取,我們先不通過SpringBoot去獲取,而是官方提供的客戶端去獲取配置

運行客戶端

./demo.sh client

啟動后去查詢配置

可以看到客戶端都能夠拿到配置中心的配置。

注意 這里有一點在上面我設了 gougou:4歲。而實際客戶端獲得的是4?,所以中文沒有轉義成功,在實際開發中,我們也盡量去避免有中文漢字來當配置。

這樣下來,官方給的快速啟動apollo是成功了,下面我們把客戶端換成SpringBoot,來實現獲取配置中心的數據。

 

二、SpringBoot整合Apollo

從上面我們可以知道在apollo官方給了我們一個默認項目叫:SampleApp。默認的用戶名稱:apollo。所以這里靈活一點,不用它自己的,而是我們手動新增。

1、Apollo創建新新用戶和項目

1)新增新用戶

http://{portal地址}/user-manage.html //我們這里設置的是http://localhost:8070/user-manage.html 

這里新增一個用戶名叫:liubei

2)新增項目

訪問http://localhost:8070 登錄后,選擇創建項目。

這里新創建了項目,一個AppId名稱叫: springboot-test-apollo

配置說明

部門:選擇應用所在的部門。(想自定義部門,參照官方文檔,這里就選擇樣例)

應用AppId:用來標識應用身份的唯一id,格式為string,需要和客戶端。application.properties中配置的app.id對應。

應用名稱:應用名,僅用於界面展示。

應用負責人:選擇的人默認會成為該項目的管理員,具備項目權限管理、集群創建、Namespace創建等權限。

提交配置后會出現如下項目配置的管理頁面。

3)添加配置

這里先添加一個新配置: date.value = 2020.08.04 。

2、springboot項目搭建

上面把apollo環境搭建好,也創建了新項目,那么這里就去讀取新項目的配置信息。

1)pom.xml

添加 Apollo 客戶端的依賴,其它依賴這里就不展示了,完整項目會放在github上。

<dependency> <groupId>com.ctrip.framework.apollo</groupId> <artifactId>apollo-client</artifactId> <version>1.3.0</version> </dependency> 

2)application.yml

server: port: 8123 app: id: springboot-test-apollo apollo: meta: http://127.0.0.1:8080 bootstrap: enabled: true eagerLoad: enabled: true #這里說明在將該項目 com目錄下的日志,都采用info模式輸出 logging: level: com: info 

配置說明

app.id :AppId是應用的身份信息,是配置中心獲取配置的一個重要信息。

apollo.bootstrap.enabled:在應用啟動階段,向Spring容器注入被托管的application.properties文件的配置信息。

apollo.bootstrap.eagerLoad.enabled:將Apollo配置加載提到初始化日志系統之前。

logging.level.com :調整 com 包的 log 級別,為了后面演示在配置中心動態配置日志級別。

3) TestController

@Slf4j @RestController public class TestController { @Value( "${date.value}" ) String dateValue; @GetMapping("test") public String test() { return "打印配置中心的 dateValue 值: "+ dateValue; } } 

4)SpringBoot啟動類

@SpringBootApplication @EnableApolloConfig public class Application { public static void main(String[] args) { SpringApplication.run(Application.class); } } 

添加 EnableApolloConfig 配置注解

3、測試

我在apollo配置了一個屬性: date.value = 2020.08.04,如果從springBoot能夠獲取到該配置,那么就說明成功了。

很明顯,我們通過接口已經成功獲取配置中心的配置。這樣一個最簡單的整合已經完成了,下面我們在來驗證其它東西。

 

三、驗證

下面我們來驗證一些有意思的東西:

1)、配置修改后能否立即生效

2)、通過配置日志打印級別,我們來驗證能夠動態的修改日志級別

3)、能夠通過修改端口號,能夠修改項目運行的端口號

下面我們一個一個來驗證

1、配置修改后能否立即生效?

新增一個接口

@Slf4j @RestController public class TestController { @Value( "${date.value}" ) String dateValue; @GetMapping("test1") public void test1() { log.info("當前配置中心的 dateValue 值 = {}",dateValue); } } 

步驟 :1)先請求接口一次。2)然后修改apollo配置中心。3)然后在請求一次該接口。

結論 從圖中很明顯看出第一次和第二次請求的接口,返回的配置信息已經不一樣了。說明配置是會時時更新的。而且當我在apollo界面修改配置的時候,

控制台日志也會輸出相關信息。

2、動態修改日志級別

我們來思考有沒有這么一種需求,我們在線上的日志級別一般是INFO級別的,主要記錄業務操作或者錯誤的日志。那么這個時候當線上環境出現問題希望輸出DEBUG

日志信息輔助排查的時候怎么辦呢?

如果以前,我們可以會修改配置文件,重新打包然后上傳重啟線上環境,以前確實是這么做的。通過Apollo配置中心我們可以實現不用重啟項目,就可以實現讓日志

基本從INFO變成DEBUG。下面我們來演示一番。

在項目啟動之前,我在application.yml配置了日志級別是info模式。我們來請求下面接口驗證下。


 @GetMapping("test2") public void test2() { log.debug("我是 debug 打印出的日志"); log.info("我是 info 打印出的日志"); log.error("我是 error 打印出的日志"); } 

請求下接口看下控制台

可以很明顯的看出,控制台只打印info級別以上的日志,並沒有打印debug日志。

現在我們要做的是將打印日志級別不在交給application.yml而是交給apollo來配置。這里其實要做兩步:

1)、在apollo配置一條日志數據

2)、通過監聽配置的變化,來達到熱更新的效果

java配置類

@Configuration public class LoggerConfig { private static final Logger logger = LoggerFactory.getLogger(LoggerConfig.class); private static final String LOGGER_TAG = "logging.level."; @Autowired private LoggingSystem loggingSystem; @ApolloConfig private Config config; @ApolloConfigChangeListener private void configChangeListter(ConfigChangeEvent changeEvent) { refreshLoggingLevels(); } @PostConstruct private void refreshLoggingLevels() { Set<String> keyNames = config.getPropertyNames(); for (String key : keyNames) { if (StringUtils.containsIgnoreCase(key, LOGGER_TAG)) { String strLevel = config.getProperty(key, "info"); LogLevel level = LogLevel.valueOf(strLevel.toUpperCase()); loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level); logger.info("{}:{}", key, strLevel); } } } } 

關鍵點講解

@ApolloConfig注解:將Apollo服務端的中的配置注入這個類中。

@ApolloConfigChangeListener注解:監聽配置中心配置的更新事件,若該事件發生,則調用refreshLoggingLevels方法,處理該事件。

ConfigChangeEvent參數:可以獲取被修改配置項的key集合,以及被修改配置項的新值、舊值和修改類型等信息。

從上面可以看出,通過@PostConstruct 項目啟動的時候就去獲取apollo的日志級別去覆蓋application.yml日志級別。我在apollo配置中心,新增加一條日志配置。

把日志級別設置error,那么在項目啟動的時候,因為PostConstruct注解的原因,所以會去執行一次refreshLoggingLevels方法,把當前日志級別改成error

apollo配置

我們重啟啟動項目再來看下,請求上面接口結果。

從上圖我們就可以看出,我們同時在application.yml 和apollo都配置了日志打印級別,但實際上打印出來的結果來看,最終是以apollo為准。

現在我們再來嘗試下,我們修改apollo配置,把日志級別修改成debug級別。

apollo配置

因為我們在LoggerConfig中,有個 @ApolloConfigChangeListener注解,我們在修改配置的時候都會被監聽到,監聽到之后就會把當前的日志級別,換成最新的。

我們再來請求接口,看下控制台。

總結 通過上面的驗證,可以得出:我在沒有重啟服務器的情況下,實現了日志級別動態切換的功能。

3、動態修改端口號

這里我就不把驗證的過程發出來了,結論就是不可以。如果要驗證,在上面的refreshLoggingLevels方法中,加入修改端口的邏輯。

其實理由很簡單,因為端口跟進程綁定在一起的,你的進程起來了,端口就無法改變。如果一定要換端口號,那么就需要有一個獨立進程,去殺掉你的項目進程,

再起一個新的不同端口的進程。顯然apollo沒有這樣的功能,而且個人覺得也沒啥意義。。

好了,整篇文章到這里就結束了,下面把該項目的具體代碼放到github上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM