Spring Cloud 系列之 Apollo 配置中心(二)

本篇文章爲系列文章,未讀第一集的同學請猛戳這裏:微服務系列之Apollo配置中心(一)

本篇文章講解 Apollo 部門管理、用戶管理、配置管理、集羣管理。


點擊鏈接觀看:Apollo 部門管理、用戶管理、配置管理、集羣管理視頻(獲取更多請關注公衆號「哈嘍沃德先生」)


部門及用戶管理

接下來我們深入學習一下 Apollo 控制檯的使用,剛纔我們是通過樣例部門和 Apollo 用戶來操作的,可以自定義部門和用戶嗎?答案當然是可以的。下面我們就講一下如何自定義部門和用戶,如何給項目指定用戶並分配權限以及刪除應用。

應用配置

點擊管理員工具下的系統參數菜單進入應用配置頁面。

應用配置頁面通過organizations關鍵字查詢部門信息,下圖爲默認信息。

value一欄中添加自定義部門信息,點擊保存,無特殊說明則修改完一分鐘實時生效。

此時再去創建項目時,就可以選擇我們剛纔添加的部門了。

用戶管理

點擊管理員工具下的用戶管理菜單進入用戶管理頁面。

填寫用戶信息,點擊提交,無特殊說明則修改完一分鐘實時生效。

此時再去創建項目時,就可以選擇我們剛纔添加的用戶了。如下圖,我們給 product-service 項目分配了負責人 zhangsan,如果使用zhangsan登錄的話,則只能看到他自己負責的項目。而 apollo 用戶是超級管理員所以可以看到所有項目。

權限分配

進入項目後點擊右上角的授權按鈕,進入權限管理頁面。

可以給指定用戶添加對該應用的修改權發佈權,比如 order-service 是 apollo 創建的,但是我授權給了 zhangsan,zhangsan 再登錄時也就可以操作這個項目了。

刪除應用(項目)

點擊管理員工具下的刪除應用、集羣、AppNamespace菜單進入對應頁面。

刪除應用欄目中的 AppId 處填寫應用 id 先進行查詢,查詢到應用後點擊刪除應用即可。

配置管理

這一小節我們通過大量配圖演示如何增改刪配置信息,以及如何添加 Namespace。

添加配置

進入項目後點擊右上角的 新增配置

添加配置項信息,點擊提交即可,剛添加的配置信息處於未發佈狀態。

修改配置

點擊對應配置項的修改按鈕。

修改配置信息,也可填寫修改說明,點擊提交即可,更新後的信息如需生效要重新發布。

回滾

回滾代表恢復至上一次的發佈狀態,比如剛剛發佈的值是 order-service-2.0,回滾以後會恢復至上一次發佈的 order-service。

刪除配置

點擊對應配置項的刪除按鈕。

刪除配置信息後如需生效要重新發布。

添加 Namespace

如果配置項過多的情況下,可以通過 Namespace 來進行管理,Namespace 就相當於一份配置文件。

進入項目後點擊左下角添加Namespace

選擇創建Namespace,類型這裏需要說明一下:

  • public:公共配置,其他應用也可以使用;
  • private:私有配置,僅限本應用使用。

可以通過文本的方式添加多個配置項。

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=1234

測試

客戶端配置文件信息如下:

server:
  port: 9090 # 端口

spring:
  application:
    name: order-service # 應用名稱

# apollo 相關配置
app:
  id: order-service # 與 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://localhost:8080 # Apollo 中的 Eureka 註冊中心地址
  #cluster:  # 指定 Apollo 集羣,默認爲 default,相同集羣實例使用對應集羣的配置
  #cacheDir:  # 配置緩存目錄,網絡不可用時任然可提供配置服務
  bootstrap:
    enable: true # 啓用 apollo

env: DEV # 指定環境

註解方式

在啓動類或配置類中添加 @EnableApolloConfig({"application", "application-mysql"}) 註解並指定 Namespace,就可以直接使用 Spring 的 @Value 註解來獲取配置信息,${} 中對應 Apollo 中的 key,:後跟默認值。

@Value("${spring.datasource.driver-class-name:}")
private String driverClassName;
@Value("${spring.datasource.url:}")
private String url;
@Value("${spring.datasource.username:root}")
private String username;
@Value("${spring.datasource.password:root}")
private String password;

@GetMapping("/datasourceByAnnotation")
public Map<Object, Object> getDatasourceByAnnotation() {
    // JDK9中的新特性,快速創建只讀集合。
    return Map.of("driverClassName", driverClassName,
                  "url", url,
                  "username", username,
                  "password", password);
}

訪問:http://localhost:9090/datasourceByAnnotation 結果如下:

API方式

我們可以通過以下代碼讀取 Apollo 中的配置信息。

