之前项目中用的apollo,需要换成nacos做配置和注册中心.[先将erueka的jar包依赖从pom文件移除,否则会有冲突报错]
nacos文档地址:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
下载解压后可以直接启动,nacos默认支持mysql数据库,其它数据库可以使用插件.另外可以使用自带的detby数据库.登录账号nacos/nacos.新建命名空间/group和yaml格式配置文件,以后在springcloud项目中使用.
springcloud项目pom文件引入两个jar包,一个配置中心的,一个注册中心的
<!--nacos 配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- 将 Nacos 作为注册中心,并实现对其的自动配置 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类上
之前版本@EnableDiscoveryClient注解,开启Spring Cloud的注册发现功能,现在已经不需要添加 @EnableDiscoveryClient 注解,只需要引入 Spring Cloud 注册发现组件,就会自动开启注册发现的功能。这里已经引入了 spring-cloud-starter-alibaba-nacos-discovery 依赖,也不用再添加 @EnableDiscoveryClient 注解了。
新建配置bootstrap.yml文件 ,里面引入nacos中的配置文件属性
#bootstrap.yml优先级比application.yml优先级 高
spring:
#prefix−{spring.profile.active}.${file-extension}
#nacos会根据当前环境去拼接配置名称查找相应配置文件,
#示例:{spring.application.name}-{spring.profiles.active}-{spring.cloud.nacos.config.file-extension}
#获取到值:nacos-autoconfig-service-dev.yml
profiles:
#开发环境dev,测试环境test,生产环境prod
active: devapplication:
#配置应用的名称,用于获取配置
name: nacos-autoconfig-service
cloud:
nacos:
config:
#nacos配置中心地址
server-addr: localhost:8848#配置中心的命名空间id
namespace: dev#配置分组,默认没有也可以
group: DEFAULT_GROUP#配置文件后缀,用于拼接配置配置文件名称,目前只支持yml和properties
file-extension: yml#配置自动刷新
refresh-enabled: true#配置文件的前缀,默认是application.name的值,如果配了prefix,就取prefix的值
#prefix: nacos-autoconfig-service-${spring.profile.active}# 配置编码
encode: UTF-8discovery: #属性和上面一样
serer-addr:
namespace: dev
配置自动刷新
在配置的类增加@RefreshScope就可以实现自动刷新配置,当nacos中的配置修改后,项目无需重启就可以自动生效,这个在实际生产环境中是很有用的,有时候你需要修改线上的配置,如果没有配置中心,你需要重启服务
读取配置内容
1第一种
直接在属性上使用@Value(${})获取文件属性,不支持动态获取,key必须是静态的
如: @Value("${datasource.url}")//这个是在nacos中的yaml中配置的
private String dataUrl;//这边随便写
2第二种 使用nacos的api进行读取,这种方式读取到的是整个nacos的yaml格式文件内容
public String getNacosPer() { Properties properties = new Properties(); // nacos服务器地址 properties.put(PropertyKeyConst.SERVER_ADDR, "10.51.111.193"); // 配置中心的命名空间id properties.put(PropertyKeyConst.NAMESPACE, "888888"); ConfigService configService = NacosFactory.createConfigService(properties); // 根据dataId、group定位到具体配置文件,获取其内容. 方法中的三个参数分别是: dataId[不加后缀,即没有.yaml或.properties], group, 超时时间 String content = configService.getConfig("application-dev", "oneDay", 3000L); // 因为我的配置内容是JSON数组字符串,这里将字符串转为JSON数组 //return JSONUtil.parseArray(content); return content ; }3 第三种方式 可以动态读,即key可以是前端出入的内容
@Autowired
private
ConfigurableApplicationContext applicationContext;
//或者
//private Environment environment;
@GetMapping("
getNacosPer")
public
String
getNacosPer(){
//environment.getProperty("key");
applicationContext.getEnvironment().getProperty("key","string"
);//当没有获取的key的value时,可返回指定string内容
return
applicationContext.getEnvironment().getProperty(
"key"
);
}
共享配置(shared-configs)和扩展配(extension-config): 一个项目可以读取多个配置文件
参数解析:
- data-id : Data Id
- group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
- refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
注意:这里的Data ID
后面是加.yml
后缀的[写yaml取到的值为null,不写后缀项目启动报错],且不需要指定file-extension
。
spring:
application:
name: nacosDemo
cloud:
nacos:
username: ${nacos.username}
password: ${nacos.password}
config:
server-addr: ${nacos.server-addr}# server-addr:***.mse.aliyuncs.com:8848,6443,9848 可以多个端口?
namespace: ${nacos.namespace}
# 用于共享的配置文件
shared-configs:
- data-id: asdfsdf.yml
group: cdcadraf- data-id: vvdreteww.yml
group: rtewewrg- data-id: jyjteew.yml
group: cvcss# 常规配置文件
# 优先级大于 shared-configs,在 shared-configs 之后加载
extension-configs:
- data-id: sadfdsafzxc.yml
group: regewgww
refresh: true- data-id: svvvrwere.yml
group: ngnefeww
refresh: true
discovery: #属性和上面一样
serer-addr:
namespace: dev
优先级,这个未验证....
1/ 不同种类配置之间,优先级按顺序如下:主配置 > 扩展配置(extension-configs) > 共享配置(shared-configs)
2/ 同为扩展配置,存在如下优先级关系:
extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0
。3/ 同为共享配置,存在如下优先级关系:
shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]
。