Soul網關的探活,主要分爲兩部分,第一部分是soul admin探活。一部分是soul-admin同步數據到網關層soul-boostrap。本文以一個http客戶端宕機以後的探活爲例git
Soul-admin 探活這部分主要是依賴soul-admin中的UpstreamCheckService來實現的。github
/** * 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方法小程序
在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/JavaInterviewapp