Soul源码解析(8)-nacos数据同步原理

一、目的

使用nacos同步数据到Soul网关并了解其运作原理

二、内容

背景:Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。

websocket数据同步流程

zookeeper数据同步流程

soul-admin 在启动的时候,会将数据全量写入 nacos,后续数据发生变更时,会增量更新 到nacos 。而启动的时候会从nacos中读取全量数据保存到本地并开启监听nacos中数据的变化。一旦soul-admin中数据有变化并更新到nacos中,soul-web即可收到nacos通知然后把变化的数据刷新到本地缓存。

在本地启动一个Nacos服务

Soul源码解析(8)-nacos数据同步原理_第1张图片

然后可以用nacos/nacos登录控制台

http://192.168.31.103:8848/nacos/index.html#/login

同样的,修改soul-admin和soul-bootstrap里面的配置文件,并依次重启服务

Soul源码解析(8)-nacos数据同步原理_第2张图片

Soul源码解析(8)-nacos数据同步原理_第3张图片

NacosSyncDataService继承了NacosCacheHandler,实现了AutoCloseable和SyncDataService。作用就是在构造方法中调用start方法从nacos中读取全量数据并增添监听器监听数据变化并通知订阅者缓存和刷新数据。

//初始化一个新的Nacos同步数据服务,调用start()方法
public NacosSyncDataService(final ConfigService configService, final PluginDataSubscriber pluginDataSubscriber,
                                final List<MetaDataSubscriber> metaDataSubscribers, final List<AuthDataSubscriber> authDataSubscribers) {
     

        super(configService, pluginDataSubscriber, metaDataSubscribers, authDataSubscribers);
        start();
    }

start()方法如下:

//从nacos中读取全量数据并增添监听器监听数据变化并通知订阅者缓存和刷新数据
public void start() {
     
        watcherData(PLUGIN_DATA_ID, this::updatePluginMap);
        watcherData(SELECTOR_DATA_ID, this::updateSelectorMap);
        watcherData(RULE_DATA_ID, this::updateRuleMap);
        watcherData(META_DATA_ID, this::updateMetaDataMap);
        watcherData(AUTH_DATA_ID, this::updateAuthMap);
    }

主要业务是在NacosCacheHandler中处理的,接下来主要看这个类。

watcherData负责添加监听器。并注册收到通知时候执行OnChange接口的change方法。具体就是在change方法中调用updatePluginMap、updateSelectorMap、updateRuleMap、updateMetaDataMap、updateAuthMap。具体操作就是通知订阅者先删除本地数据,再缓存新数据。

以updateSelectorMap为例

protected void updateSelectorMap(final String configInfo) {
     
        try {
     
            List<SelectorData> selectorDataList = GsonUtils.getInstance().toObjectMapList(configInfo, SelectorData.class).values().stream().flatMap(Collection::stream).collect(Collectors.toList());
            selectorDataList.forEach(selectorData -> Optional.ofNullable(pluginDataSubscriber).ifPresent(subscriber -> {
     
                subscriber.unSelectorSubscribe(selectorData);
                subscriber.onSelectorSubscribe(selectorData);
            }));
        } catch (JsonParseException e) {
     
            log.error("sync selector data have error:", e);
        }
    }

三、总结

至于对nacos的操作全是通过nacos里面的ConfigService进行。nacos这个监听机制是通过http长轮询的方式。

你可能感兴趣的:(Soul网关,java,网关,websocket,zookeeper)