SpringCloud Nacos 配置中心
摘要:spring: application: name: consumer-demo cloud: nacos: config: file-extension: yaml server-addr: 127.0.0.1:8848 prefix: ${spring.application.name} # 默認值就是 spring.application.name discovery: server-addr: 127.0.0.1:8848 profiles: active: dev。方誌朋 —— Spring Cloud Alibaba 教程:使用 Nacos 作爲配置中心: https://blog.csdn.net/forezp/article/details/90729945。
上一篇介紹了 Spring Cloud 中配置中心的使用,地址: https://mp.weixin.qq.com/s/QcIaGAYUvPBIqJM8oMbVvQ
這一節介紹 Nacos 作爲配置中心使用,不需要 Github
這裏首先需要注意,Nacos 在Spring、Spring Boot、Spring Cloud 這三種環境下的依賴、配置和使用方法都是不同的。這裏僅以 Spring Cloud + Nacos 爲例,闡述 Spring Cloud 中使用 Nacos 作爲服務註冊中心和配置中心。更具體的資料可以參考官方文檔: https://nacos.io/zh-cn/docs/quick-start.html
一、Nacos Server 創建配置
啓動 Nacos Server 端,瀏覽器訪問。
在 Nacos 中創建三個配置文件: consumer-demo.yaml
、 consumer-demo-dev.yaml
、 consumer-demo-prod.yaml
,內容略有區別。
consumer-demo.yml
二、Nacos-Consumer
創建一個 consumer-demo 項目,依賴如下:
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> <nacos.version>0.9.0.RELEASE</nacos.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>${nacos.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
在啓動類加上 @EnableDiscoveryClient 註解(這表示是啓用服務註冊,也可以不啓用而僅從 Nacos 讀取配置信息)。
刪除 application.yml
配置信息應寫在 bootstrap.properties
或 bootstrap.yml
文件中:
spring: application: name: consumer-demo cloud: nacos: config: file-extension: yaml server-addr: 127.0.0.1:8848 prefix: ${spring.application.name} # 默認值就是 spring.application.name discovery: server-addr: 127.0.0.1:8848 profiles: active: dev
查找的配置文件,即 nacos 中的 dataId,應該是: ${prefix}-${spring.profile.active}.${file-extension}
如果 ${active}
不存在,那麼會查找: ${prefix}.${file-extension}
啓動項目,控制檯出現類似如下信息:
2020-04-15 17:00:17.946 INFO 16392 --- [ main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'consumer-demo.yaml', group: 'DEFAULT_GROUP' 2020-04-15 17:00:17.953 INFO 16392 --- [ main] o.s.c.a.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'consumer-demo-dev.yaml', group: 'DEFAULT_GROUP' 2020-04-15 17:00:17.955 INFO 16392 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-consumer-demo-dev.yaml'}, BootstrapPropertySource {name='bootstrapProperties-consumer-demo.yaml'}] 2020-04-15 17:00:17.960 INFO 16392 --- [ main] c.e.c.ConsumerDemoApplication : The following profiles are active: dev
我們可以看到從 Nacos 加載了 consumer-demo.yaml 和 consumer-demo-dev.yaml
編寫一個測試接口:
@RefreshScope // 注意要加上 @RefreshScope 註解,否則即使 RefreshEventListener 檢測到配置信息被更新了,下面的 msg 還是會保持之前的值 @RestController @RequestMapping(value = "test") public class TestAction { @NacosValue("${msg}") private String msg; // 用 @NacosValue 獲取不到值 (null) @Value("${msg}") private String vMsg; // 用 @Value 獲取到了值 @GetMapping(value = "") public String hello() { return msg + ":" + vMsg; } }
打開瀏覽器,輸入 test 接口地址:
在 nacos 上修改一下 msg 的值,觀察控制檯,出現:
2020-04-15 17:11:43.355 INFO 16392 --- [-127.0.0.1_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [msg]
表明檢測到 msg 配置信息改變。刷新 test 接口,發現 msg 的值隨之改變了。
三、持久化
關閉 nacos server,重新啓動,發現上面創建的配置信息沒有丟失,這說明 nacos 把配置信息持久化存儲了。
Nacos 默認使用嵌入式數據庫,也支持修改數據源爲 MySQL
參考:
- 方誌朋 —— Spring Cloud Alibaba 教程:使用 Nacos 作爲配置中心: https://blog.csdn.net/forezp/article/details/90729945
- 擼帝 —— Nacos Config 客戶端的使用: https://www.jianshu.com/p/d8ed2eb2041d
- Nacos 官方文檔: https://nacos.io/zh-cn/docs/quick-start.html