Spring Cloud Alibaba 整合 Nacos 實現服務配置中心

程式設計師泥瓦匠發表於2021-12-10

在之前的文章 《Nacos 本地單機版部署步驟和使用》 中,大家應該瞭解了 Nacos 是什麼?其中 Nacos 提供了動態配置服務功能

一、Nacos 動態配置服務是什麼?

官方是這麼說的:

Nacos 動態配置服務是什麼?

動態配置服務可以以中心化、外部化和動態化的方式管理所有環境的應用配置和服務配置。

動態配置消除了配置變更時重新部署應用和服務的需要,讓配置管理變得更加高效和敏捷。

配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴充套件變得更容易。

Nacos 控制檯的功能

Nacos 提供了一個簡潔易用的 UI (控制檯樣例 Demo) 用來管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀釋出、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。

二、實戰:Nacos 實現服務配置中心

下面通過兩個大模組實現:

  • 在 Nacos 中新建或修改配置
  • 在 Spring Cloud 應用中載入 Nacos 配置

2.1 在 Nacos 新建配置

根據上篇文章,部署執行 Nacos ,然後開啟配置管理 - 配置列表頁面。地址: http://localhost:8848/nacos/index.html#/configurationManagement

點選右上角建立按鈕,進入新建配置頁面,新建配置如圖所示:

配置詳解:

  • Data ID :配置為 config-service.yml 。Data ID 是指定配置且保證全域性唯一性。
  • Group :預設配置為 DEFAULT_GROUP,不需要修改。
  • 配置格式 : 選擇 YAML 配置檔案格式
  • 配置內容 : 具體配置的內容。這裡簡單配置了個鍵值對,其實實際應用場景,會配置包括儲存配置、埠配置和各種中介軟體配置等

Nacos Data ID 標準格式如下:

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

其中:

  • prefix :預設為 spring.application.name 的值
  • spring.profiles.active:該案例為空,一般指定 dev test 等環境配置
  • file-extension:配置內容格式

2.2 建立 Spring Cloud 應用

1、建立應用

新建工程,工程名為:springcloud-nacos-config-sample

工程專案地址在:

2、配置 pom 依賴

pom.xml 程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springcloud</groupId>
    <artifactId>springcloud-nacos-config-sample</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloud-nacos-config-sample :: Nacos 服務配置中心案例</name>

    <!-- Spring Boot 啟動父依賴 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
    </parent>

    <dependencies>

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

        <!-- Spring Boot Web 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.10</version>
            <optional>true</optional>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>0.2.2.RELEASE</version>
            </dependency>
            
            <!-- Spring Cloud Hoxton.SR12 版本依賴 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR7</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

其中依賴了:

  • Spring Cloud Alibaba Nacos Config 依賴
  • Spring Cloud Hoxton.SR12 版本依賴

3、建立配置檔案

在應用工程的 resources 目錄下,建立 application.yml 檔案,填入如下資訊:

server:
  port: 8083 # 服務埠

spring:
  application:
    name: config-service # 服務名稱

其中:

  • server.port 指定了服務埠 8083
  • spring.application.name 指定了服務名稱 config-service ,要跟 Nacos 後臺新建配置的 Data ID 值保持一致。

為啥呢?因為看一下 Nacos Config 原始碼 org.springframework.cloud.alibaba.nacos.client.NacosPropertySourceLocator#locate 。原始碼如下:

if (StringUtils.isEmpty(dataIdPrefix)) {
    dataIdPrefix = env.getProperty("spring.application.name");
}

如果 Data ID 沒有配置,則讀取 spring.application.name 服務名稱配置。

繼續建立 bootstrap.yml 檔案,填入以下資訊:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848 # Nacos 配置中心地址
        file-extension: yml # 配置檔案格式

其中:

  • nacos.config.server-addr 指定了 Nacos 地址和埠
  • nacos.config.file-extension 指定了配置檔案格式為 yml

4、建立測試類和啟動類

新建 Spring Cloud 應用啟動類 ConfigApplication,程式碼如下:

/**
 * Spring Boot 服務啟動類
 *
 * Created by bysocket.com on 21/12/06.
 */
@SpringBootApplication  // Spring Boot 應用標識
public class ProviderApplication {

    public static void main(String[] args) {
        // 程式啟動入口
        // 啟動嵌入式的 Tomcat 並初始化 Spring 環境及其各 Spring 元件
        SpringApplication.run(ProviderApplication.class,args);
    }
}

然後新建測試控制類 ConfigController,程式碼如下:

/**
 * Config 案例
 * <p>
 * Created by bysocket.com on 21/12/07.
 */
@RestController
@Slf4j
@RefreshScope
@Data
public class ConfigController {

    @Value("${blog.name}")
    private String blogName;

    @GetMapping("/get")
    public String get() {
        return "ConfigController#get blog name = " + getBlogName();
    }
}

程式碼詳解如下:

  • @Value 註解 :@Value 對 Bean 的欄位或者方法引數進行標註,職責是基於表示式給欄位或方法引數設定預設屬性值。通常格式是註解 + SpEL 表示式,如 @Value("SpEL 表示式")。
  • @RefreshScope 註解 :允許在執行時動態重新整理 Bean 的 Scope 實現。如果 Bean 被重新整理,則在下次訪問 Bean 即執行方法時,會建立一個新例項。這說明在應用執行時,在 Nacos 控制檯修改了對應配置的值後,會同時修改和生效該 Bean 這個值,達到動態配置的效果。

5、執行測試

啟動上面的應用,會在控制檯看到如下資訊:

2021-12-09 20:11:43.399  INFO 13909 --- [-127.0.0.1_8848] o.s.c.a.n.c.NacosPropertySourceBuilder   : Loading nacos data, dataId: 'config-service.yml', group: 'DEFAULT_GROUP'
2021-12-09 20:11:43.400  INFO 13909 --- [-127.0.0.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-config-service.yml'}]

這裡可以看出,已經載入了 Nacos 配置資訊 dataId: 'config-service.yml'group: 'DEFAULT_GROUP'

最後在瀏覽器開啟地址 http://localhost:8083/get ,響應如圖所示:

動態配置測試

然後去 Nacos 控制檯,配置列表點選修改 config-service.yml 配置。將 www.bysocekt.com 改成 bysocket.com,然後確認釋出。如圖所示:

可以從控制檯看到如下日誌:

2021-12-09 20:31:30.747  INFO 13909 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [blog.name]

重新訪問下瀏覽器該地址 http://localhost:8083/get ,響應如圖所示:

說明動態重新整理配置成功。

三、Nacos 實現分散式配置小結

本文詳細介紹了Spring Cloud 整合 Nacos 實現服務分佈配置。關鍵兩點:

  • 如何在 Nacos 設定對應的配置
  • 如何在工程中通過依賴和註解關聯上對應的外化配置

參考資料

程式碼示例地址

本文案例,可以檢視開源專案 springcloud-learning-example 中的 springcloud-nacos-config-sample 模組:

以下系列教程推薦

相關文章