Nacos 配置中心介紹及使用

HuDu發表於2022-08-02

前言

傳統的配置方式弊端
1、維護性:一旦有服務配置發生變化,所有的服務配置都得改變,例如 mysql、redis、mq 等。
2、實效性:修改完服務後還得重啟,頻繁的修改意味著頻繁的重啟,重啟完成之後配置修改才會生效。
3、安全性:配置的一些遠端 IP 地址,使用者名稱和密碼等敏感資訊都會暴露。

Nacos提供用於儲存配置和其他後設資料的 key/value 儲存,為分散式系統中的外部化配置提供伺服器端和客戶端支援。使用 Spring Cloud Alibaba Nacos Config,可以在 Nacos Server 集中管理 Spring Cloud應用的外部屬性配置。

springcloud config 對比
三大優勢

  • springcloud config 大部分場景結合git使用,動態變更還需要依賴 Spring Cloud Bus 訊息匯流排來透過所有的客戶端變化.
  • springcloud config 不提供視覺化介面
  • nacos config 使用長輪詢更新配置,一旦配置有變動後,通知 Provider 的過程非常的迅速,從速度上秒殺 springcloud 原來的 config 幾條街
對比專案/配置中心 springcloud config apollo nacos
開源時間 2014.9 2016.5 2018.6
配置實時推送 支援(Spring Cloud Bus) 支援(Http 長輪詢 1s 內) 支援(Http 長輪詢 1s 內)
版本管理 支援(Git) 自動管理 自動管理
配置回滾 支援(Git) 支援 支援
灰度釋出 支援 支援 支援
許可權管理 支援 支援 支援
多叢集多環境 支援 支援 支援
監聽查詢 支援 支援 支援
多語言 只支援 Java Go,C++,Python,java,.NET,OpenApi Python,Java,Nodejs,OpenApi
分散式高可用最小叢集數量 Conifig-Server2+Git+MQ Config2+Admin3+portal*2+Mysql=8 Nacos*3+Mysql=4
配置格式校驗 不支援 支援 支援
通行協議 HTTP 和 AMQP HTTP HTTP
資料一致性 Git保證資料一致性,Config-Server從Git讀取資料 資料庫模擬訊息佇列,Apollo定時讀取訊息 HTTP 非同步通知
單機讀(tps) 7(限流所致) 9000 15000
單機寫 5(限流所致) 1100 1800
3 節點讀 21(限流所致) 27000 45000
3 節點寫 5(限流所致) 3300 5600

一、Nacos-Config 配置介面

官方文件地址

1.1、配置列表

新建配置檔案

Nacos 配置中心使用

Nacos 配置中心使用

Nacos 配置中心使用

實際上是將配置儲存到資料庫中

Nacos 配置中心使用

1.2、歷史版本

當釋出配置更新之後

Nacos 配置中心使用

可以看到歷史版本

Nacos 配置中心使用

1.3、監聽查詢

可以檢視配置是否推動更新成功。

Nacos 配置中心使用

1.4、克隆

可以將配置快速克隆到其它開發環境中

Nacos 配置中心使用

二、許可權控制

如果需要使用許可權控制,需要修改配置檔案

$ vim application.properties

### If turn on auth system:
nacos.core.auth.enabled=true

此時可以看到多了許可權控制模組,可以給不同的使用者分配不同的角色,給不同的角色分配不同資源的不同的許可權,下圖為例,test 使用者只能訪問 dev 環境,且無法進行新增操作。

Nacos 配置中心使用

Nacos 配置中心使用

Nacos 配置中心使用

二、Nacos 配置中心使用

最佳實踐:
Namespace:代表不同的環境,如開發,測試,生產等
Group:代表專案,如xxx安全專案,xxx電商專案等
DataId:每個專案往往有若干個工程(微服務),每個配置集(DataId)是一個工程(微服務)的主配置檔案

Nacos 配置中心介紹及使用

2.1、引入依賴

先配置中心有這樣一份配置

Nacos 配置中心介紹及使用

<!--Nacos config 依賴-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.2、啟動類如下

@SpringBootApplication
public class ConfigApplication {
    public static void main(String[] args) throws InterruptedException {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ConfigApplication.class, args);
        while (true) {
            String userName = applicationContext.getEnvironment().getProperty("user.name");
            String userAge = applicationContext.getEnvironment().getProperty("user.age");
            System.err.println("user name :" + userName + "; age: " + userAge);
            TimeUnit.SECONDS.sleep(5);
        }
    }
}

在執行之前,必須使用 bootstrap.properties 配置檔案來配置 Nacos Server 地址,此配置檔案是 springcloud 擴充套件出來的,例如

resource 下 bootstrap.yml 檔案內容如下

spring:
  application:
    # 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
    name: com.hudu.mall.order.redis
  cloud:
    nacos:
      server-addr: 192.168.33.62:8847
      username: test
      password: 123456
      config:
        namespace: public

成功獲取到配置資訊

Nacos 配置中心介紹及使用

當我們修改配置檔案之後,nacos 可以立馬監測到配置的修改。

Nacos 配置中心介紹及使用

三、其它擴充套件

3.1、nacos 配置檔案擴充名

spring:
  application:
    # 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
    name: com.hudu.mall.order.redis
  cloud:
    nacos:
      server-addr: 192.168.33.62:8847
      username: kunjuee
      password: we753951.
      config:
        namespace: public
        # nacos 客戶端預設是 properties 的副檔名
        # 一旦修改成了飛 Properties 格式,則必須透過 file-extension 進行設定
        file-extension: yaml

