Soul网关源码分析之soul-admin与soul-gateway使用Websocket数据同步

Soul网关源码分析之soul-admin与soul-gateway数据同步

目标

  • soul网关项目结构介绍
  • soul-admin和soul网关数据同步
  • 总结

soul网关项目结构

  • 从GitHub下载项目

    • 从soul网关的github仓库下载soul项目,你也可以fork到你的GitHub仓库

      git clone https://github.com/dromara/soul.git
      
    • soul项目目录介绍

在这里插入图片描述

      • soul-admin:soul网关管理后台服务,提供了插件的选择器创建配置变更元数据查询规则数据修改网关数据热更新的能力
      • soul-bootstrap:官方提供的soul网关程序,是一个集成soul网关的程序,很简单;我们也可以不使用该项目,可以自己搭建网关。
      • soul-client:提供客户端发布API到网关的能力,例如dubbo,sofa等,例如,将dubbo的元信息注册到网关
      • soul-common:封装了soul网关的数据结构定义,常量,配置,异常和工具类等
      • soul-dist:soul-admin和soul-bootstrap的打包工具
      • soul-examples:提供了http,sofa,dubbo,springcloud,tars等接入soul网关的例子
      • soul-metrics:监控插件整合
      • soul-plugin:soul网关的核心插件工程,支持dubbo,http,限流,熔断,监控,防火墙等等核心插件
      • soul-register-center:注册中心工程,目前这个工程定义了接口和zk,http的空实现
      • soul-spi:soul网关提供扩展能力工程
      • soul-spring-boot-starter:soul网关自定义starter工程,提供了soul-client,soul-plugin,soul-gateway,soul-sync-data-center的starter
      • soul-sync-data-center:soul数据同步工程,目前支持websockethttp长轮询nacoszookeeper
      • soul-web:soul网关处理请求的工程,包括请求入口,Filter等。

soul-admin和soul网关数据同步-Websocket

    soul-admin和soul网关数据同步支持http长轮询,zookeeper,websocket和nacos,这里分析下Websocket方式

    websocket协议是全双工的通信方式,所以做这种数据同步,既有pull又有push的场景很合适

    从官网下载一张架构图,soul网关启动时会从Config Server拉去配置数据缓存到本地;管理员在管理后台,更新规则,配置选择器,修改流量的时候数据会同步到DB和Config Server,Soul网关使用pull或push的方式获取进行配置信息获取,并且同步到本地,而是pull还是push取决于配置。

在这里插入图片描述

soul-admin数据同步

  • 开启websocket

yml配置

soul:
  sync:
    websocket:
      enabled: true
  • 数据同步

    管理员在更新配置,插件,规则的时候会通过spring的ApplicationEventPublisher发出配置变更通知,由DataChangedEventDispatcher处理变更通知,然后将根据对应的策略配置(websocket,zk,http还是nacos),将配置发送给事件处理器。

  • EventPublish源码分析

publishEvent方法是事件发布的方法,发布事件核心代码是:

eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, DataEventTypeEnum.UPDATE,
                Collections.singletonList(RuleDO.transFrom(ruleDO, pluginDO.getName(), conditionDataList))));

在这里插入图片描述

扫描二维码关注公众号,回复: 12422060 查看本文章

    • DataChangedEventDispatcher源码分析

    onApplicationEvent事件处理方法,根据事件的groupKey处理不同的组件的事件afterPropertiesSet()方法是从Spring的上下文(applicationContext)中获取到使用的数据同步策略,这里我们配置的是websocket所以会获取到,websocket的处理监听器

在这里插入图片描述

    • Websocket监听器配置

    在soul-admin是怎么配置的监听器呢,我们从DataChangedEventDispatcher可以看出,监听器是配置在了ApplicationContext中,这是spring的上下文,所以我们在soul-admin项目中查看spring配置的相关类,果不其然,发现在DataSyncConfiguration配置了监听器的配置,以下是配置websocket的部分,websocketDataChangedListener()实例化WebsocketDataChangedListener监听器的实例,websocketCollector()实例化WebsocketCollectorserverEndpointExporter实例化ServerEndpointExporter

在这里插入图片描述

    接下来我们具体看一下WebsocketDataChangedListener、WebsocketCollector
    WebsocketDataChangedListener

在这里插入图片描述

    • WebsocketCollector源码分析

    WebsocketCollector使用@ServerEndpoint("/websocket")注解表示websocket的Server,onOpen方法与客户端保持会话,onMessage方法当有数据时处理数据,管理员修改规则数据最后正式从这个方法将数据发送到网关onClose当客户端断开连接时关闭连接

在这里插入图片描述

soul网关数据同步

  • 开启websocket

yml配置

soul :
  sync:
    websocket :
      # 设置成你的soul-admin地址
      urls: ws://localhost:9095/websocket

  • 网关数据同步源码分析

    • WebsocketSyncDataConfiguration分析

    我引用了soul-spring-boot-starter-sync-data-websocket包,我就在idea找到这个jar包,发现了WebsocketSyncDataConfiguration配置类,这个配置类中的参数就是在yml中的配置, WebsocketSyncDataConfiguration实例化了WebSocket的配置和同步数据的Service。

在这里插入图片描述

    那么 WebsocketSyncDataConfiguration是怎么能够自动就装配了呢,这就是SpringBoot创建bean的流程了,SpringBoot扫描到soul-spring-boot-starter-sync-data-websocket包下的spring.factories,内容是org.springframework.boot.autoconfigure.EnableAutoConfiguration=
org.dromara.soul.spring.boot.starter.sync.data.websocket.WebsocketSyncDataConfiguration看到这段配置SpringBoot就会自动的执行配置,配置类就是WebsocketSyncDataConfiguration

    • WebsocketSyncDataService源码分析

    WebsocketSyncDataService,该类实际上是封装了一个定时执行的线程池,首先从WebsocketConfig获取url列表,线程池的大小就是url列表的大小,然后根据url创建SoulWebsocketClient并且吧订阅的变更通知加进去,然后一个一个的吧websocket的客户端起来,最后将websocket的客户端放到线程池中执行。

    • SoulWebsocketClient源码分析

    SoulWebsocketClient是Websocket的客户端,重写了onOpen,onMessage,onClose等webSocket的方法,SoulWebsocketClient构造器中实例化了WebsocketDataHandler,当有变更通知通过Websocket过来时掉用WebsocketDataHandler的executor方法

在这里插入图片描述

    • WebsocketDataHandler源码分析

    WebsocketDataHandler 网关启动时将数据处理器缓存到Map中,提供executor用于执行变更,executor使用了策略模式,根据ConfigGroupEnum执行具体类型的数据处理器

在这里插入图片描述

总结

   该篇文章介绍了soul网关项目结构以及soul-admin和soul网关数据同步流程和源码分析,具体的soul-gateway数据刷新更新的具体流程下篇文章介绍,同时下篇文章还将介绍业务接口发布到soul-gateway的源码分析,总结下来本篇文章的介绍可以套用官网的一张图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_31279701/article/details/112725043
今日推荐