Configuration模块主要用于提供oapServer配置参数
支持基于外部中间件的动态配置[可动态修改刷新配置]
默认的非动态配置
| application.yml | server-configuration |
|---|---|
![]() | ![]() |
配置模块架构图
- 外部模块创建配置类[继承ConfigChangeWatcher],并通过配置模块registerConfigChangeWatcher实现配置注册
- 配置模块根据具体Provider实现调用ConfigChangeWatcher.notify通知配置变更
- 配置的监听通过pull模式,60秒一次主动读取
| Provider名称 | 作用 |
|---|---|
| NoneConfigurationProvider | 不支持动态监听配置修改 |
| AbstractConfigurationProvider | 动态配置类基类 |
| ApolloConfigurationProvider | 监听Apollo配置 |
| ConsulConfigurationProvider | 监听consul配置 |
| EtcdConfigurationProvider | 监听etcd配置 |
| GRPCConfigurationProvider | 支持grpc服务读取 |
| NacosConfigurationProvider | 监听nacos配置 |
| ZookeeperConfigurationProvider | 监听zk配置 |

源码分析一ConfigurationProvider.prepare
- 根据具体Provider初始化具体的ConfigWatcherRegister
- ConfigWatcherRegister作为DynamicConfigurationService注册到Provider
public abstract class AbstractConfigurationProvider extends ModuleProvider {
注册该服务configWatcherRegister,该服务负责扫描ConfigChangeWatcher变更,并调用其notify方法
private ConfigWatcherRegister configWatcherRegister;
@Override public void prepare() throws ServiceNotProvidedException, ModuleStartException {
初始化配置注册器[负责定时拉取不同中间件的配置 调用watcher监听器更新配置]
configWatcherRegister = initConfigReader();
注册配置注册器
this.registerServiceImplementation(DynamicConfigurationService.class, configWatcherRegister);
}
}
public class ZookeeperConfigurationProvider extends AbstractConfigurationProvider {
private ZookeeperServerSettings settings;
yml 对应的Provider中取得相关配置
@Override
public ModuleConfig createConfigBeanIfAbsent() {
return settings;
}
@Override
protected ConfigWatcherRegister initConfigReader() throws ModuleStartException {
try {
zk的配置信息初始化zkClient
return new ZookeeperConfigWatcherRegister(settings);
} catch (Exception e) {
throw new ModuleStartException(e.getMessage(), e);
}
}
}
源码分析一 configWatcherRegister.start
provider 的notifyAfterCompleted调用配置监听注册器的start方法
- 每60秒执行一次readConfig进行远程配置拉取
- 不同的中间件readConfig实现不同,zk则读取zk信息,apollo则读取Apollo
- 调用ConfigChangeWatcher.notify实现注册变更通知
- ConfigChangeWatcher子类为用户自定义配置类
- 定义好ConfigChangeWatcher子类通过registerConfigChangeWatcher注册到配置模块中,从而支持监听功能
public abstract class ConfigWatcherRegister implements DynamicConfigurationService {
@Override synchronized public void registerConfigChangeWatcher(ConfigChangeWatcher watcher) {
if (isStarted) {
throw new IllegalStateException("Config Register has been started. Can't register new watcher.");
}
WatcherHolder holder = new WatcherHolder(watcher);
if (register.containsKey(holder.getKey())) {
throw new IllegalStateException("Duplicate register, watcher=" + watcher);
}
包含相关的ConfigChangeWatcher
register.put(holder.getKey(), holder);
}
public void start() {
isStarted = true;
configSync();
logger.info("Current configurations after the bootstrap sync." + LINE_SEPARATOR + register.toString());
每60秒执行一次调度
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(
new RunnableWithExceptionProtection(this::configSync,
t -> logger.error("Sync config center error.", t)), syncPeriod, syncPeriod, TimeUnit.SECONDS);
}
定时同步远程配置的数据
void configSync() {
读取远程配置信息
ConfigTable configTable = readConfig(register.keys());
configTable.getItems().forEach(item -> {
String itemName = item.getName();
其他模块注册的ConfigChangeWatcher
WatcherHolder holder = register.get(itemName);
ConfigChangeWatcher watcher = holder.getWatcher();
String newItemValue = item.getValue();
...... 删除部分代码便于阅读
触发ConfigChangeWatcher监听
watcher.notify(new ConfigChangeWatcher.ConfigChangeEvent(null, ConfigChangeWatcher.EventType.DELETE));
});
}
读取远程配置的信息
public abstract ConfigTable readConfig(Set<String> keys);
}
总结
- 静态配置模块为NoneConfigurationProvider,内部空实现
- 配置模块为其他模块提供配置方式
| 提供配置方式 | 用户自定义配置 |
|---|---|
| DynamicConfigurationService dynamicConfigurationService = getManager().find(ConfigurationModule.NAME).provider().getService(DynamicConfigurationService.class); | ConfigChangeWatcher通过成员变量定义配置 |
| dynamicConfigurationService.registerConfigChangeWatcher(用户自定义配置); | 通过实现notify修改配置 |
本文探讨了OAP Server的配置模块,包括多种配置提供者如Apollo、Consul等,重点剖析了AbstractConfigurationProvider和ConfigWatcherRegister的工作原理。学习如何使用DynamicConfigurationService动态注册和监听配置变化,以及如何通过用户自定义ConfigChangeWatcher实现配置管理。


9978

被折叠的 条评论
为什么被折叠?



