Soul 网关源码分析(九)使用 Nacos 同步数据到网关

Nacos 是一款发现、配置和微服务管理工具。它提供了一组简单易用的特性集,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。

安装启动好 Nacos 后,修改对应的 soul-admin 和 soul-bootstrap 中的配置:

soul:
    file:
      enabled: true
    corss:
      enabled: true
    dubbo :
      parameter: multi
    sync:
#        websocket :
#             urls: ws://localhost:9095/websocket
      nacos:
        url: localhost:8848
        namespace: 1c10d748-af86-43b9-8265-75f487d20c6c

在 soul-bootstrap 的 pom.xml 中加入依赖:

<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-sync-data-nacos</artifactId>
    <version>${project.version}</version>
</dependency>

启动 soul-admin 和 soul-bootstrap,发现 soul-bootstrap 无法启动,原因是在 NacosCacheHandler 类中,以下代码处:

protected void updateMetaDataMap(final String configInfo) {
    try {
    	//这里会抛出 NullPointerException ,因为暂时没有实现 Nacos 的数据初始化。
        List<MetaData> metaDataList = new ArrayList<>(GsonUtils.getInstance().toObjectMap(configInfo, MetaData.class).values());
        metaDataList.forEach(metaData -> metaDataSubscribers.forEach(subscriber -> {
            subscriber.unSubscribe(metaData);
            subscriber.onSubscribe(metaData);
        }));
    } catch (JsonParseException e) {
        log.error("sync meta data have error:", e);
    }
}

只能在 Nacos 后台手动添加初始化数据,需要分别添加 元数据 和 认证的数据。详细的解决办法可以参考 soul 网关入门篇(七):数据同步方式- nacos 配置

2021-01-24 02:15:31.175 INFO 90111 --- [ main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data......
看到这个代表已经成功使用 Nacos 同步数据了。

看一下 Nacos 的管理端情况,发现并没有数据,但是在 NacosDataChangedListener 打断点后点击同步数据的话,是能进到 对应的函数的:

由于缺乏对 Nacos 的认知,我决定暂时蒙在鼓里。

Nacos 同步配置信息的逻辑非常简单,就是运用了 Nacos 中的 ConfigService:

//从Nacos配置服务获取配置
@SneakyThrows
private String getConfig(final String dataId) {
    String config = configService.getConfig(dataId, GROUP, 6000);
    return StringUtils.hasLength(config) ? config : EMPTY_CONFIG_DEFAULT_VALUE;
}

//发布数据到Nacos配置服务
@SneakyThrows
private void publishConfig(final String dataId, final Object data) {
    configService.publishConfig(dataId, GROUP, GsonUtils.getInstance().toJson(data));
}

在 Nacos 管理端添加对应的 namespace,对应soul-admin 和 soul-bootstrap 配置中的 namespace:

再次查看配置管理,发现已经有了对应的配置数据json了。

总结

Nacos 有个独立的配置管理服务 ConfigService,如果要了解为什么在 Nacos 后台中看不到任何数据和节点,还需要深入了解 Nacos 配置服务的实现原理才行。用 Nacos 做数据同步跟Zookeeper 是同样的问题,需要维护额外的中间件造成维护成本的提升。

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页