Soul源码分析--soul-admin数据同步(2)

Soul源码分析--soul-admin数据同步之zookeeper、nacos

  • zookeeper 数据同步
  • nacos 数据同步
  • 总结

在 上一篇文章中分析过 http、websocket 同步的原理,没看过的同学可以去看一看,这篇我们接着来分析 zookeeper、nacos 数据同步的原理,废话不多说,改 admin、bootstrap 相关的 yml 文件,然后启动,当然最重要的如果依赖了第三方工具,也要把第三方工具也启动。

zookeeper 数据同步

  1. 老规矩,先启动 admin 把 zk 对应的 listener 类打上断点,方便调试,这里对应的下图的类,启动时会先执行 run 方法,判断 zk 里面是否有 plugin、auth、metadata 这些数据,如果没有则去把数据同步到 zk 中,先从数据库中把数据查询出来,然后发布对应的事件。如果 zk 中已经存在,就什么都不干
    Soul源码分析--soul-admin数据同步(2)_第1张图片
    初始化打印日志:
    2021-01-29 01:37:40.944  INFO 63954 --- [ain-EventThread] org.I0Itec.zkclient.ZkClient             : zookeeper state changed (Disconnected)
    2021-01-29 01:37:40.949  INFO 63954 --- [           main] org.I0Itec.zkclient.ZkClient             : Waiting for keeper state SyncConnected
    2021-01-29 01:37:42.861  INFO 63954 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181. Will not attempt to authenticate using SASL (unknown error)
    2021-01-29 01:37:42.861  INFO 63954 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Socket connection established, initiating session, client: /0:0:0:0:0:0:0:1:53195, server: localhost/0:0:0:0:0:0:0:1:2181
    2021-01-29 01:37:42.862  INFO 63954 --- [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Session establishment complete on server localhost/0:0:0:0:0:0:0:1:2181, sessionid = 0x1000e847643000b, negotiated timeout = 5000
    2021-01-29 01:37:42.862  INFO 63954 --- [ain-EventThread] org.I0Itec.zkclient.ZkClient             : zookeeper state changed (SyncConnected)
    
  2. 当修改后台选择器规则时,页面点保存会把数据保存到数据库一份,然后发布事件,通知 zookeeper 相关的监听去同步数据到 zookeeper。
    Soul源码分析--soul-admin数据同步(2)_第2张图片
    发布事件的代码如下:
        private void publishEvent(final RuleDO ruleDO, final List ruleConditions) {
            SelectorDO selectorDO = selectorMapper.selectById(ruleDO.getSelectorId());
            PluginDO pluginDO = pluginMapper.selectById(selectorDO.getPluginId());
    
            List conditionDataList =
                    ruleConditions.stream().map(ConditionTransfer.INSTANCE::mapToRuleDTO).collect(Collectors.toList());
            // publish change event.
            eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.RULE, DataEventTypeEnum.UPDATE,
                    Collections.singletonList(RuleDO.transFrom(ruleDO, pluginDO.getName(), conditionDataList))));
    	}
    
    这里发布事件之后,在调试时会发现在 WebsocketDataChangedListener 里面 onRuleChanged 方法会首先被执行,然后再执行 ZookeeperDataChangedListener 的 onRuleChanged 方法。为什么会这样呢,明明配了 zk 相关的配置,websocket 也会去执行。突然想到在之前的一篇文章里,配了 zk 相关的配置,没有把 websocket 配置 enabled 的值为 false,而是直接注释掉了,那这也能解释得通之前为什么会打印出 websocket 相关的日志了。可能是因为 websocket 是默认的同步方式,如果没有显示禁用,还是会用 websocket 先去同步一遍,然后再用相关的配置去同步
    Soul源码分析--soul-admin数据同步(2)_第3张图片
    上图看到是有两个监听收到了响应,然后开始依次调用
    Soul源码分析--soul-admin数据同步(2)_第4张图片
    Soul源码分析--soul-admin数据同步(2)_第5张图片
  3. 如果要避免两次调用的话,修改一下 yml 文章中 websocket 的属性为禁用,就不会出现上面的情况了。修改重启 admin,调试后看到的如下图,果然只有一个了
    Soul源码分析--soul-admin数据同步(2)_第6张图片
  4. 然后启动 bootstrap,启动之后用 zk 进行同步,先准备好同步的配置 ZookeeperSyncDataConfiguration,然后开始从 zk 里面同步数据 ZookeeperSyncDataService 里面的各种 watchXXX方法。
    同步配置文件类
    Soul源码分析--soul-admin数据同步(2)_第7张图片
    同步数据类
    Soul源码分析--soul-admin数据同步(2)_第8张图片
    注意: 这里只是启动时同步一次数据,如果在后台更新数据之后,没有看到 bootstrap 有任何的拉取数据的动作,控制台没有日志打印,前端配置设置为关闭也还是能访问
    在这里插入图片描述
    上面设置为关闭,但是请求还是可以通过网关访问,需要先启动 http 的测试项目,然后访问 http://localhost:9195/http/order/findById?id=2 这个地址,结果还是能访问成功的
    Soul源码分析--soul-admin数据同步(2)_第9张图片
    这个先留着到后面仔细再看看 zk 修改了数据的同步机制

nacos 数据同步

  1. 老规矩,先改 yml 文件中的配置,然后打断点,这里因为会依赖第三方组件 nacos 所以需要去 nacos 官网下载,下载完之后解压,进入 bin 目录,根据自己的系统执行对应的文件( windows 双击执行 .cmd 文件,linux/mac OX 执行 .sh 文件)。
    Soul源码分析--soul-admin数据同步(2)_第10张图片
    因为我用的 mac OX 所以用 ./startup.sh -m standalone 命令执行,这是以单机模式执行,执行成功后显示如下图,然后就可以去把 admin、bootstrap 启动了
  2. 启动了这两个项目之后,断了点的 NacosDataChangedListener 类并没有执行,这时候再去启动 examples-http 项目,好像断点类里面的方法都没有什么反应,在后台修改了下面两个图的配置之后,配置是生效的,看来数据同步地方找错了
    在这里插入图片描述
    Soul源码分析--soul-admin数据同步(2)_第11张图片
    把这个对应的 Url 关闭之后,再访问就访问不通了,说明配置是起做用了,但是数据是怎么同步过去的,这个还得再找找
    Soul源码分析--soul-admin数据同步(2)_第12张图片

总结

你可能感兴趣的:(源码分析,java)