- 启动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-bootstrap
的application.yml
文件中引入与zookeeper相关的dataSync
策略:
soul:
sync:
zookeeper:
enabled: true
url: localhost:2181
sessionTimeout: 5000
connectionTimeout: 2000
此时同时启动soul-admin
和soul-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之前需要依赖名字为ZookeeperConfig
和ZkClient
的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
类中将ZookeeperDataChangedListener
bean注入到ioc容器中:
我们追踪进入ZookeeperDataChangedListener
中可以看到对相关plugin, selector, rule, auth等数据的更新监听的逻辑处理:
其本质仍然是通过zkClient
对zookeeper集群进行创建监听节点,更新监听节点数据,删除监听节点数据的操作完成。
总结
websocket和zookeeper作为soul-admin和soul网关之间的同步方式,在整体处理逻辑上相差不大。但zookeeper作为第三方插件的引入给系统增加了一层复杂度以及增加了额外依赖。因此默认推荐使用websocket作为两者之间的同步方式。