写点什么

Apache SkyWalking 告警动态配置源码简析

  • 2022 年 4 月 16 日
  • 本文字数:1271 字

    阅读完需:约 4 分钟

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 的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。


学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。


道路是曲折的,前途是光明的!”




用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Apache SkyWalking 告警动态配置源码简析_Java_爱好编程进阶_InfoQ写作平台