在之前的文章 《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
工程專案地址在:
- 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 服務配置中心案例</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指定了服務埠 8083spring.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 設定對應的配置
- 如何在工程中通過依賴和注解關聯上對應的外化配置
參考資料
- 官方案例: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/
代碼示例地址
本文案例,可以查看開源專案 springcloud-learning-example 中的 springcloud-nacos-config-sample 模塊:
- Github:https://github.com/JeffLi1993/springcloud-learning-example
- Gitee:https://gitee.com/jeff1993/springcloud-learning-example
以下系列教程推薦
- 《Spring Cloud 系列教程》
- 《Spring Boot 2.x 系列教程》
- 《Elasticsearch 入門系列教程》
作者:泥瓦匠 (公號「程式員泥瓦匠」)出處:https://www.bysocket.com 歡迎轉載,也請保留這段宣告,謝謝!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/379049.html
標籤:Java
上一篇:如何用Serverless讓SaaS獲得更靈活的租戶隔離和更優的資源開銷
下一篇:Java 將Word轉為OFD
