1.admin register处理过程
以上文http为例:处理方法为:registerSpringMvc
@PostMapping("/springmvc-register")
public String registerSpringMvc(@RequestBody final SpringMvcRegisterDTO springMvcRegisterDTO) {
return soulClientRegisterService.registerSpringMvc(springMvcRegisterDTO);
}
调用了:soulClientRegisterService.registerSpringMvc
@Override
@Transactional
public String registerSpringMvc(final SpringMvcRegisterDTO dto) {
if (dto.isRegisterMetaData()) {
MetaDataDO exist = metaDataMapper.findByPath(dto.getPath());
if (Objects.isNull(exist)) {
saveSpringMvcMetaData(dto);
}
}
String selectorId = handlerSpringMvcSelector(dto);
handlerSpringMvcRule(selectorId, dto);
return SoulResultMessage.SUCCESS;
}
第一眼看上去:大概都可以知道做了哪些处理:但是我们还是一步步分析:
先看: String selectorId = handlerSpringMvcSelector(dto);
1.1 handlerSpringMvcSelector逻辑分析
(1)以contextPath(/http)为条件查询(那如果是多个根路径相同的服务?)
(2)假如该根路径从未注册过,就会调用registerSelector(contextPath, dto.getRpcType(), dto.getAppName(), uri)(推断这边会写表,先不深入)r
(3)selectorService.buildByName(contextPath) 实质调用 buildSelectorData(selectorDO)返回的是SelectorData对象:获取条件Array(ConditionData);插件PluginDO 根据插件Id,如果插件Id为空,则返回Null;
(4)handle可知每次新添加一台机器=进来会数组中添加一个机器的infomation?(后面验证)
(5)发布DataEventTypeEnum.UPDATE类型的事件;(问题:在哪里去处理这个事件?)
至此,就分析完毕!
接下来看这个函数: handlerSpringMvcRule(selectorId, dto)
其实这个函数很简单做了一些增删改查的操作。
到此注册函数分析结束;
那么现在看:在handlerSpringMvcSelector中的推断是否正确
注册第一台服务时:handle为:[{"upstreamHost":"localhost","protocol":"http://","upstreamUrl":"172.16.223.0:8188","weight":50,"status":true,"timestamp":0,"warmup":0}]
加一个服务端口8186这个数据
[{"upstreamHost":"localhost","protocol":"http://","upstreamUrl":"172.16.223.0:8188","weight":50,"status":true,"timestamp":0,"warmup":0},{"upstreamHost":"localhost","protocol":"http://","upstreamUrl":"172.16.223.0:8186","weight":50,"status":true,"timestamp":0,"warmup":0}]
页面的/http数据也是来源于handle
说明:推断成立!
发布事件:采用的是:ApplicationEventPublisher来发布自定义事件:
我们可以找到DataChangedEventDispatcher;Dispatcher命名一般来说是分发器(那么翻译为数据变更分发器)
在这里使用的WebsocketDataChangedListener的listener;然后根据event进行分类:我本次是:
listener.onSelectorChanged((List<SelectorData>) event.getSource(), event.getEventType());
我们继续看:WebsocketDataChangedListener的onSelectorChanged的实现做了哪些操作;
@Override
public void onSelectorChanged(final List<SelectorData> selectorDataList, final DataEventTypeEnum eventType) {
WebsocketData<SelectorData> websocketData =
new WebsocketData<>(ConfigGroupEnum.SELECTOR.name(), eventType.name(), selectorDataList);
WebsocketCollector.send(GsonUtils.getInstance().toJson(websocketData), eventType);
}
使用websocket发送数据:
public static void send(final String message, final DataEventTypeEnum type) {
if (StringUtils.isNotBlank(message)) {
if (DataEventTypeEnum.MYSELF == type) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.error("websocket send result is exception: ", e);
}
return;
}
for (Session session : SESSION_SET) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
log.error("websocket send result is exception: ", e);
}
}
}
}
发现其实到这一步完成了数据同步;通过源码发现Soul支持多种同步方式,那么到现在我们的框图如下:
websocket同步沿红色的线
下一步:
插件的加载分析
其他方式的Data Sync
enjoy soul