Soul源码总结-01-21

  • 启动admin,与网关。 admin操作,使用zookeeper同步数据到网关
  • 记录心得并总结

Soul admin与Soul网关的zookeeper同步

Demo

首先在本地用docker-compose启动zookeeper集群,启动三个zookeeper,并查看相关信息:

CONTAINER ID   IMAGE       COMMAND                  CREATED      STATUS      PORTS                                                  NAMES
a4c148f7d8c3   zookeeper   "/docker-entrypoint.…"   3 days ago   Up 2 days   2888/tcp, 3888/tcp, 8080/tcp, 0.0.0.0:2182->2181/tcp   zookeeper_zoo2_1
7aa0c0ad6a43   zookeeper   "/docker-entrypoint.…"   3 days ago   Up 2 days   2888/tcp, 3888/tcp, 8080/tcp, 0.0.0.0:2183->2181/tcp   zookeeper_zoo3_1
d2fc9b0c8b41   zookeeper   "/docker-entrypoint.…"   3 days ago   Up 2 days   2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp, 8080/tcp   zookeeper_zoo1_1

soul-admin项目和soul-bootstrapapplication.yml文件中引入与zookeeper相关的dataSync策略:

soul:
  sync:
    zookeeper:
      enabled: true
      url: localhost:2181
      sessionTimeout: 5000
      connectionTimeout: 2000

此时同时启动soul-adminsoul-bootstrap项目, 在控制台可以看到在这里插入图片描述
同时通过docker exec -it zookeeper_zoo1_1 zkCli.sh与一个zookeeper node进行交互

[zk: localhost:2181(CONNECTED) 27] ls /
[soul, zookeeper]

说明soul网关已经通过zookeeper与soul网关同步。

源码追踪

Soul-bootstrap

首先我们先关注soul网关服务,在ZookeeperSyncDataConfiguration类中在项目启动时将zookeeperSyncDataService的bean注入到ioc容器中在这里插入图片描述
此时需要注意的是在注册这个bean之前需要依赖名字为ZookeeperConfigZkClient的bean,该bean的注册需要读取application-local.yml文件中相关zookeeper的配置, ZookeeperConfig的数据结构如下:
在这里插入图片描述
在这里插入图片描述
我们追踪进入ZookeeperSyncDataService类中查看,和WebSocketSyncDataService一样,该类实现了SyncDataService接口,并且通过zookeeper的watch机制,zkClient会监听注册到zookeeper相关的插件信息,Selector信息以及相关的rule。关键代码如下:
在这里插入图片描述
ZookeeperSyncDataService一经初始化就开始启动对pluginName, Selector和rule的监听 。当数据发生变更时,会对zookeeper 的节点做增量更新 ,并更新本地缓存。相关代码如下:
在这里插入图片描述

Soul-admin

同样相似的在soul-admin项目下的DataSyncConfiguration类中将ZookeeperDataChangedListenerbean注入到ioc容器中:在这里插入图片描述
我们追踪进入ZookeeperDataChangedListener中可以看到对相关plugin, selector, rule, auth等数据的更新监听的逻辑处理:
在这里插入图片描述
其本质仍然是通过zkClient对zookeeper集群进行创建监听节点,更新监听节点数据,删除监听节点数据的操作完成。
在这里插入图片描述

总结

websocket和zookeeper作为soul-admin和soul网关之间的同步方式,在整体处理逻辑上相差不大。但zookeeper作为第三方插件的引入给系统增加了一层复杂度以及增加了额外依赖。因此默认推荐使用websocket作为两者之间的同步方式。

猜你喜欢

转载自blog.csdn.net/qq_42965594/article/details/112976279