快速搭建 SpringCloud Alibaba Nacos 設定中心!

2022-08-29 06:01:53

Spring Cloud Alibaba 是阿里巴巴提供的一站式微服務開發解決方案,目前已被 Spring Cloud 官方收錄。而 Nacos 作為 Spring Cloud Alibaba 的核心元件之一,提供了兩個非常重要的功能:服務註冊中心(服務註冊和發現)功能,和統一設定中心功能。

Nacos 簡介

Nacos 致力於幫助開發者發現、設定和管理微服務。它提供了一組簡單易用的特性集,幫助開發者快速實現動態服務發現、服務設定、服務後設資料及流量管理。

Nacos 特性介紹

Nacos 具有以下特性:

  • 服務發現和服務健康監測:支援基於DNS和基於RPC的服務發現,支援對服務的實時的健康檢查,阻止向不健康的主機或服務範例傳送請求。
  • 動態設定服務:動態設定服務可以讓您以中心化、外部化和動態化的方式管理所有環境的應用設定和服務設定。
  • 動態 DNS 服務:動態 DNS 服務支援權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單 DNS 解析服務。
  • 服務及其後設資料管理:支援從微服務平臺建設的視角管理資料中心的所有服務及後設資料。

設定中心功能實現

1.新增依賴

建立一個新的 Spring Boot 專案,新增 nacos config 和 web(非必須)框架依賴,如下圖所示:

PS:新增 web 依賴主要作用是為了方便後面程式碼測試。

如果是老專案,那麼需要手動新增 nacos config 的依賴,修改 pom.xml 檔案,新增以下內容:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

2.設定 Nacos Config 資訊

在應用的 /src/main/resources/ 目錄下,建立引導組態檔 bootstrap.yml(或 bootstrap.properties),新增以下 Nacos Config 設定資訊:

spring:
  application:
    name: nacosconfig # 專案名稱和 nacos DataId 相匹配
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # nacos 地址和埠
        file-extension: yaml # 獲取組態檔的格式:yaml
        username: nacos # nacos 認證使用者名稱
        password: nacos # nacos 認證密碼
server:
  port: 9001 # 專案啟動埠

3.編寫程式碼讀取組態檔

建立一個控制器,使用 @Value 註解讀取設定資訊,讀取方式和 Spring Boot 讀取本地設定程式碼一致:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    // 從 nacos 中讀取設定項 config.info
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getconfig")
    public String getConfigInfo(){
        return configInfo;
    }
}

4.Nacos 控制檯新增設定資訊

在 Nacos 控制檯建立並設定組態檔,執行步驟如下所示。
首先,在設定列表中點選「新增」按鈕,如下圖所示:

進入設定頁面,新建 YAML 或 Properties 組態檔,如下圖所示:

以上關鍵引數的含義和規則說明如下。

① Data ID

Data ID 的拼接格式如下:

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

其中

  • prefix 預設為 spring.application.name 的值,也可以通過設定項 spring.cloud.nacos.config.prefix 來設定。
  • spring.profiles.active 即為當前環境對應的 profile,當 active profile 為空時,對應的連線符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
  • file-extension 為設定內容的資料格式,可以通過設定項 spring.cloud.nacos.config.file-extension 來設定。目前只支援 properties 型別。

② Group

Group 分組選項,主要是用來隔離不同的設定專案的,它的預設值為 DEFAULT_GROUP,可以通過 spring.cloud.nacos.config.group 設定。

設定好相應的內容之後,點選底部的「釋出」按鈕即可,新增成功之後會自動返回設定列表,如下圖所示:

啟動專案,檢視執行結果如下圖所示:

動態重新整理功能

動態重新整理功能是指:在 Nacos 設定中心修改的設定內容,在不重啟專案的前提下可以實時的讀取到。

Nacos 預設會為所有獲取資料成功的 Nacos 的設定項新增了監聽功能,在監聽到伺服器端設定發生變化時會實時觸發 org.springframework.cloud.context.refresh.ContextRefresher 的 refresh 方法。

如果需要對 Bean 進行動態重新整理,需要參照 Spring 和 Spring Cloud 規範,推薦給類新增 @RefreshScope 或 @ConfigurationProperties 註解

以上面的案例來說,如果需要新增動態重新整理功能,只需要在控制器上新增 @RefreshScope 註解即可,實現程式碼如下:

  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;

@RestController
@RefreshScope // 開啟組態檔的動態重新整理
public class TestController {
    // 從 nacos 中讀取設定項 config.info
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getconfig")
    public String getConfigInfo(){
        return configInfo;
    }

}

最終的實現結果如下:

亮點功能介紹

Nacos 設定中心有兩個很好用的功能:一個是修改設定時的內容對比,讓您一眼就可以看出此次修改的設定內容,防止誤操作;第二個是歷史版本一鍵回滾功能,讓您能夠輕鬆的實現溯源和回滾組態檔。

1.組態檔對比

在修改組態檔時,會先出現一個組態檔的對比預覽頁面,如下圖所示:

這樣您就可以清楚的看到此次修改和新增的具體設定資訊了,從而減少了誤改的風險。

2.歷史版本一鍵回滾

Nacos 通過提供設定版本管理及其一鍵回滾能力,幫助使用者改錯設定的時候能夠快速恢復,降低微服務系統在設定管理上的一定會遇到的可用性風險。

專案原始碼

https://gitee.com/mydb/spring-cloud-alibaba-example/tree/master/spring-cloud-nacos-config

總結

Nacos 作為 Spring Cloud Alibaba 的核心元件之一,提供了兩個非常重要的功能:註冊中心和設定中心功能。其中設定中心是將組態檔從在地化,變更為雲端化的過程(Nacos 伺服器端),這樣既能保證組態檔的安全性,又能實時的修改、檢視、回滾和動態重新整理組態檔了。

參考檔案

Nacos 官方檔案:https://nacos.io/zh-cn/docs/what-is-nacos.html

是非審之於己,譭譽聽之於人,得失安之於數。

公眾號:Java中文社群

Java面試合集:https://gitee.com/mydb/interview