可扩展、高性能、响应迅速的API网关——Soul使用websocket同步数据到网关(七)

本文章将成系列介绍:包含但不限于高性能微服务API网关Soul的环境搭建、源码设计

本章节介绍soul,admin操作,使用websocket同步数据到网关

源码跟踪

在这里插入图片描述

  • 点击divide插件的选择器修改按钮,可以看到前端调用了RuleController.“rule/{id}”的get方法,查询表数据:rule、rule_condition、selector、selector_condition
  • 修改某项数据点击确认后,可以看到前端调用了RuleController.“rule/{id}”的put方法,对rule_condition中某项数据执行delete then add(那更新字段岂不是无意义?),之后退出调用RuleController.“rule“的get方法重新查询(分页,每页十二条数据)选择器项下所有规则;

看了这些之后并没有发现与网管同步数据的内容,于是从网关入手查看……

1.看到网关启动日志:

2021-01-21 23:37:49.285 INFO 4768 — [ main] b.s.s.d.w.WebsocketSyncDataConfiguration : you use websocket sync soul data…

2021-01-21 23:37:52.431 INFO 4768 — [ main] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket connection is successful…

2.网关端启动后admin端打印日志:

2021-01-21 23:39:52.665 INFO 20000 — [0.0-9095-exec-3] o.d.s.a.l.websocket.WebsocketCollector : websocket on open successful…

3.在admin端长时间断点停留导致websocket超时,断点释放后,网关端重新连接websocket打印日志:

2021-01-22 00:18:38.049 INFO 2744 — [ocket-connect-1] o.d.s.p.s.d.w.WebsocketSyncDataService : websocket reconnect is successful…

  • WebsocketCollector

    • 声明了@ServerEndpoint("/websocket")注解与客户端使用websocket建立连接,使用了:

      @OnOpen(连接建立成功调用的方法)

      @OnMessage(收到客户端消息后调用的方法)

      @OnClose(连接关闭调用的方法)

      @OnError(发生错误时调用)

      send方法(向当前客户端发送消息)

    • 发现在修改了规则某一项后点击确认,更新数据库后,调用了WebsocketCollector.send方法用来向客户端发送数据

    • 再往前追溯发现调用了DataChangedEventDispatcher.onApplicationEvent(final DataChangedEvent event)方法:

      在这里插入图片描述
      DataChangedEvent中封装了:

    eventType = {DataEventTypeEnum@9079} “UPDATE”
    groupKey = {ConfigGroupEnum@9238} “RULE”
    timestamp = 1611245183682
    source = {Collections$SingletonList@9239} size = 1(变更数据)

    • onApplicationEvent(final DataChangedEvent event)中调用了WebsocketDataChangedListener.onRuleChanged(final List ruleDataList, final DataEventTypeEnum eventType)方法,在此组装了将会被发送的WebsocketData,并将其转为了jsonString,之后调用前面所说的WebsocketCollector.send(final String message, final DataEventTypeEnum type)方法

      在这里插入图片描述
      在这里插入图片描述

  • SoulWebsocketClient(使用猜测法猜测出来,网关端,接收admin端Websocket消息)

    • SoulWebsocketClient.onMessage(final String result)方法接收了admin端刚刚发送的ruleData消息并处理:

      在这里插入图片描述
      在这里插入图片描述

    • websocketDataHandler.executor(groupEnum, json, eventType)方法:

      在这里插入图片描述
      紧接着调用AbstractDataHandler.handle(final String json, final String eventType)方法

      在这里插入图片描述
      紧接着调用RuleDataHandler.doUpdate(final List dataList)方法

    在这里插入图片描述
    紧接着调用CommonPluginDataSubscriber.onRuleSubscribe(final RuleData ruleData)方法

在这里插入图片描述
紧接着调用BaseDataCache.cacheRuleData(final RuleData ruleData)方法,将admin端发送的数据放入RULE_MAP中

在这里插入图片描述

至此应该完成了数据同步
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值