目录
1.Nacos配置中心使用
1.1快速开始
1.2历史版本
1.3创建命名空间
1.4克隆配置文件
1.5创建用户
1.6创建角色给用户绑定某个角色
1.7给角色绑定读写权限
1.8若要开启权限配置,需要在nacos中进行配置
2.Spring cloud 获取Nacos Config配置中心的配置信息
3. Nacos Config其它扩展
3.1文件扩展名
3.2动态感知配置变化
3.3可支持profile粒度的配置
3.4命名空间配置
3.5支持自定义Group配置
3.6支持自定义Data id
4.注解@RefreshScope获取最新配置值
启动Nacos后,可以通过服务管理界面配置Nacos
准备配置,nacos server中创建nacos-config.properties
Data id:Nacos某个配置集的ID,通常采用java包(com.taobao.tc.refund.log.level)的命名规则保证全局的唯一性,此命名规则非强制。
nacos数据表中可以查看到记录
编辑配置
查看历史版本
有多个工作空间的情况下,可以克隆配置文件
此时使用zhangsan这个用户登录,只能操作dev的可读权限
在dev工作空间下,新建也是会报错
在nacos的目录conf/application.properties中设置nacos.core.auth.enabled的值为true,默认是false
(1)创建新的maven项目,编写启动类
(2)pom.xml中加入需要的依赖
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
(3)在resources目录下,必须使用bootstrap.properties配置文件来配置Nacos Server 地址
#服务启动名,必须与nacos config中配置的Data id保持一致
spring.application.name=nacos-config
#nacos config 服务地址
spring.cloud.nacos.config.server-addr=127.0.0.1:8849
(4)在spring boot启动类中通过加载到spring容器中的属性文件获取值
@SpringBootApplication
public class NacosConfigApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosConfigApplication.class, args);
//从spring容器中的环境全局变量值中,根据属性获取值
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+";age:"+userAge);
}
}
(5)启动服务器,控制台报get data from Nacos error,dataId:nacos-config.properties
com.alibaba.nacos.api.exception.NacosException错误,配置中心中找不到nacos-config的配置文件。
原因是Nacos config中没有Data Id为Nacos-config的配置
(6)把bootstrap.properties中的spring.application.name设置成与Data ID对应的命名,再此启动程序,控制台还是报错,找不到配置文件。
当我们需要进行权限设置的时候,nacos.core.auth.enabled=true,此时必须要配置nacos的连接信息;nacos.core.auth.enabled=false时,可以不配置nacos的连接信息和工作空间,默认工作空间是public,默认用户名密码都是nacos。
在bootstrap.properties中配置nacos的连接信息:
***注意一定要在bootstrap.properties中配置,若是在application.properties中配置,则获取不到配置信息,获取到的用户名是电脑名称
(7)启动程序,获取到配置信息
(8)当Nacos Config变动后,会重新生成Data id 的md5值,一旦修改了配置信息,nacos客户端可以动态感知到修改。
当前MD5值:
修改后md5值:
默认使用properties的方式,此时获取配置信息不需要做任何配置
若是修改为YAML的方式
控制台获取不到配置信息
在bootstrap.properties配置文件中修改扩展名为yaml
#nacos客户端默认是properties的文件扩展名(只针对默认配置和profile配置)
spring.cloud.nacos.config.file-extension=yaml
此时控制台获取到配置信息
nacos config配置变化,客户端是可以动态感知到配置变化的;关闭动态配置变化可以在bootstrap.properties中设置:
#关闭nacos 动态刷新功能
spring.cloud.nacos.config.refresh-enabled=false
spring-cloud-starter-alibaba-nacos-config在加载配置的时候,不仅仅加载了以dataid为${spring.application.name}.${file-extension:properties}为前缀的文件,还加载了dataid为${spring.application.name}-${profile}.${file-extension:properties}的基础配置。在日常开发环境中,若是遇到多套配置的情况,可以使用spring提供的${spring.profiles.active}这个配置项配置选择哪个配置
#选择加载的文件为application-dev.properties
spring.profiles.active=dev
默认配置文件:跟服务名spring.application.name相同的DataId的配置文件,称之为默认配置文件
只有默认的配置文件才能结合profile使用;除了默认配置文件,其它配置文件都需要写上后缀。
创建一个com.qingyun.order默认配置文件的profile文件:com.qingyun.order-dev.properties
后缀必须跟配置的 boostrap.properties中配置扩展名一致:
在application.properties中配置激活的配置文件
控制台获取配置信息,此时user name 值来自com.qingyun.order-dev.properties配置中,age值来自com.qingyun.order默认配置中。
从结果可以看出配置文件的优先级:profile > 默认配置 优先级大的会覆盖优先级小的,并且会行车互补。
(1)创建命名空间
(2)配置文件中配置使用哪个命名空间
#nacos discovery工作空间
spring.cloud.nacos.config.workspace=dev
在没有明确指定${spring.cloud.nacos.config.group}配置的情况下,默认使用DEFAULT_GROUP,需要自己定义group可以在配置中添加
spring.cloud.nacos.config.group=test-group
该配置值一定要放在boostrap.properties中,所有涉及到nacos config的配置都需要放到boostrap.properties中。页面配置的Group一定要和spring.cloud.nacos.config.group种一致
相同的命名空间下,可以存在data id相同,Group不同的配置
默认读取的配置文件是与服务名相同的data id的配置;若是还有其它公共的配置需要读取进来,就涉及到多个data id的读取。
新建一个公共的配置com.qingyun.comm.properties
创建第二个公共的配置com.qingyun.comm02.properties
在配置文件中引入dataid 的方式有两种:
①使用shared-configs按数组的方式引入配置,设置data_id、group、refresh值
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[0].data-id=com.qingyun.comm.properties
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[0].group=DEFAULT_GROUP
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[0].refresh=true
# 配置支持共享的 Data Id
spring.cloud.nacos.config.shared-configs[1].data-id=com.qingyun.comm02.properties
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.shared-configs[1].group=DEFAULT_GROUP
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.shared-configs[1].refresh=true
从打印结果可以看出优先级:profile > 默认 >shared-configs引入;shared-configs数组中后面引入的会覆盖前面引入的相同项。
②使用extension-configs按数组的方式引入配置,设置data_id、group、refresh值
# 配置支持共享的 Data Id
spring.cloud.nacos.config.extension-configs[0].data-id=com.qingyun.comm03.properties
# 配置 Data Id 所在分组,缺省默认 DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
# 配置Data Id 在配置变更时,是否动态刷新,缺省默认 false
spring.cloud.nacos.config.extension-configs[0].refresh=true
新建com.qingyun.comm03.properties
此时控制台打印结果,可以看出优先级:profile > 默认 >extension-configs(数组下标越大优先级越大)>shared-configs(数组下标越大优先级越大);
项目中使用注解@Value获取配置属性值,当值变化时获取不到最新的值。
写一个Controller控制层,注入Nacos config配置的属性user.name
@RestController
@RequestMapping("/config")
public class ConfigController {
@Value("${user.name}")
String userName;
@RequestMapping("/userName")
public String userName(){
return userName;
}
}
浏览器中访问接口时,获取到的值是com.qingyun.order-dev.properties(优先级最高)定义的值。
当编辑user.name的值时,再获取数据,依然是
想要获取到最新修改的值,需要在Controller控制层添加注解@RefreshScope
此时修改user.name值时,再获取可以获取到最新的值
加入@RefreshScope之后能获取到最新数据的原理:
RefreshScope是scope的扩展,当类加了@RefreshScope后,在bean工厂加载时,会加入到refresh scope缓存的bean中,后续获取bean的时候优先从这个缓存bean中获取;当配置中心发生变更,会把变更的配置更新到spring容器的Environment中,并把refresh scope的缓存bean清空,当下载再访问此bean时,会再次走bean的生命周期,从Environment中获取到最新的值。