SpringBoot(19)---SpringBoot整合Apollo

SpringBoot(19)---SpringBoot整合Apollo

有關Apollo以前已經寫了兩篇文章:html

一、【Apollo】(1)--- Apollo入門介紹篇java

二、【Apollo】(2)--- Apollo架構設計git

這篇文章分爲兩部分:github

一、跟着官網步驟,快速搭建apollo環境spring

二、SpringBoot整合apollo,實現配置中心sql

1、Apollo快速搭建

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

一、下載Quick Start安裝包

下載apollo-build-scripts項目json

二、建立數據庫

以前有說過,apollo會有兩個數據庫: ApolloPortalDBApolloConfigDBbootstrap

建立ApolloPortalDBspringboot

建立ApolloConfigDB

三、更新數據庫鏈接信息

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

四、 啓動Apollo配置中心

上面三部就已經將環境搭建好,如今咱們開始啓動Apollo配置中心,來看具體效果。

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

啓動項目

./demo.sh start

五、登陸Apollo

網址:http://localhost:8070/

登陸界面

初始帳號密碼 : apollo/admin

進入首頁以後,咱們能夠看到: 默認的環境只有dev,m默認有一個SampleApp項目

咱們在這裏添加兩個配置

6. 測試客戶代碼

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

運行客戶端

./demo.sh client

啓動後去查詢配置

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

注意 這裏有一點在上面我設了 gougou:4歲。而實際客戶端得到的是4?,因此中文沒有轉義成功,在實際開發中,咱們也儘可能去避免有中文漢字來當配置。

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


2、SpringBoot整合Apollo

從上面咱們能夠知道在apollo官方給了咱們一個默認項目叫:SampleApp。默認的用戶名稱:apollo。因此這裏靈活一點,不用它本身的,而是咱們手動新增。

一、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

二、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 配置註解

三、測試

我在apollo配置了一個屬性: date.value = 2020.08.04,若是從springBoot可以獲取到該配置,那麼就說明成功了。

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


3、驗證

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

1)、配置修改後可否當即生效

2)、經過配置日誌打印級別,咱們來驗證可以動態的修改日誌級別

3)、可以經過修改端口號,可以修改項目運行的端口號

下面咱們一個一個來驗證

一、配置修改後可否當即生效?

新增一個接口

@Slf4j
@RestController
public class TestController {

    @Value( "${date.value}" )
    String dateValue;

    @GetMapping("test1")
    public void test1() {
        log.info("當前配置中心的 dateValue 值 = {}",dateValue);
    }
}

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

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

控制檯日誌也會輸出相關信息。

二、動態修改日誌級別

咱們來思考有沒有這麼一種需求,咱們在線上的日誌級別通常是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.ymlapollo都配置了日誌打印級別,但實際上打印出來的結果來看,最終是以apollo爲準。

如今咱們再來嘗試下,咱們修改apollo配置,把日誌級別修改爲debug級別。

apollo配置

由於咱們在LoggerConfig中,有個 @ApolloConfigChangeListener註解,咱們在修改配置的時候都會被監聽到,監聽到以後就會把當前的日誌級別,換成最新的。

咱們再來請求接口,看下控制檯。

總結 經過上面的驗證,能夠得出:我在沒有重啓服務器的狀況下,實現了日誌級別動態切換的功能。

三、動態修改端口號

這裏我就不把驗證的過程發出來了,結論就是不能夠。若是要驗證,在上面的refreshLoggingLevels方法中,加入修改端口的邏輯。

其實理由很簡單,由於端口跟進程綁定在一塊兒的,你的進程起來了,端口就沒法改變。若是必定要換端口號,那麼就須要有一個獨立進程,去殺掉你的項目進程,

再起一個新的不一樣端口的進程。顯然apollo沒有這樣的功能,並且我的以爲也沒啥意義。。

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

GitHub地址 :SpringBoot整合Apollo


參考

一、官方文檔

二、SpringBoot 整合 apollo



別人罵我胖,我會生氣,由於我內心認可了我胖。別人說我矮,我就會以爲可笑,由於我內心知道我不可能矮。這就是咱們爲何會對別人的攻擊生氣。
攻我盾者,乃我心裏之矛(29)
相關文章
相關標籤/搜索