@GetMapping("/datasource")
public Map<Object, Object> getDatasource() {
    //ConfigService.getAppConfig(); // 讀取默認 Namespace
    // 讀取指定 Namespace
    Config config = ConfigService.getConfig("application-mysql");
    // 獲取配置信息,第一個參數爲配置項的 key,第二個參數爲默認值(讀取不到配置就會使用默認值,建議都加上默認值)
    String driverClassName = config.getProperty("spring.datasource.driver-class-name", null);
    String url = config.getProperty("spring.datasource.url", null);
    String username = config.getProperty("spring.datasource.username", null);
    String password = config.getProperty("spring.datasource.password", null);

    // JDK9中的新特性,快速創建只讀集合。
    return Map.of("driverClassName", driverClassName,
                  "url", url,
                  "username", username,
                  "password", password);
}

訪問:http://localhost:9090/datasource 結果如下:

公共配置

剛纔添加 Namespace 時我們選擇的是 private 私有配置,僅限本項目使用,如果有一些配置我們所有項目都需要使用,可以通過公共配置實現。

添加公共配置

比如我們先創建一個公共項目 common-service

然後創建公共的 Namespace。

添加配置信息提交併發佈。

值得注意的是,公共配置信息是哪個項目創建的才擁有修改和刪除的權力,其他項目只能選擇關聯和覆蓋。

關聯公共配置

order-service 項目關聯 common-service 的公共配置信息。

進入項目後點擊左下角添加Namespace,選擇關聯公共Namespace,添加剛纔創建的公共Namespace。

關聯成功以後在項目首頁可以看到關聯的配置信息,且只能選擇覆蓋此配置,不能刪除和修改配置信息(可以刪除Namespace)。或者直接在私有配置下配置同名的配置項,同名的私有配置會比公共配置優先級高。

測試

在啓動類或配置類中添加 @EnableApolloConfig({"application", "application-mysql", "microservice.application-common"}) 註解並指定 Namespace,就可以直接使用 Spring 的 @Value 註解來獲取配置信息,${} 中對應 Apollo 中的 key,:後跟默認值。

@Value("${commonName:}")
private String commonName;

@GetMapping("/commonByAnnotation")
public Map<Object, Object> getCommonByAnnotation() {
    return Map.of("commonName", commonName);
}

訪問:http://localhost:9090/commonByAnnotation 結果如下:

我們可以通過以下的方式讀取 Apollo 中的配置信息。

@GetMapping("/common")
public Map<Object, Object> getCommon() {
    //ConfigService.getAppConfig(); // 讀取默認 Namespace
    // 讀取指定 Namespace
    Config config = ConfigService.getConfig("microservice.application-common");
    // 獲取配置信息,第一個參數爲配置項的 key,第二個參數爲默認值(讀取不到配置就會使用默認值,建議都加上默認值)
    String commonName = config.getProperty("commonName", null);
    return Map.of("commonName", commonName);
}

訪問:http://localhost:9090/common 結果如下:

集羣管理

在有些特殊情況下,比如部署在 A 機房的應用連接的 MySQL 服務器地址和部署在 B 機房的應用連接的 MySQL 服務器地址不一樣。在這種情況下,可以通過在 Apollo 創建不同的集羣來解決。

添加集羣

進入項目後點擊左下角添加集羣,比如添加 SHAOY(歐陽數據中心)。

同步配置

集羣其實就是另一個環境而已,所有的操作和前面講的都一樣,這裏就不再贅述。有一點需要說明一下,就是同步配置功能。

假設 SHAOY 這個集羣的配置信息和默認集羣的配置信息只有個別地方不一致,大部分都是一致的,我們挨個添加豈不是很浪費時間?

可以看到在 SHAOY 這個集羣下的 application-mysql 的 Namespace 中是沒有任何配置項的。不急,Apollo 給我們提供了一個同步配置的功能。通過同步配置功能,可以使多個環境、集羣間的配置保持一致,需要注意的是,同步完之後需要發佈後纔會對應用生效。

既然是將默認集羣環境的配置同步至 SHAOY 環境中,那就在默認環境中選擇需要同步的 Namespace,點擊同步配置按鈕。

勾選需要同步的配置,選擇要同步到哪個集羣,然後點擊下一步。

點擊同步按鈕以後配置將同步成功,同步完之後需要發佈後纔會對應用生效。

數據已經同步過來了,我們根據需求修改了服務器地址爲 192.168.10.101,然後發佈配置。

測試

配置文件中通過 apollo.cluster 指定集羣名稱。

server:
  port: 9090 # 端口

spring:
  application:
    name: order-service # 應用名稱

# apollo 相關配置
app:
  id: order-service # 與 Apollo 配置中心中的 AppId 一致

apollo:
  meta: http://localhost:8080 # Apollo 中的 Eureka 註冊中心地址
  cluster: SHAOY # 指定 Apollo 集羣,默認爲 default,相同集羣實例使用對應集羣的配置
  #cacheDir:  # 配置緩存目錄,網絡不可用時任然可提供配置服務
  bootstrap:
    enable: true # 啓用 apollo

env: DEV # 指定環境

# 自定義配置
name: order-service-dev
mysql:
  host: localhost
  port: 3306
  username: root
  password: root

之前的代碼無需做任何改變,訪問:http://localhost:9090/datasourceByAnnotation 結果如下:

下一篇我們講解 Apollo 多環境部署方案,教大家搭建除了 DEV 的其他環境,記得關注噢~

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

大家可以通過 分類 查看更多關於 Spring Cloud 的文章。


🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章