soul 网关入门篇(八):数据同步方式之 nacos

初识 Nacos

Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施,
能快速实现动态服务发现、服务配置、服务元数据及流量管理,是 alibaba 开源注册中心中间件。

nacos地图

数据流程

了解了 nacos 的基本概念之后,我们继续昨天的话题,昨天配置 nacos 的数据同步方式时,出现了一个 bug。虽然后面利用配置好的各种数据,按同步按钮还是能启动的。但是这么做就不是那么的完美。那我们今天来 Debug 一下他的一个流程。

soul-admin 端

我们将断点打在 DataChangedEventDispatcher#afterPropertiesSet 的方法下,启动 admin, 发现断点是可以到这里的。

nacos 同步

执行完后启动成功,请注意这里是没有初始化 nacos 步骤的,这几天应该会把这个优化掉,因为 zookeeper 是有 初始化这个步骤的。

当断点打在 DataChangedEventDispatcher#onApplicationEvent 的 plugin case 时, 点击 admin 后台 System Manage > Plugin > Synchronized All Data 时,出现了以下情况,说明已经成功这步。

plugin

查看 nacos 的后台,soul.plugin.json, soul.auth.json, soul.selector.json, soul.rule.json, soul.meta.json 这些 data-id 是否都存在。如果都存在,说明到 nacos 的数据同步已经完成。
同步数据到 nacos 大致流程如下:

同步到nacos

bootstrap 端

根据启动 bootstrap,我们在命令行终端查看到

2021-01-23 07:31:01.211  INFO 13161 --- [           main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data.......

全文检索日志得知,NacosSyncDataConfiguration 会在启动时注册3个 bean,

  • NacosSyncDataService : Nacos 数据同步的服务
    查看他的构造函数: NacosSyncDataService :
public NacosSyncDataService(final ConfigService configService, final PluginDataSubscriber pluginDataSubscriber,
                                final List metaDataSubscribers, final List authDataSubscribers) {

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

start() 会去更新 updatePluginMap,这时 pluginDataSubscriber 会重新订阅这条插件数据,然后更新缓存

  • ConfigService: Nacos config service
  • NacosConfig : nacos 的配置

然后我在更新一条数据,start() 中的 watcherData() ,会监听到配置的改变,

protected void watcherData(final String dataId, final OnChange oc) {
        Listener listener = new Listener() {
            @Override
            public void receiveConfigInfo(final String configInfo) {
                oc.change(configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        };
        oc.change(getConfigAndSignListener(dataId, listener));
        LISTENERS.getOrDefault(dataId, new ArrayList<>()).add(listener);
    }

然后进行数据的改变。大致的流程图如下:


nacos 同步到网关

你可能感兴趣的:(soul 网关入门篇(八):数据同步方式之 nacos)