Apache SkyWalking 告警动态配置源码简析
synchronized public void registerConfigChangeWatcher(ConfigChangeWatcher watcher) {
if (isStarted) {
throw new IllegalStateException("Config Register has been started. Can't register new watcher.");
}
//利用传入的 AlarmRulesWatcher 实例,创建一个 WatcherHolder 实例,其实是对 AlarmRulesWatcher 实例的再次封装,并格式化好 key 为 alarm.default.alarm-settings。
WatcherHolder holder = new WatcherHolder(watcher);
if (register.containsKey(holder.getKey())) {
throw new IllegalStateException("Duplicate register, watcher=" + watcher);
}
//每一个不同的 key 对应不同的 WatcherHolder 实例,也就是不同动态配置对应不用的处理办法。
register.put(holder.getKey(), holder);
}
随后,ConfigWatcherRegister
抽象类的star **《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源** t
方法被调用:
public void start() {
isStarted = true;
//同步动态配置
configSync();
LOGGER.info("Current configurations aft Java 开源项目【ali1024.coding.net/public/P7/Java/git】 er the bootstrap sync." + LINE_SEPARATOR + register.toString());
//异步地每隔一段时间做一次动态配置的同步
Executors.newSingleThreadScheduledExecutor()
.scheduleAtFixedRate(
new RunnableWithExceptionProtection(
this::configSync,
t -> LOGGER.error("Sync config center error.", t)
), syncPeriod, syncPeriod, TimeUnit.SECONDS);
}
再看一下同步动态配置的configSync
方法:
void configSync() {
//读取所有注册进来的动态配置,包括告警的配置。
Optional<ConfigTable> configTable = readConfig(register.keys());
// 如果没有检测到任何配置的更改,configTable 可能为 null。
configTable.ifPresent(config -> {
config.getItems().forEach(item -> {
String itemName = item.getName();
//获取到配置对应的 WatcherHolder 实例
WatcherHolder holder = register.get(itemName);
if (holder != null) {
ConfigChangeWatcher watcher = holder.getWatcher();
String newItemValue = item.getValue();
if (newItemValue == null) {
if (watcher.value() != null) {
// 如果新的配置为 null,则发送删除配置的消息类型。
watcher.notify(
new ConfigChangeWatcher.ConfigChangeEvent(null, ConfigChangeWatcher.EventType.DELETE));
} else {
// 如果不调用 notify 方法,则保持配置为空。
}
} else {
if (!newItemValue.equals(watcher.value())) {
watcher.notify(new ConfigChangeWatcher.ConfigChangeEvent(
newItemValue,
ConfigChangeWatcher.EventType.MODIFY
最后
按照上面的过程,4 个月的时间刚刚好。当然 Java 的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
评论