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

在之前的文章 《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 模塊:

以下系列教程推薦

作者:泥瓦匠 (公號「程序員泥瓦匠」)出處:https://www.bysocket.com 歡迎轉載,也請保留這段聲明。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章