手把手教你使用Nacos配置中心
Nacos整合了注冊中心和配置中心,使用起來非常方便,這篇文章主要介紹Nacos配置中心的使用。
新建配置
啟動Nacos服務后,進入注冊中心配置頁面,如下圖:

點擊上圖中紅框里面的加號,進入新建配置頁面,如下圖:

上圖Data ID的完整格式如下:
- ${prefix}-${spring.profiles.active}.${file-extension}
說明如下:
- prefix:默認是spring.application.name的值,可以通過配置項 spring.cloud.nacos.config.prefix在配置文件中配置。
- spring.profiles.active即為當前環境對應的profile。
當 spring.profiles.active 為空時,對應的連接符-也將不存在,dataId的拼接格式變成 {file-extension}
file-exetension 為配置內容的文件格式,目前只支持properties和yaml類型,可以通過配置項 spring.cloud.nacos.config.file-extension在配置文件中配置。
這里我創建一個Data ID,內容如下圖:

這里使用的spring.profiles.active是dev,bootstrap.properties的配置如下:
- spring.application.name=nacos-producer
- spring.cloud.nacos.config.file-extension=properties
增加下面這個Controller類進行測試:
- @Controller
- @RequestMapping("config")
- @RefreshScope
- public class ConfigController {
- @Value("${useLocalCache}")
- private boolean useLocalCache;
- @RequestMapping(value = "/get", method = GET)
- @ResponseBody
- public boolean get() {
- return useLocalCache;
- }
- }
在瀏覽器輸入下面的URL后輸出 true,更改之后輸出也會跟著變化:
- http://localhost:8083/config/get
@RefreshScope這個注解可以讓應用動態刷新配置
多環境
實際開發中,我們會有多套環境,比如在我本地有dev、test、prod三套環境,Nacos使用namespace來進行多環境和多租戶的隔離。Nacos默認的namespace是public。
下面是官方對namespace的描述:
用于進行租戶粒度的配置隔離。不同的命名空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
可以通過下圖進入命名空間頁面:

添加一個命名空間,如下圖,命名空間ID可以不填,系統會自動生成:

按照上圖我創建了三個namespace。這樣在【配置管理】-【配置列表】中添加配置時,就會出現剛剛配置的namespace,如下圖:

這里我選擇 dev 進行添加配置。如下圖,配置一個testnamespace=dev 的配置:

因為使用了namespace,就必須在配置文件bootstrap.properties中指定我們使用了哪個namespace,比如在dev環境的bootstrap.properties文件中增加如下配置:
- spring.cloud.nacos.config.namespace=ad0738cd-b595-4885-a4e5-03f547d11fa0
這時改一下測試Controller增加下面配置:
- @Controller
- @RequestMapping("config")
- @RefreshScope
- public class ConfigController {
- @Value("${testnamespace}")
- private String testnamespace;
- @RequestMapping(value = "/getEnv", method = GET)
- @ResponseBody
- public String getEnv() {
- return testnamespace;
- }
- }
瀏覽器輸入下面配置,輸出 dev,可見 namespace 配置生效了。
- http://localhost:8083/config/getEnv
業務隔離
如果不同的業務系統需要進行配置隔離,比如服務A、服務B都有數據庫、redis、mq等相關配置,配置名稱是一樣的,怎么進行隔離呢?
Nacos提供了group進行隔離,我們看一下官方描述:
Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字符串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。當您在 Nacos 上創建一個配置時,如果未填寫配置分組的名稱,則配置分組的名稱默認采用 DEFAULT_GROUP 。配置分組的常見場景:不同的應用或組件使用了相同的配置類型,如 database_url 配置和 MQ_topic 配置。
這里,我對serviceA和serviceB做了數據庫配置,如下圖是serviceB的配置:

配置之后serviceA和serviceB配置列表如下圖:

這時serviceA和serviceB需要在bootstrap.properties中指定group,如下是serviceA的配置:
- spring.cloud.nacos.config.group=serviceA
這時在測試Controller中增加下面代碼:
- @Controller
- @RequestMapping("config")
- @RefreshScope
- public class ConfigController {
- @Value("${spring.datasource.max-idle}")
- private String maxIdle;
- @RequestMapping(value = "/getMaxIdle", method = GET)
- @ResponseBody
- public String getMaxIdle() {
- return maxIdle;
- }
- }
使用下面url測試后輸入 10:
- http://localhost:8083/config/getMaxIdle
共享配置如果一個新的應用,想要共享其他應用的配置,比如上面serviceA可以共享serviceB的配置,是否可以呢?Nacos是支持配置共享的。
我們創建兩個共享配置 serviceA.properties 和 serviceB.properties,如下圖:

其中,serviceA.properties的配置內容如下:
- spring.datasource.max-idle=10
serviceB.properties的配置內容如下:
- spring.datasource.min-idle=5
我在當前的應用中共享這兩個配置,就需要在bootstrap.properties中增加下面的配置:
- spring.cloud.nacos.config.shared-configs[0].dataId=serviceA.properties
- spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
- spring.cloud.nacos.config.shared-configs[0].refresh=true
- spring.cloud.nacos.config.shared-configs[1].dataId=serviceB.properties
- spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
- spring.cloud.nacos.config.shared-configs[1].refresh=true
啟動應用后,在瀏覽器輸入下面url,頁面響應 10:
- http://localhost:8083/config/getMaxIdle
在瀏覽器輸入下面url,頁面響應 5:
- http://localhost:8083/config/getMinIdle
注意:共享配置要加.properties或者.yaml的后綴,否則訪問不到。
總結
今天主要介紹了Nacos中配置中心的使用,包括基于namespace實現的多環境和多租戶的配置,基于group實現的業務隔離,以及共享配置。可以看到Nacos的配置中心功能還是比較完備的,可以很好地滿足業務系統使用。