Nacos 配置文件总结
文章目录
- Nacos 配置文件总结
- 1 、在 Nacos 服务端添加配置文件
- 1. 启动`Nacos Server`。
- 2. 新建配置文件。
- 3. 发布配置集后,我们便可以在配置列表中查看相应的配置文件。
- 4. 配置nacos数据库
- 5. 运行 Nacos 容器
- 6. 验证安装结果
- 7. 配置验证
- 2 、在 Nacos 客户端配置服务端配置文件
- 1. 文件介绍、`bootstrap.yaml`和`application.yaml`
- a、加载顺序区别:
- b、优先级区别:
- c、应用场景区别:
- 2. 方式一:在application.yaml(或properties )文件中配置【不推荐】
- (1)添加依赖
- (2)配置
- 3. 方式二:在bootstrap.yaml(或properties )文件中配置【推荐】
- (1)添加依赖
- (2)配置
- a、在`application.yaml`配置文件中配置普通配置。
- 加载默认的配置文件顺序
- b、在`bootstrap.yaml`配置文件中配置`Nacos Config `相关的。
- (3)加载任意的配置文件
- a、创建自定义配置文件
- 3 、在 Nacos 客户端使用配置文件
- 1. 方式一:通过`ConfigurableApplicationContext`类获取配置信息
- 2. 方式二:通过@Value注解获取配置信息
- 3. 方式三:通过@ConfigurationProperties注解配置类获取配置信息
- (1)引入`Lombok`相关的依赖。
- (2)新建一个配置类。
- (3)使用配置信息。
- (4)测试
- 4、nacos配置公共与专属配置
- 1. 配置优先级(重要区别)
- 2. 设计用途对比:
- 3. 实际应用场景示例:
- 4. 配置覆盖规则:
- 5. 最佳实践建议:
1 、在 Nacos 服务端添加配置文件
1. 启动Nacos Server
。
2. 新建配置文件。
-
登录
Nacos
后台后,在配置列表中新增一个配置文件。 -
在配置页面填写配置信息。
redis.yaml
文件:
user:name: jsboss #与系统变量名称冲突userName: atangbijiage: 5sex: 男
注:当在bootstrap.yaml
(或properties
)文件中进行配置时,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
的拼接格式变成${prefix}.${file-extension}
。file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
(默认)和yaml
类型。
3. 发布配置集后,我们便可以在配置列表中查看相应的配置文件。
新建完配置文件(配置集)后,我们就可以在微服务中使用该配置文件了。
注:新建的配置文件信息被保存在Nacos
数据库的config_info
表中。
4. 配置nacos数据库
create database nacos_dev;use nacos_dev;
CREATE TABLE `config_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) DEFAULT NULL COMMENT 'group_id',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`c_desc` varchar(256) DEFAULT NULL COMMENT 'configuration description',`c_use` varchar(64) DEFAULT NULL COMMENT 'configuration usage',`effect` varchar(64) DEFAULT NULL COMMENT '配置⽣效的描述',`type` varchar(64) DEFAULT NULL COMMENT '配置的类型',`c_schema` text COMMENT '配置的模式',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';CREATE TABLE `config_info_aggr` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`datum_id` varchar(255) NOT NULL COMMENT 'datum_id',`content` longtext NOT NULL COMMENT '内容',`gmt_modified` datetime NOT NULL COMMENT '修改时间',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfoaggr_datagrouptenantdatum`
(`data_id`,`group_id`,`tenant_id`,`datum_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='增加租⼾字段';CREATE TABLE `config_info_beta` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`beta_ips` varchar(1024) DEFAULT NULL COMMENT 'betaIps',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfobeta_datagrouptenant`
(`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_info_beta';CREATE TABLE `config_info_tag` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`tag_id` varchar(128) NOT NULL COMMENT 'tag_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',PRIMARY KEY (`id`),UNIQUE KEY `uk_configinfotag_datagrouptenanttag`
(`data_id`,`group_id`,`tenant_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_info_tag';CREATE TABLE `config_tags_relation` (`id` bigint(20) NOT NULL COMMENT 'id',`tag_name` varchar(128) NOT NULL COMMENT 'tag_name',`tag_type` varchar(64) DEFAULT NULL COMMENT 'tag_type',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`tenant_id` varchar(128) DEFAULT '' COMMENT 'tenant_id',`nid` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'nid, ⾃增⻓标识',PRIMARY KEY (`nid`),UNIQUE KEY `uk_configtagrelation_configidtag` (`id`,`tag_name`,`tag_type`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
COMMENT='config_tag_relation';CREATE TABLE `group_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`group_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Group ID,空字符表⽰整个集
群',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表⽰使⽤默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使⽤量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置⼤⼩上限,单位
为字节,0表⽰使⽤默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合⼦配置最⼤
个数,,0表⽰使⽤默认值',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的⼦
配置⼤⼩上限,单位为字节,0表⽰使⽤默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最⼤变更历史
数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_group_id` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='集群、各Group容量
信息表';CREATE TABLE `his_config_info` (`id` bigint(20) unsigned NOT NULL COMMENT 'id',`nid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'nid, ⾃增标识',`data_id` varchar(255) NOT NULL COMMENT 'data_id',`group_id` varchar(128) NOT NULL COMMENT 'group_id',`app_name` varchar(128) DEFAULT NULL COMMENT 'app_name',`content` longtext NOT NULL COMMENT 'content',`md5` varchar(32) DEFAULT NULL COMMENT 'md5',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',`src_user` text COMMENT 'source user',`src_ip` varchar(50) DEFAULT NULL COMMENT 'source ip',
`op_type` char(10) DEFAULT NULL COMMENT 'operation type',`tenant_id` varchar(128) DEFAULT '' COMMENT '租⼾字段',`encrypted_data_key` text NOT NULL COMMENT '密钥',PRIMARY KEY (`nid`),KEY `idx_gmt_create` (`gmt_create`),KEY `idx_gmt_modified` (`gmt_modified`),KEY `idx_did` (`data_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='多租⼾改造';CREATE TABLE `tenant_capacity` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',`tenant_id` varchar(128) NOT NULL DEFAULT '' COMMENT 'Tenant ID',`quota` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '配额,0表⽰使⽤默认值',`usage` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '使⽤量',`max_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个配置⼤⼩上限,单位
为字节,0表⽰使⽤默认值',`max_aggr_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '聚合⼦配置最⼤
个数',`max_aggr_size` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '单个聚合数据的⼦
配置⼤⼩上限,单位为字节,0表⽰使⽤默认值',`max_history_count` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '最⼤变更历史
数量',`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='租⼾容量信息表';CREATE TABLE `tenant_info` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`kp` varchar(128) NOT NULL COMMENT 'kp',`tenant_id` varchar(128) default '' COMMENT 'tenant_id',`tenant_name` varchar(128) default '' COMMENT 'tenant_name',`tenant_desc` varchar(256) DEFAULT NULL COMMENT 'tenant_desc',`create_source` varchar(32) DEFAULT NULL COMMENT 'create_source',`gmt_create` bigint(20) NOT NULL COMMENT '创建时间',`gmt_modified` bigint(20) NOT NULL COMMENT '修改时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_tenant_info_kptenantid` (`kp`,`tenant_id`),KEY `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='tenant_info';CREATE TABLE `users` (`username` varchar(50) NOT NULL PRIMARY KEY COMMENT 'username',`password` varchar(500) NOT NULL COMMENT 'password',`enabled` boolean NOT NULL COMMENT 'enabled'
);
CREATE TABLE `roles` (`username` varchar(50) NOT NULL COMMENT 'username',`role` varchar(50) NOT NULL COMMENT 'role',UNIQUE INDEX `idx_user_role` (`username` ASC, `role` ASC) USING BTREE
);
CREATE TABLE `permissions` (`role` varchar(50) NOT NULL COMMENT 'role',`resource` varchar(128) NOT NULL COMMENT 'resource',`action` varchar(8) NOT NULL COMMENT 'action',UNIQUE INDEX `uk_role_permission` (`role`,`resource`,`action`) USING BTREE
);
INSERT INTO users (username, password, enabled) VALUES ('nacos',
'$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
配置并启动nacos
创建 Nacos 配置文件
创建一个application.properties
文件,用于配置 Nacos 连接 MySQL 数据库:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
5. 运行 Nacos 容器
使用刚才创建的配置文件来启动 Nacos 容器:
docker run -d \--name nacos \-p 8848:8848 \-p 9848:9848 \-p 9849:9849 \-v /path/on/host/nacos/conf/application.properties:/home/nacos/conf/application.properties \-v /path/on/host/nacos/logs:/home/nacos/logs \nacos/nacos-server:2.2.3 \-m standalone
同样,请将/path/on/host/nacos
替换为你主机上的实际路径。
6. 验证安装结果
Nacos 启动后,你可以通过浏览器访问其管理界面:
http://localhost:8848/nacos
使用默认的用户名和密码nacos/nacos
登录。
7. 配置验证
登录 Nacos 管理界面后,你可以在左侧菜单中选择 “配置管理"→"配置列表”,若能正常显示页面,就表明数据库配置成功。
2 、在 Nacos 客户端配置服务端配置文件
我们可以通过bootstrap.yaml
和application.yaml
文件在Nacos
客户端配置服务端的配置文件。
1. 文件介绍、bootstrap.yaml
和application.yaml
bootstrap
和application
都是springboot
项目中的配置文件,他们的主要区别如下:
a、加载顺序区别:
SpringBoot
支持同时使用,其加载的顺序为:
bootstrap.properties` > `bootstrap.yaml` >` application.properties`> `application.yaml
b、优先级区别:
bootstrap
加载的配置信息是不能被application
的相同配置覆盖的,如果两个配置文件同时存在,以bootstrap
为主。
c、应用场景区别:
bootstrap
常见应用场景:
- 配置一些固定的,不能被覆盖的属性,用于一些系统级别的参数配置。本地的配置文件是默认不能覆盖远程的配置的。
- 一些需要加密/解密的场景。
- 当你使用了
Nacos
或Spring Cloud Config
配置中心时,需要在boostrap
配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息。
application
常见应用场景:
- 常用于
SpringBoot
项目的自动化配置。 - 用于一些应用级别的参数配置。
2. 方式一:在application.yaml(或properties )文件中配置【不推荐】
(1)添加依赖
新建一个名称为ConfigApplication
的SpringBoot
项目,并在其中添加nacos-config
相关的依赖。
pom.xml
文件:
<!-- nacos-config依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
(2)配置
在application.yaml
配置文件中配置Nacos Server
地址并引入服务配置。
application.yaml
文件:
server:port: 8001spring:application:name: nocosConfigService #服务名cloud:nacos:server-addr: 127.0.0.1:8848username: nacos #nacos用户名password: nacos #nacos密码config:import:- nacos:redis.yaml?refresh=true #通过spring.config导入nacos中自定义的配置文件
注:当配置了权限管理时,必须指定nacos
服务器登录的用户名、密码。
3. 方式二:在bootstrap.yaml(或properties )文件中配置【推荐】
(1)添加依赖
新建一个名称为ConfigApplication
的SpringBoot
项目,并在其中添加nacos-config
和bootstrap
相关的依赖。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/></parent><groupId>com.example</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- nacos-config依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2021.1</version></dependency><!-- bootstrap依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>4.0.3</version></dependency><!-- refresh scope依赖 :动态配置刷新:--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId><version>4.0.3</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
(2)配置
a、在application.yaml
配置文件中配置普通配置。
application.yaml
文件:
server:port: 8001
加载默认的配置文件顺序
当在bootstrap.yaml
(或properties
)文件中进行配置时,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
的拼接格式变成${prefix}.${file-extension}
。file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
(默认)和yaml
类型。
注:
- 只有当在
bootstrap.yaml
(或properties
)文件中进行配置时,Nacos
才会加载默认的配置文件;当使用application.yaml
(或properties
)文件,Nacos
将无法加载默认的配置文件。 - 若要使用
Nacos
服务端中某一个配置文件作为默认加载的配置文件,则必须在bootstrap.yaml
文件中配置与之相对应的spring.application.name
、spring.cloud.nacos.config.file-extension
、spring.cloud.nacos.config.group
,spring.cloud.nacos.config.namespace
。 - 若要使用
Nacos
服务端中其他自定义的配置文件,只需在bootstrap.yaml
文件中导入该配置文件,不需要在bootstrap.yaml
文件中配置与之相对应的spring.cloud.nacos.config.file-extension
、spring.cloud.nacos.config.group
,spring.cloud.nacos.config.namespace
。
b、在bootstrap.yaml
配置文件中配置Nacos Config
相关的。
bootstrap.yaml
文件:
spring:application:name: redis #服务名cloud:nacos:config:server-addr: 127.0.0.1:8848 #Nacos配置中心服务器地址username: nacos #Nacos配置中心用户名password: nacos #Nacos配置中心密码#Nacos默认配置文件设置file-extension: yaml #Nacos默认配置文件的类型(默认值:properties)group: DEFAULT_GROUP #Nacos默认配置文件的配置分组namespace: public #Nacos默认配置文件的命名空间
注:
bootstrap.yaml
文件中配置的spring.application.name
、spring.cloud.nacos.config.file-extension
、spring.cloud.nacos.config.group
,spring.cloud.nacos.config.namespace
,只能用来配置与Nacos
默认加载的配置文件。- 当配置了权限管理时,必须指定
nacos
服务器登录的用户名、密码。
(3)加载任意的配置文件
在Nacos
中,我们可以使用shared-configs
(共享配置)和extension-configs
(拓展配置)两种方式为同一个项目同时加载多个自定义的配置文件,且每种配置方式都有两种写法。
具体使用步骤如下:
a、创建自定义配置文件
在Nacos
服务端新建一个名称为shared.yaml
共享配置文件和extension.yaml
的拓展配置文件。
shared.yaml
:
file:name: 共享配置文件commInfo: 共享信息
extension.yaml
:
file:name: 拓展配置文件extensionInfo: 拓展信息
(2)加载自定义配置文件
在bootstrap.yaml
文件中,加载自定义的配置文件。
bootstrap.yaml
文件:
spring:application:name: redis #服务名cloud:nacos:config:server-addr: 127.0.0.1:8848 #Nacos配置中心服务器地址username: nacos #Nacos配置中心用户名password: nacos #Nacos配置中心密码#Nacos自定义配置文件设置shared-configs: #通过第一种方式导入共享配置文件- data-id: shared.yamlgroup: DEFAULT_GROUP #默认值:DEFAULT_GROUPrefresh: true #默认值:falseextension-configs[0]: #通过第二种方式导入拓展配置文件data-id: extension.yamlgroup: DEFAULT_GROUP #默认值:DEFAULT_GROUPrefresh: true #默认值:false
(3)测试
在TestController
中使用自定义配置文件中的配置信息。
TestController.java
文件:
package com.js.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope //自动更新配置信息
public class TestController {@Value(value = "${file.name}")private String fileName;@Value(value = "${file.commInfo}")private String commInfo;@Value(value = "${file.extensionInfo}")private String extensionInfo;@GetMapping(path = "/test")public String test(){return "当前读取的是:【" + fileName + "】中的配置信息;" + " 当前读取的是:【" + commInfo + "】;" + " 当前读取的是:【" + extensionInfo + "】!";}
}
启动服务注册中心,启动config-nacos
服务,在浏览器中输入http://localhost:8081/test
。测试结果如下图所示:
可以发现这两个配置文件,类似合在一起变成一个配置文件,给加载出来了
3 、在 Nacos 客户端使用配置文件
完成上述步骤后,应用会从Nacos Server
中获取相应的配置,并添加在Spring Environment
的 PropertySources
中。
此时,我们便可以获取并使用Nacos
服务端添加的配置信息了。
注:接下来的测试结果都是基于在bootstrap.yaml
(或properties
)文件中配置进行的。
1. 方式一:通过ConfigurableApplicationContext
类获取配置信息
配置文件
server:port: 8081
spring:application:name: redis #服务名cloud:nacos:config:server-addr: 123.60.186.19:8848 #Nacos配置中心服务器地址username: nacos #Nacos配置中心用户名password: nacos #Nacos配置中心密码extension-configs: # 扩展配置(优先级高)- data-id: redis.yamlgroup: DEFAULT_GROUPrefresh: true
(1)新建一个名称为TestController
的控制器,并在其中通过ConfigurableApplicationContext
获取配置信息。
TestController.java
文件:
package com.js.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope //自动更新配置信息
public class TestController {@Autowiredprivate ConfigurableApplicationContext applicationContext;@GetMapping(path = "/test1")public String test1(){//获取Nacos服务端添加的配置信息String userName1 = applicationContext.getEnvironment().getProperty("user.name");String userName2 = applicationContext.getEnvironment().getProperty("user.userName");String userAge = applicationContext.getEnvironment().getProperty("user.age");String userSex = applicationContext.getEnvironment().getProperty("user.sex");return "Nacos配置变量:user.name: "+userName1+ "; user.userName: "+userName2+", user.age: "+userAge+", user.sex: "+userSex;}
}
(2)启动服务注册中心,启动config-nacos
服务,在浏览器中输入http://localhost:8001/test1
。测试结果如下图所示:
2. 方式二:通过@Value注解获取配置信息
配置文件
server:port: 8081
spring:application:name: redis #服务名cloud:nacos:config:server-addr: 123.60.186.19:8848 #Nacos配置中心服务器地址username: nacos #Nacos配置中心用户名password: nacos #Nacos配置中心密码extension-configs: # 扩展配置(优先级高)- data-id: redis.yamlgroup: DEFAULT_GROUPrefresh: true
(1)在TestController
中通过@Value
注解获取配置信息,并通过Spring Cloud
原生注解 @RefreshScope
实现配置自动更新。
TestController.java
文件:
package com.js.controller;import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope //自动更新配置信息
public class TestController {@Value(value = "${user.name}")private String userName1;@Value(value = "${user.userName}")private String userName2;@Value(value = "${user.age}")private int userAge;@Value(value = "${user.sex}")private String userSex;@GetMapping(path = "/test2")public String test2(){return "Nacos配置变量:user.userName: "+ userName1+ "; user.name: "+userName2+", user.age: "+userAge+", user.sex: "+userSex;}
}
(2)启动服务注册中心,启动config-nacos
服务,在浏览器中输入http://localhost:8001/test2
。测试结果如下图所示:
3. 方式三:通过@ConfigurationProperties注解配置类获取配置信息
(1)引入Lombok
相关的依赖。
pom.xml
文件:
<!-- lombok依赖 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
(2)新建一个配置类。
MyNacosConfigProperties.java
文件:
package com.js.properties;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;@Component
@Data
@ConfigurationProperties(prefix = "user")
public class MyNacosConfigProperties {String name;String userName;int age;String sex;
}
(3)使用配置信息。
TestController.java
文件:
package com.js.controller;import com.js.properties.MyNacosConfigProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RefreshScope //自动更新配置信息
public class Test2Controller {@Autowiredprivate MyNacosConfigProperties myNacosConfigProperties;@GetMapping(path = "/test3")public String test3(){//获取Nacos服务端添加的配置信息String userName1 = myNacosConfigProperties.getName();String userName2 = myNacosConfigProperties.getUserName();int userAge = myNacosConfigProperties.getAge();String userSex = myNacosConfigProperties.getSex();return "Nacos配置变量:user.userName: "+ userName1+ "; user.name: "+userName2+", user.age: "+userAge+", user.sex: "+userSex;}
}
(4)测试
启动服务注册中心,启动config-nacos
服务,在浏览器中输入http://localhost:8001/test3
。测试结果如下图所示:
注:若在application.yaml
(或properties
)文件中配置,则springboot
默认会优先加载系统环境变量,此时获取到的user.name
的值实际上指的是当前计算机的用户名,而不是Nacos服务端yaml
配置文件中指定的user.name
的值。因此,我们自定义变量名称时尽量不要与系统环境变量的名称一致。
4、nacos配置公共与专属配置
以下是shared-configs
和extension-configs[0]
的详细对比解析:
1. 配置优先级(重要区别)
复制加载顺序:extension-configs[0] → extension-configs[1] → shared-configs
生效顺序:后加载的配置会覆盖先加载的(即extension-configs优先级更高)
2. 设计用途对比:
yaml复制shared-configs:- 用途:存放多个应用共享的基础配置(如数据库连接、Redis配置等)- 特点:跨项目复用性强extension-configs[0]:- 用途:存放当前应用特有的扩展配置- 特点:可覆盖shared-configs的配置
3. 实际应用场景示例:
# shared-configs(共享配置)
- 数据源配置:spring.datasource.url
- 消息队列配置:spring.rabbitmq.host
- 日志级别配置:logging.level.root# extension-configs(扩展配置)
- 业务开关配置:feature.toggle.payment
- 应用专属参数:app.redis.timeout
- 环境差异配置:env.specific.param
4. 配置覆盖规则:
5. 最佳实践建议:
- 将通用配置放在
shared-configs
(如中间件连接信息) - 将应用专属配置放在
extension-configs
- 需要覆盖共享配置时使用
extension-configs
- 多环境部署时可通过
extension-configs
加载环境特有配置
spring:cloud:nacos:config:server-addr: 127.0.0.1:8848file-extension: properties# 加载公共配置shared-configs:- data-id: common-config.ymlgroup: DEFAULT_GROUPrefresh: true # 支持动态刷新# 加载专属配置(优先级高于公共配置)ext-config:- data-id: ${spring.application.name}.ymlgroup: ${spring.profiles.active}refresh: true
当前配置中两者都设置了refresh: true
,意味着这些配置变更时都会触发应用配置热更新。参考3.3.(3)