天天看點

nacos (四). Nacos Config 配置中心

目錄:

  1. nacos Config是什麼?
  2. 快速接入
  3. 多環境隔離
    1. namespace 概念
    2. 分組 Group
    3. 用戶端配置檔案類型設定
    4. 項目配置實踐
    5. 共享配置 & 多配置檔案
  4. 配置中心的高可用叢集

一. Nacos Config

 是什麼?

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

Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,用戶端和伺服器上的概念與 Spring Environment 和 PropertySource 有着一緻的抽象,在特殊的 bootstrap 階段,配置被加載到 Spring 環境中。當應用程式通過部署管道從開發到測試再到生産時,您可以管理這些環境之間的配置,并確定應用程式具有遷移時需要運作的所有内容。

二. 快速接入

1. Nacos 服務端添加配置

先安裝好 Nacos Server ,然後啟動。

在 配置管理 - 配置清單 中添加一個配置。如下圖所示:

nacos (四). Nacos Config 配置中心

編輯好之後點選釋出即可。

  • Data ID : 一般為應用名稱,對應 Spring Boot 項目中的 

    spring.application.name

     參數
  • Group : 組,一般用來區分項目,此處直接用預設的公共組,後續會詳細說明
  • 配置格式: 一般預設為 Properties 格式,你可以根據自己的喜好去切換。

2. 用戶端使用

以 Spring Boot 項目為例。先添加依賴:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
           

在 

resource

 檔案夾中建立配置檔案 

bootstrap.yml

 來配置 Nacos Server 相關的參數,如下所示:

spring:
  application:
    name: nacos-config-base
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # 權限認證,nacos.core.auth.enabled=true 時需要添加
      username: nacos
      password: James2020+
      config:
        # nacos config 的開關
        # enabled: false
        prefix: nacos-config-base
        file-extension: yaml
        group: DEFAULT_GROUP
           

建立啟動類 

NacosConfigBaseApplication

 ,代碼如下所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;

import java.util.concurrent.TimeUnit;

