SpringCloud Alibaba實戰(10:分散式配置中心)

三分惡發表於2021-07-01

原始碼地址:https://gitee.com/fighter3/eshop-project.git

持續更新中……

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

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

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

1、Nacos配置基本概念

在正式開始實戰之前,我們先了解一下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的配置示例,這些概念相信你就都明白。

Nacos配置示例

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 Conig類似,我們必需要在 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 來配置。目前只支援 propertiesyaml 型別,預設為 properties

2.3、Nacos Server建立配置

我們在Nacos Server的配置列表中新建一個配置。

Data Iduser-service.yaml,組使用預設組,並新增 yaml 格式的配置資訊。

Nacoos新建配置

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配置項介面:

獲取配置項

接下來,我們修改一下配置項,併發布:

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

控制檯列印輸出

再次訪問獲取配置介面:

獲取修改後的配置項

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 

dev-space

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、測試

啟動使用者服務,服務正常啟動以後,我們分別除錯獲取使用者資訊介面和獲取配置介面。

獲取使用者

配置項

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

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

系列文章持續更新中!


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

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



參考:

【1】:小專欄 《SpringCloudAlibaba微服務實戰》

【2】:nacos 實戰(史上最全)

【3】:4. Spring Cloud Alibaba Nacos Config

【4】:Spring Cloud 系列之 Alibaba Nacos 配置中心

相關文章