Appearance
三、配置中心-Config
1、模块简介
配置中心模块是 Spring Cloud Tencent 最核心的模块之一,实现了 Spring Cloud PropertySourceLoader SPI 接口(PolarisConfigFileLocator.java)。
在应用启动 Bootstrap 阶段,Spring Cloud 会调用 PolarisConfigFileLocator 从 Polaris 服务端获取配置文件并加载到 Spring 上下文里。通过 Spring Boot 标准的 @Value
,@ConfigurationProperties
注解即可获取配置内容。
动态配置刷新能力,则通过 Spring Cloud 标准的 @RefreshScope
机制实现。
注意: 由于 Spring Cloud PropertySourceLoader SPI 是在 Bootstrap 阶段调用,所以 Polaris Config 相关的配置内容(例如Polaris 服务地址)需要放在
bootstrap.yml
文件里,而不能
放在application.yml
文件里,否则会初始化失败。
2、快速入门
1、引入 Spring Cloud Tencent Config 依赖
xml
<dependency>
<groupId>com.tencent.cloud</groupId>
<artifactId>spring-cloud-starter-tencent-polaris-config</artifactId>
</dependency>
2、增加 Spring Cloud Tencent Config Starter 的配置文件
在您项目的 bootstrap.yml
配置文件中加入以下配置内容,注意一定要放在 bootstrap.yml
里。
核心配置内容为配置北极星服务端地址以及注入的配置文件信息
1. 配置 Polaris 配置中心地址
如果您使用的北极星配置中心和注册中心是同一套北极星集群,则只需配置 spring.cloud.polaris.address
即可。
如果您部署了两套北极星集群,分别用于注册中心和配置中心,则 spring.cloud.polaris.address
用于指定注册中心集群的地址,spring.cloud.polaris.config.address
用于指定配置中心的地址。
如下所示:
yaml
spring:
application:
name: ${application.name}
cloud:
polaris:
address: grpc://${修改为第一步部署的 Polaris 服务地址}:8091 # 必填
namespace: default # 全局 namespace 参数
config:
address: grpc://${独立的配置中心}:8093 # 选填,只有在配置中心和注册中心是两个不同的地址时才需要配置
auto-refresh: true # 选填,当配置发布后,动态刷新 Spring 上下文,默认值为 true面
2. 注入配置文件
我们推荐的最佳实践是在北极星管控端创建一个名为当前应用名( ${spring.application.name}
) 的配置分组,Spring Cloud Tencent Config 会自动注入当前应用名分组下的
application-${activeProfile}.properties
application-${activeProfile}.yml
application.properties
application.yml
bootstrap-${activeProfile}.properties
bootstrap-${activeProfile}.yml
bootstrap.properties
bootstrap.yml
优先级从上到下依次降低
注意:是
yml
后缀,而不是 yaml
自动注入以上配置文件符合 Spring Boot 的规范,能够满足绝大部分应用场景了。
只有当您需要注入额外自定义的配置文件时,才需要在 bootstrap.yml
里配置 spring.cloud.polaris.config.groups
,如下所示:
yaml
spring:
cloud:
polaris:
config:
groups:
- name: ${spring.application.name} # 选填,注入自定义配置的配置分组
files: [ "config/application.properties", "config/bootstrap.yml" ] # 注入自定义配置文件列表,当 key 冲突时,排在前面的配置文件优先级高于后面
yaml
server:
port: 8001
spring:
application:
name: springcloud-tencent-provider-demo
cloud:
polaris:
address: grpc://127.0.0.1:8091
namespace: test
config:
address: grpc://127.0.0.1:8093 # 选填,只有在配置中心和注册中心是两个不同的地址时才需要配置
auto-refresh: true # 选填,当配置发布后,动态刷新 Spring 上下文,默认值为 true面
groups:
- name: ${spring.application.name}
files: ["springcloud-tencent-provider-dev.yml"]
3、代码里使用配置
1. 通过 @Value
注入
java
@Value("${timeout:1000}")
private int timeout;
2. 通过 @ConfigurationProperties
注入
java
package com.xue.model;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
@RefreshScope
@Component
@ConfigurationProperties(prefix = "teacher")
@Data
/**
* @Author: xueqimiao
* @Date: 2022/6/29 18:38
*/
public class Person {
private String name;
private int age;
@Override
public String toString() {
return "User{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
4、在北极星控制台添加配置文件
1、创建 Namespace
Namespace 为北极星里核心的概念,通过 Namespace 逻辑隔离资源,例如通常用于标识不同的环境、不同的集群。
2、创建配置文件分组
北极星的配置文件分组概念为一组配置文件的集合,推荐把应用名作为一个分组名,例如在我们的示例中,新建一个 springcloud-tencent-provider-demo
的分组。 把 springcloud-tencent-provider-demo
应用的配置文件都放在springcloud-tencent-provider-demo
分组下,这样便于配置管理。
3、创建并发布配置文件
北极星配置中心的控制台,配置文件名可以通过 / 来按树状目录结构展示,树状结构可以清晰的管理配置文件。例如一个应用下分不同的模块,每个模块都有独立的一组配置文件,则可以创建 module1/file1.properties
, module1/file2.yaml
, module2/file3.yaml
。
注意:配置文件名强烈建议带文件后缀,例如 .properties .yaml .yml .json 等。因为客户端会通过文件名后缀来解析文件内容,如果客户端发现不认识的后缀名则默认当做 .properties 文件处理。
配置好的实例如下图所示:
5、启动应用
controller
java
package com.xue.controller;
import com.xue.model.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @Author: xueqimiao
* @Date: 2022/6/29 18:47
*/
@RestController
@RequestMapping("/person")
@RefreshScope
public class PersonController {
@Value("${teacher.name}")
private String name;
@GetMapping("/getName")
public String getName(){
return name;
}
}
sh
curl 127.0.0.1:8001/person/getName
xueqimiao
到控制台修改配置为xueqimiao2
sh
curl 127.0.0.1:8001/person/getName
xueqimiao2
到此接入 Spring Cloud Tencent Config 即已完成。
6、实现动态刷新配置能力
Spring Cloud 通过在配置变更的时候,重建 Bean 的方式实现动态刷新能力。通过以下两个步骤即可实现刷新能力:
步骤一:开启动态刷新开关(默认为打开状态)
在 bootstrap.yml
里配置 spring.cloud.polaris.config.auto-refresh=true
步骤二:给 Bean 打上 @RefreshScope
注解
3、自定义配置监听器 (1.6.0 版本支持,当前 Release 版本未包含)
可通过注解@PolarisConfigKVFileChangeListener
实现针对指定的配置属性名称或者属性前缀进行监听,配置发生变更时会触发方法回调。
注意:目前只支持 KV 结构的配置文件监听
java
@Component
public final class PersonConfigChangeListener {
/**
* PolarisConfigKVFileChangeListener Example .
* @param event instance of {@link ConfigChangeEvent}
*/
@PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher")
public void onChange(ConfigChangeEvent event) {
Set<String> changedKeys = event.changedKeys();
for (String changedKey : changedKeys) {
System.out.printf("%s = %s \n", changedKey, event.getChange(changedKey));
}
}
}
4、完整的配置参数
配置项Key | 默认值 | 是否必填 | 配置项说明 |
---|---|---|---|
spring.cloud.polaris.config.enabled | true | 否 | 是否开启配置模块 |
spring.cloud.polaris.config.address | 无 | 否 | 北极星服务端地址,可不填。当配置中心和注册中心为不同的地址时候才需要填写 |
spring.cloud.polaris.config.port | 8093 | 否 | 北极星配置中心的端口号,默认为 8093 |
spring.cloud.polaris.config.auto-refresh | true | 否 | 是否动态更新配置 |
spring.cloud.polaris.config.groups | 无 | 否 | 从北极星服务端获取自定义的配置文件 |
spring.cloud.polaris.config.connect-remote-server | true | 否 | 是否连接到远程北极星配置中心服务端,当没有网络环境或者无北极星服务端时可关闭 |
5、北极星配置中心原理介绍
客户端端视角
- 应用启动时,同步从服务端拉取一次配置,获取最新的配置内容
- 把第一步拉取到的所有的配置文件生成
List<File->Version>
的数据 ,并向服务端发送订阅配置请求,请求内容为List<File->Version>
- 当收到配置文件的推送消息时,向服务端拉取最新的配置文件
订阅配置服务端视角
- 先检查客户端
List<File->Version>
的请求里是否存在 File 版本号落后,如果存在,则立马响应File -> NewVersion
内容给客户端 - 如果客户端配置文件版本号都是最新的,则在内存里维护
File -> List<Client>
的数据结构并 Hold 请求 30s。如果 30s 内有配置文件发布,则立马响应请求,返回File -> NewVersion
给所有客户端
发布推送配置简化流程
- 用户在界面点击发布按钮,服务端更新数据库里配置发布表的数据。配置发布表的核心字段:
file, version, content, mtime
- 每个北极星服务端实例,都会定时1s扫描配置发布表,根据 mtime 捞出最近 1s 内变更过的数据
- 北极星服务端实例扫描到最新变更的数据之后
- 重新加载内存缓存
- 向内存里的消息发布管道里写入一条消息
- 推送协程从消息发布管道里获取到消息,并消费消息。通过
File -> List<Cl