Spring Cloud 配置中心

本文将介绍微服务领域中的配置中心。

一、为什么需要配置中心?

在单体应用中,我们习惯于使用传统的配置管理方式,也就是将配置项维护在配置文件中。

在微服务架构下,我们会使用 “配置中心” 来管理所有配置项。

二、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
<!-- Nacos - 配置中心 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- 增加对 bootstrap 配置文件的支持 [与 Nacos - 配置中心 配合使用] -->
<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
# Nacos地址 [可以配置多个,逗号分隔]
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();
}

}

参考

  • Spring Cloud 微服务项目实战