天天看點

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置

源碼位址: https://gitee.com/fighter3/eshop-project.git 持續更新中……

在我們前面介紹Nacos的時候,說到,Nacos除了可以作為注冊中心,還可以作為配置中心,而在SpringCloud Netfilx的體系下,這個工作是由Spring Cloud Config完成的。

至于為什麼需要配置中心?大家想一下,在微服務開發體系下,整個系統可能被拆分成幾十、上百個服務,在生産的時候,每個服務可能部署幾十上百個節點,而且通常是又多個環境,如開發、測試、預釋出、成産等等,如果沒有一個集中式的配置中心,一個個去管理,那是一個多麼😥的事情。

好了,接下來我們開始愉快地學習Nacos作為分布式配置中心吧!

1、Nacos配置基本概念

在正式開始實戰之前,我們先了解一下Nacos配置的一些基本概念。

上圖我們可以看到Nacos作為配置中心的幾個主要概念:

  • 命名空間
區分環境,比如:dev、test、prod 等等。

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

  • 配置分組
多個配置檔案放在一起,形成組,一般用于區分項目。例如,某學校多應用之間的區分,教師應用 TEACHER_GROUP,學生應用 STUDENT_GROUP。

Nacos 中的一組配置集,是組織配置的次元之一。通過一個有意義的字元串(如 Buy 或 Trade )對配置集進行分組,進而區分 Data ID 相同的配置集。當您在 Nacos 上建立一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱預設采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或元件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。

  • 配置集
多個鍵值對,一般指一個配置檔案。

一組相關或者不相關的配置項的集合稱為配置集(多個鍵值對/一個配置檔案)。在系統中,一個配置檔案通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了資料源、線程池、日志級别等配置項。

  • 配置集ID
給這個配置檔案起一個全局唯一的 ID。

Nacos 中的某個配置集的 ID。配置集 ID 是組織劃配置設定置的次元之一。Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱辨別。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局唯一性。此命名規則非強制。

  • 配置項
一個鍵值對 <Key = Value>

一個具體的可配置的參數與其值域(一個鍵值對),通常以 param-key=param-value 的形式存在。例如我們常配置系統的日志輸出級别(logLevel=INFO|WARN|ERROR) 就是一個配置項。

給大家看一個Nacos的配置示例,這些概念相信你就都明白。

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置

2、引入Nacos配置中心

我們以eshop-user為例示範我們的配置中心。

2.1、引入nacos-config依賴

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

2.2、配置檔案

和SpringCloud Config類似,我們必需要在

bootstrap.yml

配置檔案中進行配置,在

application.yml

中無效,

bootstrap.yml

優先級高于

application.yml

spring:
  application:
    name: user-service # 應用名稱
  profiles:
    active: dev      # 目前環境對應的 profile
  cloud:
    nacos:
      config:
        enabled: true     # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
        server-addr: 127.0.0.1:8848   # Nacos Server 位址
        group: DEFAULT_GROUP     # 組,預設為 DEFAULT_GROUP
        file-extension: yaml    # 配置内容的資料格式,預設為 properties      
說明:之是以需要配置

spring.application.name

,是因為它是構成 Nacos 配置管理

dataId

字段的一部分。

在 Nacos Spring Cloud 中,

dataId

的完整格式如下:

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

  • prefix

    預設為

    spring.application.name

    的值,也可以通過配置項

    spring.cloud.nacos.config.prefix

    來配置。
  • spring.profile.active

    即為目前環境對應的 profile。注意:當

    spring.profile.active

    為空時,對應的連接配接符

    -

    也将不存在,dataId 的拼接格式将變成

    ${prefix}.${file-extension}

  • file-exetension

    為配置内容的資料格式,可以通過配置項

    spring.cloud.nacos.config.file-extension

    來配置。目前隻支援

    properties

    yaml

    類型,預設為

    properties

2.3、Nacos Server建立配置

我們在Nacos Server的配置清單中建立一個配置。

Data Id

user-service.yaml

,組使用預設組,并添加

yaml

格式的配置資訊。

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置
project:
  name: e-shop-userservice
  author: fighter3      

2.4、控制層

使用 Spring 的

@Value

注解來擷取配置資訊,

${}

中對應 Nacos 配置中心配置内容的 key,

:

後跟預設值。

并且通過 Spring Cloud 原生注解

@RefreshScope

實作配置自動更新。

/**
 * @Author: 三分惡
 * @Date: 2021/5/30
 * @Description: Nacos配置項擷取
 **/

@RefreshScope
@RestController
@RequestMapping("/shop-user")
@Api(value = "配置資訊接口", tags = "配置資訊接口")
public class NacosConfigController {
    @Value("${project.name:}")
    private String projectName;

    @Value("${project.author:}")
    private String projectAuthor;

    @GetMapping("/config")
    @ApiOperation(value = "擷取Nacos配置項")
    public Map<String, Object> getConfig() {
        Map<String, Object> configMap = new HashMap();
        configMap.put("projectName", projectName);
        configMap.put("projectAuthor", projectAuthor);
        return configMap;
    }

}      

2.5、測試

啟動

user-service

服務。

通路knife4j接口位址:http://localhost:8080/doc.html ,調用擷取Nacos配置項接口:

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置

接下來,我們修改一下配置項,并釋出:

可以看到控制台列印輸出:

再次通路擷取配置接口:

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置

OK,到這我們已經成功地讀取了Nacos配置中心的配置,接下來,我們嘗試将服務的配置,例如資料源來進行統一的集中配置。

3、集中配置

好,我們開始進行Nacos集中配置的實戰:

3.1、建立命名空間

我們之前用的是預設的命名空間,接下來我們建立一個新的命名空間,用于我們開發環境的配置。我們給它命名為

dev_space

:

這裡使用了命名空間來隔離配置,如果我們想要一個測試環境的配置,如法炮制,建一個新的空間就行了。

3.2、建立資料源配置

接下來我們在

dev_space

下建立一個新的配置

user-service-dev.yaml

project:
  name: e-shop-userservice
  author: fighter3
# 資料源配置
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shop_user?characterEncoding=utf-8&allowMultiQueries=true&serverTimezone=GMT%2B8
    username: root
    password: root       

3.3、修改本地配置

我們在bootstrap.yml中指定命名空間,完整bootstrap.yml如下:

spring:
  application:
    name: user-service # 應用名稱
  profiles:
    active: dev      # 目前環境對應的 profile
  cloud:
    nacos:
      config:
        enabled: true     # 如果不想使用 Nacos 進行配置管理,設定為 false 即可
        server-addr: 127.0.0.1:8848   # Nacos Server 位址
        group: DEFAULT_GROUP     # 組,預設為 DEFAULT_GROUP
        file-extension: yaml    # 配置内容的資料格式,預設為 properties
        namespace: dev_space    # 指定命名空間,預設為public      

修改application.yml,注釋掉資料源相關配置:

3.4、測試

啟動使用者服務,服務正常啟動以後,我們分别調試擷取使用者資訊接口和擷取配置接口。

SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置
SpringCloud Alibaba實戰(10:分布式配置中心)1、Nacos配置基本概念2、引入Nacos配置中心3、集中配置

OK,擷取到了預期的結果。

好了,Nacos作為分布式配置中心的實戰到此結束了,了解更多可以直接檢視官方文檔!

系列文章持續更新中!

“簡單的事情重複做,重複的事情認真做,認真的事情有創造性地做!”——

我是三分惡,可以叫我老三/三分/三哥/三子,一個能文能武的全棧開發,咱們下期見!