Soul网关同步数据逻辑初探

Http同步数据

按照前面两个同步数据的分析,可以看到Http同步跟其他的同步的加载基本一样。不同的地方主要是加载数据的操作
加载数据的过程主要是

private void start() {
        // It could be initialized multiple times, so you need to control that.
        if (RUNNING.compareAndSet(false, true)) {
            // fetch all group configs.
            this.fetchGroupConfig(ConfigGroupEnum.values());
            int threadSize = serverList.size();
            this.executor = new ThreadPoolExecutor(threadSize, threadSize, 60L, TimeUnit.SECONDS,
                    new LinkedBlockingQueue<>(),
                    SoulThreadFactory.create("http-long-polling", true));
            // start long polling, each server creates a thread to listen for changes.
            this.serverList.forEach(server -> this.executor.execute(new HttpLongPollingTask(server)));
        } else {
            log.info("soul http long polling was started, executor=[{}]", executor);
        }
    }

可以看到上述代码中,项目创建了一个服务列表大小的线程池用来加载数据,用来提高性能和灵活性

这个加载的过程,基本就是获取数据的过程。
根据全局查询接口可以看到。config/fecth和config/listener接口的相关内容

DataChangedListener的主要实现

根据上面所示。获取数据是由HttpLongPollingDataChangedListener来实现的,这不禁使我想要去看看这个DataChangedListener的实现。后续我们可以发现一个实现了Spring事件接口ApplicationListener的类。关于这个类的简单实用,可以参考https://blog.csdn.net/liyantianmin/article/details/81017960 这篇文章。用来分别处理不同的事件的处理

@Override
    @SuppressWarnings("unchecked")
    public void onApplicationEvent(final DataChangedEvent event) {
        for (DataChangedListener listener : listeners) {
            switch (event.getGroupKey()) {
                case APP_AUTH:
                    listener.onAppAuthChanged((List<AppAuthData>) event.getSource(), event.getEventType());
                    break;
                case PLUGIN:
                    listener.onPluginChanged((List<PluginData>) event.getSource(), event.getEventType());
                    break;
                case RULE:
                    listener.onRuleChanged((List<RuleData>) event.getSource(), event.getEventType());
                    break;
                case SELECTOR:
                    listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
                    break;
                case META_DATA:
                    listener.onMetaDataChanged((List<MetaData>) event.getSource(), event.getEventType());
                    break;
                default:
                    throw new IllegalStateException("Unexpected value: " + event.getGroupKey());
            }
        }
    }

根据Spring的ApplicationListener可知,这里只是事件的处理。那么事件是如何被触发的。我又开始了全局查找publishEvent的过程。这个联想可知。应该是在修改数据的时候进行的改变,果真如我们所想。可以看到AppAuthServiceImpl的applyCreate就发布了事件

eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.APP_AUTH, DataEventTypeEnum.CREATE,
                Collections.singletonList(data)));

截止目前关于Reactor中一些概念的理解

  • Mono

    数据流中要么是空,要么是一个对象

  • Flux

    数据流中可能是一个对象,也有可能是空,也有可能是多个对象。即可能推测。Flux表达的范围比Mono更大

  • Operator操作符map,filter,flatMap即类似Java8中的一些流处理数据操作符。只不过在Reactor中是响应式的操作

关于subscribe和webflux相关后续会再研究

总结和问题

  • 目前来说,由于事件的处理机制是依赖于Spring的事件处理。那么非Spring做个性化修改就比较麻烦了

  • 个人之前对于这种事件处理机制的了解不够,还需要深入学习Spring的事件处理机制以及设计模式中相关联的观察者模式等设计模式

(0)

相关推荐

  • Soul网关websocket同步数据

    websocket同步数据 初始化属性部分 首先启动soul-admin项目,然后启动soul-boostrap项目,可以明显发现websocket连接成功 奇怪的是,使用昨天测试SpringClou ...

  • Soul网关插件之Spring Cloud

    com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known serve ...

  • Soul网关Hystrix插件相关知识点扫盲

    线程隔离和信号量隔离 Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池内.避免说对某一个依赖服务的调用,因为依赖服务的 ...

  • Soul网关限流插件Sentinel和Resilience4J扫盲

    首先看Soul中Sebtinel可以配置的项目 对应的配置的含义 degrade count:熔断阈值 whether to open the degrade (1 or 0):是否开启熔断,1开启 ...

  • 如何玩转场地信息的数据逻辑与表达

    这张场地分析是我们小组在MArch Urban Design, UCL时期的作品,国外的设计专业都非常注重前期调研和数据.信息整理,这一点跟国内注重结果的习惯很不一样,所以大家在准备出国作品集的时候, ...

  • 【网安智库】欧洲数据产权初探

    欧洲数据经济潮流涌动,数据市场的完整性和专业性不断增强.繁复的数据运用和价值挖掘,使得以数据经营和利用为核心的利益关系更为复杂,传统法律框架已不足以实现良好的规范效果.作为一种新兴资产,以是否具有人格 ...

  • 隋唐长安城的历史环境-空间逻辑初探

    本文来源:城市规划 导读 长期以来,关于隋唐长安城的研究汗牛充栋.本文试图在前人成果的基础上对隋唐长安城的历史环境进行重新思考,深入剖析这座伟大都城形成和发展过程中的空间逻辑.隋唐以前,关中已经拥有了 ...

  • 【独角兽智库】精酿-乐惠国际逻辑初探

    作者|独角兽研究 独角兽智库 精酿-乐惠国际逻辑初探 01 第一主业 公司在手订单数额总体呈上升趋势,2020 年末公司在手订单达14.95 亿元.未来公司啤酒酿造设备和无菌灌装设备收入有望同步订单增 ...

  • 海外观点: 电竞数据“虚高”的风评背后,用户需要理解数据逻辑

    如果用户不够了解电竞产业报告和其中的数据逻辑,该数据所表现的差异和变化就意义不大. 原文:Chris Hana(TEO电竞观察家联合创始人) "如果想了解市场,大多时候都需要数据来佐证投资人 ...