目录
nacos实现配置管理
nacos实现配置
获取nacos中的配置步骤
1.引入nacos的配置管理客户端依赖
2.在服务中resource目录添加一个bootstrap.yml文件
热更新和拉取nacos配置中的值
使用@Value注解拉取值,在对应类上添加@RefreshScope实现热更新
使用@ConfigurationProperties注解自定义对象数据拉取值
多环境配置共享
1.创建多环境配置文件
多种配置的优先级
线上配置高于本地配置,当前环境配置高于共享环境配置
当我们需要一些服务实现统一的管理时,并切实现服务的热更新
比如:有十几个服务需要修改同一配置时,我们不需要修改十个服务的配置,而是在同一个地方改即可。
当微服务启动时就会去读取nacos中的配置,在和本地的配置结合进行使用
在nacos中添加配置
在读取nacos文件时,我们得知道nacos地址,但由于需要提前知道nacos配置,所以使用bootstrap来配置nacos地址。
原因:bootstrap.yml文件是引导文件比application.yml优先级高很多
所以大致步骤如下:服务启动之后从bootstrap中获取nacos配置文件的地址,然后拉取nacos中的配置文件在结合本地文件,再进行后面的操作。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
在配置文件里面配置nacos地址,服务名称,环境,后缀(就相当于刚才nacos中的创建的配置文件的id)
spring:
application:
name: userservice #服务名称
profiles:
active: dev #环境:运行环境
cloud:
nacos:
server-addr: localhost:8848 #nacos地址
config:
file-extension: yaml #文件后缀名
Nacos中的配置文件变更后,微服务无需重启就可以感知。不过需要通过下面两种配置实现
@Slf4j
@RestController
@RequestMapping("/user")
@RefreshScope//开启配置热更新
public class UserController {
@Value("${pattern.dateformat}")//nacos配置文件中属性
private String dateformat;
@GetMapping("/test")
public String test() {
return dateformat;
}
}
效果:
@Data
@Component
@ConfigurationProperties(prefix = "pattern")//nacos配置文件中属性
public class PatternProperties {
public String dateformat;
}
注入PatternProperties对象
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/test")
public String test() {
return patternProperties.getDateformat();
}
}
这种方式无需在类上添加@RefreshScope注解来实现热更新
使用场景:当有一个配置属性在开发,生产,测试环境中的值相同,那么我们就没必要在每个配置文件中都写一份,如果到时候有改动那么我们还得把每个都去改一遍
在上述情况中我们就可以使用多环境配置共享,来统一多个环境中相同的配置
微服务启动时会从nacos读取多个配置文件:
[spring.application.name]-[spring.profiles.active].yaml,例如: userservice-dev.yaml
[spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
拉取nacos中配置属性值
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
public String dateformat;//开发环境中的属性
public String envSharedValue;//多环境中共享的属性
}
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private PatternProperties patternProperties;
@GetMapping("/test")
public String test() {
return patternProperties.getDateformat()
+"
"+patternProperties.getEnvSharedValue();
}
}
开发环境中得到的结果:
测试环境中得到的结果: