Soul网关同步数据逻辑初探

╰半橙微兮° 2023-01-10 05:04 222阅读 0赞

Http同步数据

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

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

可以看到上述代码中,项目创建了一个服务列表大小的线程池用来加载数据,用来提高性能和灵活性 file 这个加载的过程,基本就是获取数据的过程。 根据全局查询接口可以看到。config/fecth和config/listener接口的相关内容 file

DataChangedListener的主要实现

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

  1. @Override
  2. @SuppressWarnings("unchecked")
  3. public void onApplicationEvent(final DataChangedEvent event) {
  4. for (DataChangedListener listener : listeners) {
  5. switch (event.getGroupKey()) {
  6. case APP_AUTH:
  7. listener.onAppAuthChanged((List<AppAuthData>) event.getSource(), event.getEventType());
  8. break;
  9. case PLUGIN:
  10. listener.onPluginChanged((List<PluginData>) event.getSource(), event.getEventType());
  11. break;
  12. case RULE:
  13. listener.onRuleChanged((List<RuleData>) event.getSource(), event.getEventType());
  14. break;
  15. case SELECTOR:
  16. listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
  17. break;
  18. case META_DATA:
  19. listener.onMetaDataChanged((List<MetaData>) event.getSource(), event.getEventType());
  20. break;
  21. default:
  22. throw new IllegalStateException("Unexpected value: " + event.getGroupKey());
  23. }
  24. }
  25. }

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

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

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

  • Mono 数据流中要么是空,要么是一个对象
  • Flux 数据流中可能是一个对象,也有可能是空,也有可能是多个对象。即可能推测。Flux表达的范围比Mono更大
  • Operator操作符map,filter,flatMap即类似Java8中的一些流处理数据操作符。只不过在Reactor中是响应式的操作

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

总结和问题

  • 目前来说,由于事件的处理机制是依赖于Spring的事件处理。那么非Spring做个性化修改就比较麻烦了
  • 个人之前对于这种事件处理机制的了解不够,还需要深入学习Spring的事件处理机制以及设计模式中相关联的观察者模式等设计模式

欢迎搜索关注本人与朋友共同开发的微信面经小程序【大厂面试助手】和公众号【微瞰技术】,以及总结的分类面试题https://github.com/zhendiao/JavaInterview

file file

发表评论

表情:
评论列表 (有 0 条评论,222人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Soul使用感受

    阶段性 Soul网关使用感受 通过一段时间的Soul网关的接触,总结了一些我认为Soul网关存在的优势 使用上 使用界面化的方式实现的属性配置,极大的降低了