在之前的文章 《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)目地址在:
- Github:https://github.com/JeffLi1993/springcloud-learning-example/tree/master/springcloud-nacos-config-sample
- Gitee:https://gitee.com/jeff1993/springcloud-learning-example/tree/master/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 服務(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)的外化配置
參考資料
- 官方案例:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example
- 官方文檔:https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
- https://blog.didispace.com/spring-cloud-alibaba-nacos-config-2/
代碼示例地址
本文案例,可以查看開源項(xiàng)目 springcloud-learning-example 中的 springcloud-nacos-config-sample 模塊:
- Github:https://github.com/JeffLi1993/springcloud-learning-example
- Gitee:https://gitee.com/jeff1993/springcloud-learning-example
以下系列教程推薦
作者:泥瓦匠 (公號(hào)「程序員泥瓦匠」)出處:https://www.bysocket.com 歡迎轉(zhuǎn)載,也請(qǐng)保留這段聲明。謝謝!