javascript
Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇
文章目錄
- Nacos配置中心基礎概念
- 配置服務 (Configuration Service)
- 配置管理 (Configuration Management)
- 配置項
- 配置集
- 配置集 ID
- 配置分組
- 配置快照
- 配置中心的核心功能
- 實現配置中心要解決的問題
- 微服務接入配置步驟
- Step1 搞依賴包
- Step2 搞配置文件
- Step3 Nacos Config 增加配置
- Step4 驗證
- Another 栗子 (不停機生效新值)
- 業務場景
- Step1 Nacos Config 新增配置項
- Step2 @Value 解析對應的值
- Step3 Controller上添加@RefreshScope進行動態刷新
- Step4 驗證
- 源碼
Nacos配置中心基礎概念
https://nacos.io/zh-cn/docs/concepts.html
在系統開發過程中通常會將一些需要變更的參數、變量等從代碼中分離出來獨立管理,以獨立的配置文件的形式存在。目的是讓靜態的系統工件或者交付物(如 WAR,JAR 包等)更好地和實際的物理運行環境進行適配。配置管理一般包含在系統部署的過程中,由系統管理員或者運維人員完成這個步驟。配置變更是調整系統運行時的行為的有效手段之一。
配置服務 (Configuration Service)
在服務或者應用運行過程中,提供動態配置或者元數據以及配置管理的服務提供者。
配置管理 (Configuration Management)
在數據中心中,系統中所有配置的編輯、存儲、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱為配置管理。
配置項
一個具體的可配置的參數與其值域,通常以 param-key=param-value 的形式存在。例如我們常配置系統的日志輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。
配置集
一組相關或者不相關的配置項的集合稱為配置集。在系統中,一個配置文件通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了數據源、線程池、日志級別等配置項。
配置集 ID
Nacos 中的某個配置集的 ID。配置集 ID 是組織劃分配置的維度之一。Data ID 通常用于組織劃分系統的配置集。一個系統或者應用可以包含多個配置集,每個配置集都可以被一個有意義的名稱標識。Data ID 通常采用類 Java 包(如 com.taobao.tc.refund.log.level)的命名規則保證全局唯一性。此命名規則非強制。
配置分組
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
配置快照
Nacos 的客戶端 SDK 會在本地生成配置的快照。當客戶端無法連接到 Nacos Server 時,可以使用配置快照顯示系統的整體容災能力。配置快照類似于 Git 中的本地 commit,也類似于緩存,會在適當的時機更新,但是并沒有緩存過期(expiration)的概念。
配置中心的核心功能
- 不同環境不同配置
- 配置屬性動態刷新
實現配置中心要解決的問題
我們看看上圖,由幾個問題要解決
- 微服務怎么知道配置中心的地址 ?
- 微服務到底需要連接哪個環境 ?
- 怎么找到nacos config上的對應的配置文件 ?
微服務接入配置步驟
我們建立一個工程 artisan-cloud-nacos-config ,假設這個工程 要從配置中心上拉取配置 。
(不要被這個工程的名字給迷惑了,其實就是我們普通的微服務,比如ORDER 、PRODUCT服務要接入配置中,就需要這么搞)
Step1 搞依賴包
<!--加入nocas-client--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-discovery</artifactId></dependency><!-- 配置中心nacos-config --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-nacos-config</artifactId></dependency>Step2 搞配置文件
編寫配置文件,需要寫一個bootstrap.yml配置文件
spring:cloud:nacos:config: # 這里是 config , 服務注冊的這個地方是 discoveryserver-addr: 1.117.97.88:8848file-extension: ymlapplication: # 表示當前微服務需要向配置中心索要artisan-config-center的配置name: artisan-config-centerprofiles: # 表示我需要向配置中心索要artisan-config-center的開發環境的配置active: dev- server-addr: 1.117.97.88:8848 表示我微服務怎么去找我的配置中心
- spring.application.name=artisan-config-center 表示當前微服務需要向配置中心索要artisan-config-center的配置
- spring.profiles.active=dev表示我需要向配置中心索要artisan-config-center的dev環境的配置
索要文件的格式為
${application.name}- ${spring.profiles.active}.${file-extension}同樣的,我們這個服務也要注冊到Nacos
Step3 Nacos Config 增加配置
新建配置
Step4 驗證
啟動服務,觀察日志
2022-02-04 12:37:50.945 INFO 14772 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:port: 5678 2022-02-04 12:37:50.948 INFO 14772 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='artisan-config-center-dev.yml'}, NacosPropertySource {name='artisan-config-center.yml'}, NacosPropertySource {name='artisan-config-center'}]}Another 栗子 (不停機生效新值)
業務場景
我們有個新業務上線, 業務需要,保留原來老邏輯的代碼,所有我們打算搞個一個開關變isNewPath 來控制,為了以防萬一,如果新功能上了生產后,發現有bug,怎么做到修改isNewBusi的值不需要重啟 ?
Step1 Nacos Config 新增配置項
在上個工程的基礎上,我們來增加這個功能
Step2 @Value 解析對應的值
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RefreshScope @Slf4j public class OrderInfoController {@Value("${isNewPath}")private Boolean isNewPath;@RequestMapping("/selectOrderInfoById/{orderNo}")public Object selectOrderInfoById(@PathVariable("orderNo") String orderNo) {log.info("是否業務走新邏輯:{}", isNewPath);if (isNewPath) {return "查詢訂單執行新邏輯->execute new logic : " + orderNo;}return "查詢訂單執行老邏輯->execute old logic : " + orderNo;}}Step3 Controller上添加@RefreshScope進行動態刷新
Step4 驗證
啟動服務,觀察拉取的配置中心的配置項
2022-02-04 13:30:27.453 INFO 21040 --- [ main] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:port: 5678 # 是否走新業務邏輯的開關 isNewPath: true我們看到是true , 訪問下試試呢
Nacos Config上修改值為false ,觀察日志,重新測試
看下應用的日志
2022-02-04 13:32:29.234 INFO 21040 --- [.117.97.88_8848] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname 2022-02-04 13:32:29.273 INFO 21040 --- [.117.97.88_8848] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration' of type [org.springframework.cloud.autoconfigure.ConfigurationPropertiesRebinderAutoConfiguration$$EnhancerBySpringCGLIB$$de53a9bf] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) 2022-02-04 13:32:30.791 INFO 21040 --- [.117.97.88_8848] o.s.cloud.commons.util.InetUtils : Cannot determine local hostname 2022-02-04 13:32:30.884 WARN 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[artisan-config-center] & group[DEFAULT_GROUP] 2022-02-04 13:32:30.952 WARN 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder : Ignore the empty nacos configuration and get it based on dataId[artisan-config-center.yml] & group[DEFAULT_GROUP] 2022-02-04 13:32:31.012 INFO 21040 --- [.117.97.88_8848] c.a.c.n.c.NacosPropertySourceBuilder : Loading nacos data, dataId: 'artisan-config-center-dev.yml', group: 'DEFAULT_GROUP', data: server:port: 5678 # 是否走新業務邏輯的開關 isNewPath: false 2022-02-04 13:32:31.013 INFO 21040 --- [.117.97.88_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='NACOS', propertySources=[NacosPropertySource {name='artisan-config-center-dev.yml'}, NacosPropertySource {name='artisan-config-center.yml'}, NacosPropertySource {name='artisan-config-center'}]} 2022-02-04 13:32:31.014 INFO 21040 --- [.117.97.88_8848] o.s.boot.SpringApplication : The following profiles are active: dev 2022-02-04 13:32:31.023 INFO 21040 --- [.117.97.88_8848] o.s.boot.SpringApplication : Started application in 3.29 seconds (JVM running for 128.768) 2022-02-04 13:32:31.040 INFO 21040 --- [.117.97.88_8848] o.s.c.e.event.RefreshEventListener : Refresh keys changed: [isNewPath]已經獲取到了最新值 , isNewPath: false ,并且 Refresh keys changed: [isNewPath]
我們不重啟應用,直接訪問
咦,不停機走了老邏輯
源碼
https://github.com/yangshangwei/SpringCloudAlibabMaster
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Spring Cloud Alibaba - 17 Nacos Config 配置中心 应用篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Cloud Alibaba
- 下一篇: Spring Cloud Alibaba