Soul網關的探活--基于zookeeper同步資料的決議
Soul網關的探活,主要分為兩部分,第一部分是soul admin探活,一部分是soul-admin同步資料到網關層soul-boostrap,本文以一個http客戶端宕機之后的探活為例
Soul-admin探活
Soul-admin 探活這部分主要是依賴soul-admin中的UpstreamCheckService來實作的,
/**
* Setup selectors of divide plugin.
*/
@PostConstruct
public void setup() {
PluginDO pluginDO = pluginMapper.selectByName(PluginEnum.DIVIDE.getName());
if (pluginDO != null) {
List<SelectorDO> selectorDOList = selectorMapper.findByPluginId(pluginDO.getId());
for (SelectorDO selectorDO : selectorDOList) {
List<DivideUpstream> divideUpstreams = GsonUtils.getInstance().fromList(selectorDO.getHandle(), DivideUpstream.class);
if (CollectionUtils.isNotEmpty(divideUpstreams)) {
UPSTREAM_MAP.put(selectorDO.getName(), divideUpstreams);
}
}
}
if (check) {
new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), SoulThreadFactory.create("scheduled-upstream-task", false))
.scheduleWithFixedDelay(this::scheduled, 10, scheduledTime, TimeUnit.SECONDS);
}
}
基于Spring的注解和執行緒池實作了,從程式開始每隔十秒探活的機制,探活的主要實作是UpstreamCheckUtils.checkUrl方法中實作了,確定了最終是否可達或者可以連接,而最終將訊息探活,傳遞到網關端是通過前文說過多次的Spring的事件機制完成的
eventPublisher.publishEvent(new DataChangedEvent(ConfigGroupEnum.SELECTOR, DataEventTypeEnum.UPDATE,
Collections.singletonList(selectorData)));
可以看到這里的選擇選擇器按鈕,由于這里使用的是zookeeper同步

最終我們執行的是ZookeeperDataChangedListener的onSelectorChanged方法
網關SoulBoostrap獲取資料進行處理
在ZookeeperSyncDataConfiguration中直接加載了ZookeeperSyncDataService類,并且在構造方法中就利用了ZKclient能夠監聽屬性改變的特性
最后使用的是
private void subscribeSelectorDataChanges(final String path) {
zkClient.subscribeDataChanges(path, new IZkDataListener() {
@Override
public void handleDataChange(final String dataPath, final Object data) {
cacheSelectorData((SelectorData) data);
}
@Override
public void handleDataDeleted(final String dataPath) {
unCacheSelectorData(dataPath);
}
});
}
來更新網關中的選擇器資料,最后使用的是CommonPluginDataSubscriber中的subscribeDataHandler方法,這個方法在SoulConfiguration中就利用ObjectProvider獲取到了ObjectProvider<List
歡迎搜索關注本人與朋友共同開發的微信面經小程式【大廠面試助手】和公眾號【微瞰技術】,以及總結的分類面試題https://github.com/zhendiao/JavaInterview


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/252928.html
標籤:其他
上一篇:GO 語言入門(一)
