目录
Nacos 配置统一管理
Nacos 配置热部署
Nacos 多环境配置共享
配置优先级
Nacos 配置统一管理
实例理解
- 我们想要利用 Nacos 在 user-service 的 application.yml 配置文件中新增配置项
- 此处我们将新增配置日期格式为 yyyy-MM-dd HH:mm:ss
- 下图为新增 Nacos 配置统一管理后的配置获取步骤
1)在 Nacos 管理平台中新建配置信息
2)在 user-service 的 pom.xml 中引入 Nacos 配置管理客户端依赖
<!--nacos配置管理依赖--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
3)在 userservice 中的 resource 目录添加一个 bootstrap.yml 文件
spring:application:name: userservice # 服务名称profiles:active: dev # 开发环境 devcloud:nacos:server-addr: localhost:8848 # nacos地址config:file-extension: yaml # 指定配置文件类型
注意:
- bootstrap.yml 文件为引导文件,其优先级高于 application.yml
- 所以我们还需注释掉 application.yml 中重复出现的内容 !
结果验证
1)在 user-service 的 UserController 中创建编写下方代码
@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));} }
- 通过 @Value 注解获取配置文件中的 pattern.dateformat 配置项,即日期格式
2)重启 UserApplication,在浏览器的 url 框中输入对应地址,获取当前的日期时间
- 观察此处日期时间的输出格式,与我们在 Nacos 管理平台新增的配置项日期格式一致
小总结
- 将配置交给 Nacos 管理的三大步骤
- 在 Nacos 管理平台中添加配置文件
- 在微服务中引入 Nacos 的 config 依赖
- 在微服务中添加 bootstrap.yml,配置 Nacos 地址、当前环境、服务名称、文件后缀名,这些决定了程序启动时去 Nacos 读取哪个文件
Nacos 配置热部署
- Nacos 中的配置文件变更后,微服务无需重启变可感知
方式一
- 在 @Value 注入的变量所在类上添加注解 @RefreshScope
方式二
- 使用 @ConfigurationProperties 注解
- 相较于方式一,此处更推荐方式二
1)在 user-service 中新创建一个 PatternProperties 类
package cn.itcast.user.config;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;@Data @Component @ConfigurationProperties(prefix = "pattern") public class PatternProperties {private String dateformat; }
2)仅需细微改动 UserController 中的代码,让其注入 PatternProperties Bean 对象即可
@Slf4j @RestController @RequestMapping("/user") public class UserController {@Autowiredprivate PatternProperties properties;@GetMapping("/now")public String now() {return LocalDateTime.now().format(DateTimeFormatter.ofPattern(properties.getDateformat()));} }
3)重启 UserApplication 即可实现配置热部署
结果验证
- 此处我们希望通过修改上文已配置的日期格式,来检测是否已成功实现配置热更新
1)在 nacos 配置管理中选择 userservice-dev.yaml 并点击编辑
2)修改配置项,即修改日期格式
3)无需重启 user-service ,直接在浏览器中输入对应 url 路径
- 由上图可知,此处我们已成功实现配置热更新
小总结
- Nacos 配置更改后,微服务实现热更新有两种方式
- 通过 @Value 注解注入,结合 @RefreshScope 注解来刷新
- 通过 @ConfigurationProperties 注入,自动刷新(推荐)
注意事项
- 不是所有的配置都适合放到配置中心,维护起来比较麻烦
- 建议将一些关键数据,需要运行时调整的参数放到 Nacos 配置中心,一般都是自定义配置
Nacos 多环境配置共享
- 微服务启动时会从 Nacos 中读取多个配置文件
- [spring.application.name]-[spring.profiles.active].yaml,例如 userservice-dev.yaml
- [spring.application.name].yaml,例如 userservice.yaml
注意:
- 无论 profile 如何变化,[spring.application.name].yaml 文件一定会被加载
- 因此当我们进行多环境共享配置时,可直接写入该文件中
实例理解
- 我们想要利用 Nacos 在 user-service 的 application.yml 配置文件中新增配置项
1)在 Nacos 管理平台中新建配置信息
2)与区别上文所配置的 userservice-dev.yaml
结果验证
1)修改 user-service 中的 PatternProperties 类,让其能够获取到 envShareValue
package cn.itcast.user.config;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;@Data @Component @ConfigurationProperties(prefix = "pattern") public class PatternProperties {private String dateformat;private String envShareValue; }
2)在 user-service 的 UserController 类中,添加下方代码
@Slf4j @RestController @RequestMapping("/user") public class UserController {@Autowiredprivate PatternProperties properties;@GetMapping("/prop")public PatternProperties properties() {return properties;} }
3)我们将 UserApplication 8081 的环境设为 dev,并将其重新启动
4)我们将 UserApplication 8082 的环境设为 test,并将其重新启动
5)在浏览器中输入对应的 url 路径访问 UserApplication 8081 的接口
- 如上图所示,8081 成功获取到 dateformat 和 envShareValue 这两个配置项的值
- 因为 8081 的环境为 dev,所以能够加载 userservice-dev.yaml 中的配置项
6)在浏览器中输入对应的 url 路径访问 UserApplication 8082 的接口
- 如上图所示,8082 仅获取到 envShareValue 这两个配置项的值
- 因为 8082 的环境为 test,因此无法加载 userservice-dev.yaml 中的配置项
配置优先级
小总结
- 微服务会从 Nacos 中读取的配置文件
- [服务名]-[spring.profile.active].yaml,环境配置
- [服务名].yaml,默认配置,多环境共享
- 关于优先级
- [服务名]-[环境].yaml > [服务名].yaml > 本地配置