Nacos注册中心提供服务注册发现,在真实开发中一个项目会有很多微服务实例,每个微服务实例中都有自己独立的配置,如果有一个配置是多个微服务中都需要使用的话,就需要配置每一个微服务实例,并且还要重启这些微服务实例。
Nacos不仅有注册中心还有配置管理,Nacos配置管理可以完成统一配置、配置热更新
Nacos配置管理
添加Nacos配置管理依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
统一配置管理
统一配置是指配置信息可以被多个微服务实例使用
新建统一配置
读取统一配置
springboot项目启动时读取本地application.yaml文件,然后实现自动装配
现在需要把Nacos配置信息读取并读取,读取Nacos配置信息步骤:
- 读取Nacos配置信息必须在读取application.yaml配置文件之前完成(bootstrap.yml这个文件是引导文件,优先级高于application.yml)
- 读取Nacos配置信息之前知道Nacos地址和配置信息Id
通过bootstrap.yml配置nacos地址、当前环境、服务名称、文件后缀名。这些决定了程序启动时去nacos读取哪个配置信息
spring: application: name: userservice profiles: active: dev cloud: nacos: discovery: server-addr: localhost:8848 config: file-extension: yaml
通过Value注解将pattern.dateformat配置注入到Controller中做测试
@Slf4j @RestController @RequestMapping("/user") public class UserController { @Value("${pattern.dateformat}") private String dateFormat; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormat, Locale.CHINA)); } }
配置热更新
Nacos中的配置信息变更后,微服务实例无需重启就可以的获取变更后的配置
方式一:通过@Value注解注入,结合@RefreshScope来刷新(在@Value注入的变量所在类上添加注解@RefreshScope)
@RefreshScope public class UserController { @Value("${pattern.dateformat}") private String dateFormat; .... .... }
修改Nacos配置
没有重启微服务实例前提下访问 http://localhost:8081/user/now
方式二:通过@ConfigurationProperties注入,自动刷新(推荐)
@Data //lombok,提供get、set方法 @Component //将被标记的类注册成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用约定大于配置的方式:类中属性和配置中的属性(pattern.dateformat)一致,就可以完成属性的自动更新 public class PatternProperties { private String dateformat; }
依赖注入PatternProperties对象
@Slf4j @RestController @RequestMapping("/user") //@RefreshScope public class UserController { // @Value("${pattern.dateformat}") // private String dateFormat; @Autowired private PatternProperties patternProperties; @GetMapping("/now") public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat(), Locale.CHINA)); } }
重启微服务实例
修改Nacos配置信息
访问 http://localhost:8081/user/now
多环境共享配置
微服务启动时会从nacos读取多个配置文件:
- [spring.application.name]-[spring.profiles.active].yaml,例如:userservice-dev.yaml
- [spring.application.name].yaml,例如:userservice.yaml
无论profile如何变化,[spring.application.name].yaml这个文件一定会加载,因此多环境共享配置可以写入这个文件
Java配置类关联配置信息
@Data //lombok,提供get、set方法 @Component //将被标记的类注册成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用约定大于配置的方式,类中属性和配置文件中的属性一致,就可以完成属性的自动更新 public class PatternProperties { private String dateformat; private String evnShared; }
获取信息
@Autowired private PatternProperties patternProperties; @GetMapping("/properties") public PatternProperties properties(){ return patternProperties; }
指定微服务的活动环境
重启微服务实例,访问8081和8083
优先级:
[服务名]-[环境].yaml >[服务名].yaml > 本地配置
本地配置
Java配置类关联配置信息
@Data //lombok,提供get、set方法 @Component //将被标记的类注册成spring容器的Bean @ConfigurationProperties(prefix = "pattern")//采用约定大于配置的方式,只要类中属性和配置文件中的属性一致,就可以完成属性的自动更新 public class PatternProperties { private String dateformat; private String evnShared; private String name; }
Nacos共享配置
Nacos环境配置