@SpringBootApplication
public class NacosConfigBaseApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigBaseApplication.class, args);
        while (true) {
            // 當動态配置重新整理時,會更新到 Enviroment 中,是以這裡每隔一秒中從 Enviroment 中擷取配置
            String userName = applicationContext.getEnvironment().getProperty("base.name");
            String userAge = applicationContext.getEnvironment().getProperty("base.age");
            System.err.println("name :" + userName + "; age: " + userAge);
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
           

上面的代碼是每隔一秒,擷取一次 

base.name

 與 

base.age

 參數并列印。

applicationContext.getEnvironment().getProperty("base.age");

 這是擷取參數的一種方式。還可以用過注解來擷取。

将啟動類的代碼注釋掉,建立一個 

TestController

 類,添加如下代碼:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RefreshScope
@RestController
public class TestController {

    @Value("${base.name}")
    String name;

    @Value("${base.age}")
    String age;

    @GetMapping("/name")
    public String getName() {
        return name;
    }

    @GetMapping("/age")
    public String getAge() {
        return age;
    }
}
           

我們可以把 Nacos Config 中配置的參數,當成本地參數一樣,使用 

@Value("${}")

注解來擷取。同時加上 

@RefreshScope

 注解以保證可以實時更新。

三.多環境隔離

日常開發中,我們常常會有開發環境,測試環境,預釋出環境,生産環境等等。為了更好的差別這些環境,且防止配置混亂。官方及我個人都非常推薦使用 namespace 進行環境隔離。

注:Nacos Config 支援 profile 粒度的環境區分,但個人不建議這麼使用。使用 namespace 做環境隔離更徹底更安全,也更易于管理。

1. namespace 概念

這裡引用官方的概念說明:

用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生産環境的資源(如配置、服務)隔離等。

namespace 建立

打開 Nacos 控制台,在 命名空間 中可以對其進行管理,如下圖所示。

nacos (四). Nacos Config 配置中心

要注意的是,在項目中如果要指定命名空間,是通過 

命名空間ID

的,而不是通過名稱。

配置好了命名空間後,再打開配置清單,則可以在上方看到目前所有的命名空間。不同的命名空間可以允許存在相同 Data ID 的配置。

nacos (四). Nacos Config 配置中心

namespace 在代碼中的配置如下:

spring:
  cloud:
    nacos:
      config:
        # 這裡使用的是命名空間 ID 
        namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
           

2. 自定義 Group

一般我們會使用 namespace 區分環境,使用 Group 來區分項目,使用 Data ID 區配置設定置。以此來管理多項目,多環境下的配置檔案。

Group 一般沒有指定的話,預設為 DEFAULT_GROUP 。如果需要自定義的話,在 Nacos 控制台,建立配置檔案的時候自定義即可。在代碼中寫法如下:

spring:
  cloud:
    nacos:
      config:
        group: SPRING_CLOUD_EXAMPLE_GROUP
           

3. 用戶端配置檔案類型設定

1.在bootstrap.properties檔案中

nacos (四). Nacos Config 配置中心
spring:
  profiles:
    active: dev  #${spring.profile.active}

  application:
    name: consumer-user  #${prefix}

  cloud:
    nacos:
      config:
        server-addr: localhost:80
        file-extension: yaml  #${file-extension}
           

注意:

spring.cloud.nacos.config.file-extension=properties,yml,yaml

屬性聲明從配置中心中讀取的配置檔案格式

該配置的預設值為properties,即預設是讀取properties格式的配置檔案。當用戶端沒有配置該屬性,并且在nacos server添加的是yml格式的配置檔案,則給用戶端會讀取不到配置檔案,導緻啟動失敗。

非properties配置格式,必須添加如下配置才可生效

spring.cloud.nacos.config.file-extension=yml

2. 在Nacos管理中心添加配置,根據profile設定不同的環境配置

把application.yml的配置移動到nacos中

springboot中我們可以通過配置spring.profiles.active 實作在開發、測試、生産環境下采用不同的配置檔案

同樣,我們同科可以在nacos server分别建立

${application.name}-dev.properties

${application.name}-test.properties

${application.name}-prod.properties

 然後通過指令啟動jar時 設定spring.profiles.active來實作不同環境下使用不同的配置檔案。

java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

同樣也适用于yml/yaml檔案,隻是用戶端設定spring.cloud.nacos.config.file-extension=yaml具體可見上一個說明

nacos (四). Nacos Config 配置中心
nacos (四). Nacos Config 配置中心

DataId格式為

${prefix}-${spring.profile.active}.${file-extension}

4. 項目配置實踐

在項目實際配置中,個人建議如下按照如下方式進行配置。

首先,配置檔案要按照如下方式建立:

  • bootstrap.yml : 基礎配置,配置 Nacos Config 的基礎配置
  • application.yml : 存儲一些不需要放在 Nacos Config 的配置
  • bootstrap-dev.yml : 環境參數,開發環境
  • bootstrap-test.yml : 環境參數,測試環境
  • bootstrap-prod.yml : 環境參數,線上環境

配置内容分别如下:

bootstrap-dev.yml

nacos:
  server-addr: 127.0.0.1:8848
  username: username
  password: password
  # 開發環境的 namespace ID
  namespace: 904174a3-d51f-43ed-a456-c4fd7386ecb3
           

bootstrap-test.yml

nacos:
  server-addr: 192.168.9.10:8848
  username: username
  password: password
  # 測試環境的 namespace ID
  namespace: a463038a-525b-4ad0-988e-ec71ff043c22
           

bootstrap-prod.yml

nacos:
  server-addr: 100.100.10.1:8848
  username: username
  password: password
  # 生産環境的 namespace ID
  namespace: 0d84f533-74ca-4ca5-9dd8-01e8866cd0c4
           

bootstrap.yml

spring:
  profiles:
    active: dev
  application:
    name: nacos-config-advanced
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      # 權限認證,nacos.core.auth.enabled=true 時需要添加
      username: ${nacos.username}
      password: ${nacos.password}
        config:
          server-addr: ${nacos.server-addr}
          namespace: ${nacos.namespace}
          prefix: nacos-config-base
          file-extension: yaml
          group: SPRING_CLOUD_EXAMPLE_GROUP
           

共享配置 & 多配置檔案

日常開發中,多個子產品可能會有很多共用的配置,比如資料庫連接配接資訊,Redis 連接配接資訊,RabbitMQ 連接配接資訊,監控配置等等。

那麼此時,我們就希望可以加載多個配置,多個項目共享同一個配置之類等功能。Nacos Config 也确實支援。

我們可以使用 

spring.cloud.nacos.config.shared-configs

 和 

spring.cloud.nacos.config.extension-configs

 兩個參數節點來配置。

配置執行個體如下:

spring:
  application:
    name: nacos-config-multi
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      username: ${nacos.username}
      password: ${nacos.password}
      config:
        server-addr: ${nacos.server-addr}
        namespace: ${nacos.namespace}
        # 用于共享的配置檔案
        shared-configs:
          - data-id: common-mysql.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-redis.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

        # 正常配置檔案
        # 優先級大于 shared-configs,在 shared-configs 之後加載
        extension-configs:
          - data-id: nacos-config-advanced.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true

          - data-id: nacos-config-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true
           

參數解析:

  • data-id : Data Id
  • group:自定義 Data Id 所在的組,不明确配置的話,預設是 DEFAULT_GROUP。
  • refresh: 控制該 Data Id 在配置變更時,是否支援應用中可動态重新整理, 感覺到最新的配置值。預設是不支援的。
這裡的Data ID 需要注意,後面是加 

.yaml

 字尾的,且不需要指定 

file-extension

。這個有一個小坑,那就是在 Nacos 控制台添加配置檔案時,Data ID 的命名就要是 

common-mysql.yaml

 這種帶字尾的。且字尾名要和配置類型想比對,否則将會讀取不到配置。

具體配置如下圖所示,可與之前章節的配置對比下,之前章節的 Data ID 是沒有帶字尾的。

nacos (四). Nacos Config 配置中心

關于多配置檔案的優先級問題:

  1. 後加載的優先級高;
  2. extension-configs 優先級大于 shared-configs,因為在 shared-configs 之後加載
  3. shared-configs 與 extension-configs 的配置清單中,在下面的配置優先級高。

四. nacos server的叢集部署

叢集部署架構圖

官方的推薦部署架構圖:

nacos (四). Nacos Config 配置中心

推薦使用者把所有服務清單放到一個vip(虛拟IP,主機當機後可以自動漂移到備用機器上)下面,然後挂到一個域名下面

http://ip1:port/openAPI 直連ip模式,機器挂則需要修改ip才可以使用。

http://VIP:port/openAPI 挂載VIP模式,直連vip即可,下面挂server真實ip,可讀性不好。

http://nacos.com:port/openAPI 域名+VIP模式,可讀性好,而且換ip友善,推薦模式

具體操作實踐

注:目前器群模式下不采用mysql作為配置檔案的存儲方式,是以需要先配置為采用mysql資料源模式,我在上nacos1.4.1安裝 中已經說明了,這裡不再介紹,直接配置叢集。

步驟如下:

1.conf檔案夾下的檔案如下圖所示,其中下載下傳的壓縮包解壓出來是沒有cluster.conf的,通過複制cluster.conf-example并修改檔案名得來。

修改cluster.conf,将部署nacos server的三台伺服器ip位址寫上即可

三台伺服器cluster.conf檔案相同,都是協商這三個IP位址即可

#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***
           

2.分别啟動三台nacos server

修改用戶端,在用戶端的bootstrap.properties檔案中修改server的IP位址

注:修改成自己的三台伺服器ip位址,用逗号分隔

spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848

 ``

3.啟動用戶端 發現可以正常啟動