Nacos配置管理
统一配置管理 :一次配置更改并支持热更新。将核心配置存储到配置管理服务,当微服务启动时会自动读取配置管理服务中的配置信息并结合本地配置启动。当配置改动时,配置管理服务会自动通知微服务,微服务读取新配置并自动热更新,无需重新启动。
配置中心的思路 是:
1、首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。2、当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
3、当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。
Hello配置管理
使用nacos作为配置中心,其实就是将nacos当做一个服务端,将各个微服务看成是客户端,将各个微服务的配置文件统一存放在nacos上,然后各个微服务从nacos上拉取配置即可。
对应的依赖为spring-cloud-starter-alibaba-nacos-config注意:启用配置中心后,需要配置文件写到bootstrap配置文件中。只能是bootstrap.yml或bootstrap.properties优先级等级为bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
需要注意:SpringCloud默认将bootstrap移除了,需要手动添加bootstrap依赖
xml
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> <version>3.1.5</version></dependency
消费者配置
spring.cloud.nacos.config.server-addr=localhost:8848 服务配置中心的配置spring.cloud.nacos.config.file-extension=yaml 配置使用的后缀名spring.cloud.nacos.config.prefix=nacos-consumer 配置DataId名称,默认就是服务名称spring.cloud.nacos.config.group=DEFAULT_GROUP 默认分组名称spring.profiles.active=dev 读取指定配置文件,配置参数dev开发环境、prod生产环境、test测试环境
配置设置的概念:
- 命名空间Namespace:不同的项目可以分为不同的命名空间。
- 配置分组Group:根据项目的不同环境可以一个分组。
- 配置集Data ID:服务不同环境的不同配置,就是一个配置集
使用nacos配置管理
DataID就是配置文件名称,不能冲突,采用【微服务名称-profile.yaml或properties】,如user-service-dev.yaml。默认DataId为spring.cloud.nacos.config.prefix,后面可以添加spring.profiles.active值,对应的文件后缀为spring.cloud.nacos.config.file-extension
分组采用默认即可。配置内容应该只有可能有热更新需求的配置信息,不是将所application.yml中内容全部拷贝。例如数据库地址一般不会频繁更新的,所以添加到配置管理中就不合适。这里适合一些开关类型或者模板类型的配置,pattern.dateformat=yyyy-MM-dd
微服务配置拉取
项目启动先读取nacos中的配置文件,然后读取本地配置文件application.yaml,合并后再创建spring容器,加载受管bean。项目中提供bootstrap.yml优先application.yml,这里配置nacos地址,从而实现nacos中配置信息的读取在控制器中读取配置信息进行验证
c
@Value("${pattern.dateformat}")
private String dateFormat;
@GetMapping("now")public String now(){ return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateFormat));}
配置热更新
可以在nacos控制台上手动编辑更新配置信息。事实上nacos中的配置文件变更后,微服务无需重启就可以感知。需要通过2种配置方式实现
方式1:在@Value注入的变量所在类上添加注解@RefreshScope
java
@Slf4j @RestController @RequestMapping("/user")@RefreshScopepublic class UserController { @Value("pattern.dateformat") private String dateFormat;}
在微服务日志中可以看到服务更新的自动通知
方式2:使用@ConfigurationProperties注解
java
@Component @Data@ConfigurationProperties(prefix="pattern")public class PatternProperties { private String dataformat;}
修改控制器类通过PatternProperties组件获取配置信息
java
@Autowiredprivate PatternProperties properties;@GetMapping("now")public String now() { return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()); }
推荐配置更新时优先考虑使用@ConfigurationProperties,而不是@Value+@RefreshScope
多环境配置共享
某个配置在开发、测试、生产等不同环境下的数据值一致,每个配置文件中都写一次是不合理的,而且修改时必须在每个配置文件中进行修改就更加的不合理了。微服务启动时会从nacos读取多个配置文件
- 【spring.application.name】-【spring.profiles.active】.yaml,例如userservice-dev.yaml
- 【spring.application.name】.yaml,例如userservice.yaml
- 【spring.application.name】,没有后缀,例如userservice无论profile如何变化,[spring.application.name].yaml文件一定会被加载,因此多环境共享配置可以写入这个配置文件中。多配置优先级:服务名-profile.yaml > 服务名.yaml > 本地配置