Soul網關的探活--基於zookeeper同步數據的解析

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同步
file
最終我們執行的是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> pluginDataHandlerList 來進行選擇器的修改 最後執行的是DividePluginDataHandler插件處理類中的removeSelector來清除緩存的活數據

歡迎搜索關注本人與朋友共同開發的微信面經小程序【大廠面試助手】和公衆號【微瞰技術】,以及總結的分類面試題https://github.com/zhendiao/JavaInterview

file
file

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章