本文将介绍微服务领域中的配置中心。
一、为什么需要配置中心?
在单体应用中,我们习惯于使用传统的配置管理方式,也就是将配置项维护在配置文件中。
在微服务架构下,我们会使用 “配置中心” 来管理所有配置项。
二、Nacos - 配置中心
1. 什么是 Nacos ?
如 Spring Cloud 服务治理 所说,Nacos 是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
2. 优势
- 职责分离:通过配置中心,可以实现配置项和代码之间的职责分离
- 高可用性:Nacos 可以组建集群模式,从而保证配置服务的高可用
- 环境隔离特性:Nacos 支持通过 Namespace 属性指定配置项所属环境,从而实现开发、预发布、生产环境的配置隔离
- 多格式:Nacos 支持纯文本、JSON、XML、YAML、Properties 等不同格式的配置内容
- 访问控制:Nacos 支持权限管理,可以配置不同账户对配置的访问权限
- 版本控制和审计:Nacos 支持查看、回滚配置项
- 运行时配置更新:可以在不重启应用程序的前提下更新配置信息
3. 示例
(1) 引入依赖
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
|
引入 spring-cloud-starter-bootstrap 的目的是为了增加对 bootstrap 配置文件的支持。
在 Spring Boot 项目中,bootstrap 文件的加载优先级高于 application。因此,Nacos 将配置放到 bootstrap 文件中,以确保其配置优先被加载,以免影响其它组件的正常初始化。
(2) 本地配置
在 resource 文件夹下创建 bootstrap.yml 文件,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| spring: application: name: Mall-Order cloud: nacos: config: namespace: dev group: myGroup server-addr: localhost:8848 file-extension: yml refresh-enabled: true timeout: 5000 config-retry-time: 2000 max-retry: 3 config-long-poll-timeout: 10000
|
(3) 添加配置文件
登录 Nacos,依次点击 配置管理 - 配置列表 - 创建配置
,创建配置如下:
(4) 读取配置
正常读取即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @RestController @RequestMapping("/order") public class OrderController {
@Value("${disabledOrderList}") private Boolean disabledOrderList;
@Resource OrderService orderService;
@PostMapping("/list") public List<Order> list() { System.out.println(disabledOrderList); if (disabledOrderList) { return new ArrayList<>(); } return orderService.list(); }
}
|
(5) 运行时配置更新
如果希望进行运行时配置更新,只需要在使用配置的 Bean 上增加 @RefreshScope
注解即可。@RefreshScope
可以实现对配置值的动态感知,并在配置值改变时生成新 Bean。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| @RefreshScope @RestController @RequestMapping("/order") public class OrderController {
@Value("${disabledOrderList}") private Boolean disabledOrderList;
@Resource OrderService orderService;
@PostMapping("/list") public List<Order> list() { System.out.println(disabledOrderList); if (disabledOrderList) { return new ArrayList<>(); } return orderService.list(); }
}
|
参考