Soul API网关源码解析10-数据同步篇

目标

  • Nacos简单介绍

    • Nacos 关键特性
    • Nacos 服务搭建启动
  • soul-admin nacos配置启动

    • 添加Soul-Nacos依赖
    • 修改yml配置文件
    • 启动admin会看到Nacos网页上有四个数据
    • 介绍Nacos在Admin启动流程
    • DataSyncConfiguration初始化NacosBean
  • admin数据发生变动发布流程

  • 总结

Nacos简单介绍

image.png

上图从特性、架构、业务、生态、优势、战略等六个方面介绍了Nacos的核心功能

  • Nacos(Dynamic Naming and Configuration Service):从全称我们看得出来他是动态命令和配置服务,是Spring Cloud Alibaba的一个组件。
  • Nacos数据模型Key由三元组唯一确定,Namespace默认是空串,公共命名空间(public),分组默认是DEFAUTL_GROUP
  • Nacos致力于帮助我们发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助我们快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos关键特性

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及其元数据管理

Nacos服务搭建启动

  • Nacos server 下载二进制文件
image.png
  • 解压执行
image.png
  • 启动成功
image.png

Nacos 服务默认端口是8848,我们登陆localhost:8848/nacos 即可访问官方后台管理

  • 登陆后台查看
image.png

后面我们启动admin/bootstrap 就可以看到有数据注册上来

Soul-Admin的Nacos配置启动

添加Soul-Nacos依赖


    com.alibaba.nacos
    nacos-client
    ${nacos-client.version}

修改yml配置文件

image.png

此处Soul默认只使用一种数据同步方式,所以将其他三种同步方式注释掉。只打开Nacos配置

启动admin会看到Nacos网页上有四个数据

image.png

注意点: 默认Nacos 是不会自动创建命名空间的,有些同学以为网页上看不到数据,就以为数据同步不起作用。经过测试这其实是Nacos展示这块没有根据发布数据来自动显示。如何做才能看到上图样子呢。

只需要点击命名空间,创建你配置文件配置的namespace的名称即可,本文namespace是1c10d748-af86-43b9-8265-75f487d20c6c。所以本文建立的命令为

image.png

介绍Nacos 在Admin启动流程

DataSyncConfiguration 初始化NacosBean

  • 初始化DataChangedListener 数据监听器
image.png

这里只是初始化Nacos客户端和监听数据监听器

  • 检查是否对Nacos数据进行上报
image.png

这里之前未做检查,其实我觉得没必要做检查,毕竟Nacos是全量更新,就算一开始拿不到数据,在后期数据变更时候,可以做一次全量更新。

admin 数据发生变动发布流程

@Override
public void onPluginChanged(final List changed, final DataEventTypeEnum eventType) {
// 这里进来先获取Nacos对应的数据,是考虑到多个admin,adminA 改了 adminB如何取到A改的值,这里就在adminB未重启的情况下,只要发生变化,就会重新拉取Nacos 的数据,来保证admin之间的数据同步
    updatePluginMap(getConfig(NacosPathConstants.PLUGIN_DATA_ID));
    switch (eventType) {
        case DELETE:
            changed.forEach(plugin -> PLUGIN_MAP.remove(plugin.getName()));
            break;
        case REFRESH:
        case MYSELF:
            Set set = new HashSet<>(PLUGIN_MAP.keySet());
            changed.forEach(plugin -> {
                set.remove(plugin.getName());
                PLUGIN_MAP.put(plugin.getName(), plugin);
            });
            PLUGIN_MAP.keySet().removeAll(set);
            break;
        default:
            changed.forEach(plugin -> PLUGIN_MAP.put(plugin.getName(), plugin));
            break;
    }
    publishConfig(NacosPathConstants.PLUGIN_DATA_ID, PLUGIN_MAP);
}

总结

今天收获很大,由原来的的单机编程想法往集群方向的开发突破,Nacos 在集群环境下,admin端是如何知道A改了数据B端如何知道。使用Nacos 作为中间媒介,并且对应端数据发生变化先获取媒介上当前最新数据,然后在获取自己关心的数据,进行发布更新。

参考

soul github
soul document

你可能感兴趣的:(Soul API网关源码解析10-数据同步篇)