Consul 入门教程 - 新版篇

大纲

新版本使用

版本说明

组件名版本
Java17+
Spring Boot3.2.0
Spring Cloud2023.0.0
spring-cloud-starter-consul4.1.0

Consul 配置中心

使用案例

这里将演示新版本 Consul 作为配置中心的使用案例,由于篇幅有限,只给出核心代码和配置信息。

核心代码
  • 引入依赖
1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
  • 配置属性类
1
2
3
4
5
6
7
8
9
10
11
12
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Getter
@Configuration
public class AppProperties {

@Value("${env.info:}")
private String envInfo;

}
配置文件
配置规则说明

Spring Cloud Consul 在 官方文档 中提到过,要求在 bootstrap.yml 中配置 Consul 配置中心,并遵从一定的配置规则。

创建配置文件

在项目中创建 bootstrap.yml 配置文件,并添加以下配置信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: 127.0.0.1 # Consul 启动地址
port: 8500 # Consul 启动端口
config:
format: YAML # Consul 中 Value 的配置格式为 YAML
prefix: config # Consul 中的配置文件目录,默认为 config
default-context: app # 去该目录下查找缺省配置,默认为 application
profile-separator: '-' # profiles 配置的分隔符,默认为 ','
data-key: data # 如果指定配置格式为 YAML 或者 Properties,则需要该值作为 key,默认为 data
Consul 添加配置信息

访问 Consul 的 UI 界面,比如 http://127.0.0.1:8500/,然后手动添加不同环境(比如默认环境、开发环境、测试环境)的配置信息,如下图所示。

####### 默认环境的配置信息

  • 首先创建 config 文件夹,必须以 / 结尾

  • 然后,在 config 文件夹下创建 cloud-payment-service 文件夹(名称必须跟微服务应用的名称一致),必须以 / 结尾

  • 最后,在 cloud-payment-service 文件夹下面创建 data 配置信息,这里的 data 不再是文件夹,而是 key

####### 开发环境的配置信息

  • 首先创建 config 文件夹,必须以 / 结尾

  • 然后,在 config 文件夹下创建 cloud-payment-service-dev 文件夹(名称由微服务应用的名称 + Profiles 组成,比如 dev 表示开发环境),必须以 / 结尾

  • 最后,在 cloud-payment-service-dev 文件夹下面创建 data 配置信息,这里的 data 不再是文件夹,而是 key

####### 测试环境的配置信息

  • 首先创建 config 文件夹,必须以 / 结尾

  • 然后,在 config 文件夹下创建 cloud-payment-service-test 文件夹(名称由微服务应用的名称 + Profiles 组成,比如 test 表示测试环境),必须以 / 结尾

  • 最后,在 cloud-payment-service-test 文件夹下面创建 data 配置信息,这里的 data 不再是文件夹,而是 key

测试代码
  • 添加测试接口
1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
@RequestMapping("/config")
public class ConfigController {

@Autowired
private AppProperties properties;

@GetMapping("/envInfo")
public String envInfo() {
return properties.getEnvInfo();
}

}
  • application.yml 配置文件
1
2
3
4
5
6
7
server:
port: 8080

spring:
# 激活不同的配置环境
profiles:
active: dev
  • 测试步骤
    • (1) 启动微服务应用,访问 http://127.0.0.1:8080/config/info 测试接口,观察接口的返回结果是不是 Dev Env
    • (2) 将 application.yml 配置文件中的 active: dev 更改为 active: test,然后重启微服务应用。
    • (3) 再次访问 http://127.0.0.1:8080/config/info 测试接口,观察接口的返回结果是不是 Test Env
动态刷新配置信息

Spring Cloud Consul 支持动态刷新配置信息,也就是当用户在 Consul 的 UI 管理界面更改了配置信息,微服务应用可以实时感知到并执行更新操作。当使用动态刷新配置信息时,只需要添加 @RefreshScope 注解即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Configuration;

@Getter
@RefreshScope
@Configuration
public class AppProperties {

@Value("${env.info:}")
private String envInfo;

}

特别注意

  • Spring Cloud Consul 默认是每隔 55 秒执行一次配置刷新,以此来判断 Consul 配置中心的配置信息是否发生了变更。
  • 如果希望接近实时的更新配置信息,可以通过 spring.cloud.consul.config.watch.wait-time 来指定配置信息更新的时间间隔(单位是秒),但生产环境不建议更改此参数。官方文档的说明如下图所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
spring:
application:
name: cloud-payment-service
cloud:
consul:
host: 127.0.0.1 # Consul 启动地址
port: 8500 # Consul 启动端口
config:
format: YAML # Consul 中 Value 的配置格式为 YAML
prefix: config # Consul 中的配置文件目录,默认为 config
default-context: app # 去该目录下查找缺省配置,默认为 application
profile-separator: '-' # profiles 配置的分隔符,默认为 ','
data-key: data # 如果指定配置格式为 YAML 或者 Properties,则需要该值作为 key,默认为 data
watch:
wait-time: 1 # 配置信息更新的时间间隔(单位是秒),生产环境不建议修改此参数