3.2、支援配置的動態更新

即上面演示的,當配置中心的配置修改後,會立馬監測到配置檔案的修改。
可以透過spring.cloud.nacos.config.refresh-enabled=false來關閉動態重新整理

3.3、支援 profile 粒度的配置

spring-cloud-starter-alibaba-nacos-config 在載入配置的時候,不僅僅載入了以 dataid 為 ${spring.application.name}.${file-extension:properties}為字首的基礎配置,還載入了 dataid 為 ${spring.application.name}-${profile}.${file-extension:properties}的基礎配置。在日常開發中如果遇到多套配置環境下的不同配置,可以透過 Spring 提供的${spring.profile.active}這個配置項來配置

spring.profiles.active=develop

注意:${spring.profile.active}當透過配置檔案來指定時必須放在 bootstrap.properties 檔案中

當前配置中心配置如下

Nacos 配置中心介紹及使用

com.hudu.mall.order內容如下

Nacos 配置中心介紹及使用

com.hudu.mall.order-dev.yaml內容如下

Nacos 配置中心介紹及使用

專案結構如下

Nacos 配置中心介紹及使用

application.yml 內容如下

server:
  port: 8050
# 在配置中心中,可以透過 profile 進行設定
# 只有預設的配置檔案才能結合 profile 進行使用(跟服務名相同的 dataid 的配置檔案,稱之為預設的配置檔案)
# 對應的 Dataid:${spring.application.name}-${profile}.${file-extension:properties}
# profile 的字尾必須與跟隨預設配置檔案的格式來
spring:
  profiles:
    active: dev

bootstrap.yml 檔案內容如下

spring:
  application:
    # 會自動根據服務名稱拉取 dataid 對應的配置,如果 dataid 與服務名不一致,需要手動指定 dataid
    # 跟服務名相同的 dataid 的配置檔案,稱之為預設的配置檔案)
    # 除了預設的配置檔案,其他配置檔案必須寫上字尾
    name: com.hudu.mall.order
  cloud:
    nacos:
      server-addr: 192.168.33.62:8847
      username: kunjuee
      password: we753951.
      config:
        namespace: public
        # nacos 客戶端預設是 properties 的副檔名
        # 一旦修改成了飛 Properties 格式,則必須透過 file-extension 進行設定
        file-extension: yaml
        # 客戶端將無法感知配置的變化
        # refresh-enabled: false

結果如下

配置檔案優先順序(優先順序大的會覆蓋優先順序小的,並且會形成互補)
profile > 預設配置檔案

Nacos 配置中心介紹及使用

但是,還是推薦使用名稱空間的方式區別不同環境的配置,因為可以進行許可權控制

Nacos 配置中心介紹及使用

3.4、支援 namespace 的配置

用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離, 例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
在沒有明確指定$(spring.clpud.nacos.config.namespace}配置的情況下,預設使用的是 Nacos 上Public 這個 namespace。如果需要使用自定義的名稱空間,可以透過以下配置來實現:

spring.cloud.nacos.config.namespace=namespaceName

3.5、自定義 Group 的配置

在沒有明確指定${spring.cloud.nacos.config.group}配置的強況下,預設使用的是 DEFAULT_GROUP,如果需要自定義自己的 Group,可以透過以下配置來實現

spring.cloud.nacos.config.group=DEVELOP_GROUP

注意:該配置必須放在 botstrap 配置檔案中,並且在新增配置時,Group 的值一定要和spring.cloud.nacos.config.group的配置值一致

3.6、自定義擴充的 DataId 配置

3.6.1、shared-configs

Spring Cloud Alibaba Nacos Config從0.2.1版本後,可支援自定義Data ld的配置。一個完整的配置案例如下所示:

新建如下配置

Nacos 配置中心介紹及使用

該配置只有三個屬性

Nacos 配置中心介紹及使用

新增如下配置

spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - dataId: com.hudu.mall.common.properties
            refresh: true
            # group: 預設是 DEFAULT_GROUP

可以看到成功獲取到配置,並且優先順序是小於 profile配置 和 預設配置檔案,

Nacos 配置中心介紹及使用

如果有多個配置,會以後獲取到的配置為準。

spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - dataId: com.hudu.mall.common.properties
            refresh: true
            # group: 預設是 DEFAULT_GROUP
         - dataId: com.hudu.mall.common02.properties
            refresh: true
            # group: 預設是 DEFAULT_GROUP

Nacos 配置中心介紹及使用

結果如下

Nacos 配置中心介紹及使用

3.6.2、extension-configs

建立如下配置

Nacos 配置中心介紹及使用

配置檔案內容如下

spring:
  cloud:
    nacos:
      config:
        shared-configs:
          - dataId: com.hudu.mall.common.properties #[0]
            refresh: true
            # group: 預設是 DEFAULT_GROUP
          - dataId: com.hudu.mall.common02.properties #[1]
            refresh: true
            # group: 預設是 DEFAULT_GROUP
        extension-configs[0]:
          dataId: com.hudu.mall.common03.properties
          refresh: true

結果如下

Nacos 配置中心介紹及使用

四、@RefreshScope

@Value註解可以獲取到配置中心的值,但是無動態感知修改後的值,需要利用@RefreshScope註解

@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
    @Value("${user.name}")
    public String username;

    @RequestMapping("show")
    public String show() {
        return username;
    }
}

五、總結

配置檔案優先順序如下

profile > 預設配置檔案 > extension-configs(下標越大優先順序越大) > shared-configs(下標越大優先順序越大)
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章