Spring Cloud Alibaba 整合 Nacos 實(shí)現(xiàn)服務(wù)配置中心

在之前的文章 《Nacos 本地單機(jī)版部署步驟和使用》 中,大家應(yīng)該了解了 Nacos 是什么?其中 Nacos 提供了動(dòng)態(tài)配置服務(wù)功能

一、Nacos 動(dòng)態(tài)配置服務(wù)是什么?

官方是這么說(shuō)的:

Nacos 動(dòng)態(tài)配置服務(wù)是什么?

動(dòng)態(tài)配置服務(wù)可以以中心化、外部化和動(dòng)態(tài)化的方式管理所有環(huán)境的應(yīng)用配置和服務(wù)配置。

動(dòng)態(tài)配置消除了配置變更時(shí)重新部署應(yīng)用和服務(wù)的需要,讓配置管理變得更加高效和敏捷。

配置中心化管理讓實(shí)現(xiàn)無(wú)狀態(tài)服務(wù)變得更簡(jiǎn)單,讓服務(wù)按需彈性擴(kuò)展變得更容易。

Nacos 控制臺(tái)的功能

Nacos 提供了一個(gè)簡(jiǎn)潔易用的 UI (控制臺(tái)樣例 Demo) 用來(lái)管理所有的服務(wù)和應(yīng)用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀發(fā)布、一鍵回滾配置以及客戶端配置更新狀態(tài)跟蹤在內(nèi)的一系列開箱即用的配置管理特性,更安全地在生產(chǎn)環(huán)境中管理配置變更和降低配置變更帶來(lái)的風(fēng)險(xiǎn)。

二、實(shí)戰(zhàn):Nacos 實(shí)現(xiàn)服務(wù)配置中心

下面通過(guò)兩個(gè)大模塊實(shí)現(xiàn):

  • 在 Nacos 中新建或修改配置
  • 在 Spring Cloud 應(yīng)用中加載 Nacos 配置

2.1 在 Nacos 新建配置

根據(jù)上篇文章,部署運(yùn)行 Nacos ,然后打開配置管理 - 配置列表頁(yè)面。地址: http://localhost:8848/nacos/index.html#/configurationManagement

點(diǎn)擊右上角創(chuàng)建按鈕,進(jìn)入新建配置頁(yè)面,新建配置如圖所示:

配置詳解:

  • Data ID :配置為 config-service.yml 。Data ID 是指定配置且保證全局唯一性。
  • Group :默認(rèn)配置為 DEFAULT_GROUP,不需要修改。
  • 配置格式 : 選擇 YAML 配置文件格式
  • 配置內(nèi)容 : 具體配置的內(nèi)容。這里簡(jiǎn)單配置了個(gè)鍵值對(duì),其實(shí)實(shí)際應(yīng)用場(chǎng)景,會(huì)配置包括存儲(chǔ)配置、端口配置和各種中間件配置等

Nacos Data ID 標(biāo)準(zhǔn)格式如下:

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

其中:

  • prefix :默認(rèn)為 spring.application.name 的值
  • spring.profiles.active:該案例為空,一般指定 dev test 等環(huán)境配置
  • file-extension:配置內(nèi)容格式

2.2 創(chuàng)建 Spring Cloud 應(yīng)用

1、創(chuàng)建應(yīng)用

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

工程項(xiàng)目地址在:

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 服務(wù)配置中心案例</name>

    <!-- Spring Boot 啟動(dòng)父依賴 -->
    <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、創(chuàng)建配置文件

在應(yīng)用工程的 resources 目錄下,創(chuàng)建 application.yml 文件,填入如下信息:

server:
  port: 8083 # 服務(wù)端口

spring:
  application:
    name: config-service # 服務(wù)名稱

其中:

  • server.port 指定了服務(wù)端口 8083
  • spring.application.name 指定了服務(wù)名稱 config-service ,要跟 Nacos 后臺(tái)新建配置的 Data ID 值保持一致。

為啥呢?因?yàn)榭匆幌?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 服務(wù)名稱配置。

繼續(xù)創(chuàng)建 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、創(chuàng)建測(cè)試類和啟動(dòng)類

新建 Spring Cloud 應(yīng)用啟動(dòng)類 ConfigApplication,代碼如下:

/**
 * Spring Boot 服務(wù)啟動(dòng)類
 *
 * Created by bysocket.com on 21/12/06.
 */
@SpringBootApplication  // Spring Boot 應(yīng)用標(biāo)識(shí)
public class ProviderApplication {

    public static void main(String[] args) {
        // 程序啟動(dòng)入口
        // 啟動(dòng)嵌入式的 Tomcat 并初始化 Spring 環(huán)境及其各 Spring 組件
        SpringApplication.run(ProviderApplication.class,args);
    }
}

然后新建測(cè)試控制類 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 對(duì) Bean 的字段或者方法參數(shù)進(jìn)行標(biāo)注,職責(zé)是基于表達(dá)式給字段或方法參數(shù)設(shè)置默認(rèn)屬性值。通常格式是注解 + SpEL 表達(dá)式,如 @Value("SpEL 表達(dá)式")。
  • @RefreshScope 注解 :允許在運(yùn)行時(shí)動(dòng)態(tài)刷新 Bean 的 Scope 實(shí)現(xiàn)。如果 Bean 被刷新,則在下次訪問(wèn) Bean 即執(zhí)行方法時(shí),會(huì)創(chuàng)建一個(gè)新實(shí)例。這說(shuō)明在應(yīng)用運(yùn)行時(shí),在 Nacos 控制臺(tái)修改了對(duì)應(yīng)配置的值后,會(huì)同時(shí)修改和生效該 Bean 這個(gè)值,達(dá)到動(dòng)態(tài)配置的效果。

5、運(yùn)行測(cè)試

啟動(dòng)上面的應(yīng)用,會(huì)在控制臺(tái)看到如下信息:

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'}]

這里可以看出,已經(jīng)加載了 Nacos 配置信息 dataId: 'config-service.yml'group: 'DEFAULT_GROUP' 。

最后在瀏覽器打開地址 http://localhost:8083/get ,響應(yīng)如圖所示:

動(dòng)態(tài)配置測(cè)試

然后去 Nacos 控制臺(tái),配置列表點(diǎn)擊修改 config-service.yml 配置。將 www.bysocekt.com 改成 bysocket.com,然后確認(rèn)發(fā)布。如圖所示:

可以從控制臺(tái)看到如下日志:

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]

重新訪問(wèn)下瀏覽器該地址 http://localhost:8083/get ,響應(yīng)如圖所示:

說(shuō)明動(dòng)態(tài)刷新配置成功。

三、Nacos 實(shí)現(xiàn)分布式配置小結(jié)

本文詳細(xì)介紹了Spring Cloud 整合 Nacos 實(shí)現(xiàn)服務(wù)分布配置。關(guān)鍵兩點(diǎn):

  • 如何在 Nacos 設(shè)置對(duì)應(yīng)的配置
  • 如何在工程中通過(guò)依賴和注解關(guān)聯(lián)上對(duì)應(yīng)的外化配置

參考資料

代碼示例地址

本文案例,可以查看開源項(xiàng)目 springcloud-learning-example 中的 springcloud-nacos-config-sample 模塊:

以下系列教程推薦

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容