Soul源码分析--soul-admin数据同步之websocket、http
之前写过一篇 Soul源码分析–soul-admin源码分析 里面介绍了数据同步的方式和数据同步的种类,现在来深入分析一下各种数据同步的原理,包括 websocket、http、zookeeper、nacos 数据同步。这里我们先可以参考 官网的文档,大概看一下原理,然后根据代码来分析。
这一篇只会分析 websocket、http,下篇会分析 zookeeper、nacos,点这里查看 下一篇 。
webosocket 数据同步
- 启动 soul-admin 项目时,会根据数据源加载相应的数据,这里用 mysql 数据源为例,启动会执行 init 包下面的 LocalDataSourceLoader 类的方法,判断 bean 是否是数据源且初始化设置是否为 true,然后会执行相应初始化数据的方法,控制台会打印相应执行的 sql 文件名称(这里要注意的是,每次都会去执行初始化,所以如果用在生产上的话,应该把 initEnable 这个属性在第一次执行完之后,设置成 false)。
private void execute(final Connection conn) throws Exception {
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(null);
Resources.setCharset(StandardCharsets.UTF_8);
Reader read = Resources.getResourceAsReader(dataBaseProperties.getInitScript());
log.info("execute soul schema sql: {}", dataBaseProperties.getInitScript());
runner.runScript(read);
runner.closeConnection();
conn.close();
}
- 如果在网关后台选择器配置中配置了一个没启动服务的地址,点保存后,后台会去执行检查,如果没找到相应的服务,这个配置则不生效。
点保存后,控制台打出来的日志,可以看出来,检查地址失败了(不知道什么原因,日志这里打了断点没能进去调度)。
再去看看页面刚刚加的配置,也被清空了。
如果配置的地址不对,后台会有线程去检查这个地址,如果地址不对,再刷新一遍数据,这也是为什么 Soul-WebSocketClient 里面的这段代码会执行两次
private void handleResult(final String result) {
WebsocketData websocketData = GsonUtils.getInstance().fromJson(result, WebsocketData.class);
ConfigGroupEnum groupEnum = ConfigGroupEnum.acquireByName(websocketData.getGroupType());
String eventType = websocketData.getEventType();
String json = GsonUtils.getInstance().toJson(websocketData.getData());
websocketDataHandler.executor(groupEnum, json, eventType);
}
- 注意:如果只用 websocket 或者 http 同步数据,在 bootstrap 项目里面需要把下面这个 maven 依赖给注释掉
因为这里面会疯狂的连接 zookeeper ,为了测试方便,先把这个注释掉