【源码阅读最轻松的方法】之shenyu网关-扩展性优化

相信我们大家碰到源码一开始都是比较无从下手的🙃,不知道从哪开始阅读、阅读了能收获什么。我认为有一种方法,可以解决上面的问题,让我们既知道了从哪开始阅读源码,又能够从阅读源码中获得收获!
那就是通过阅读某一次开源commit 、某一次ISSUE的提出,从这个入口出发,去探索源码!!
通过上面的方法,我们可以从堆砌的源码中脱离开来,如脱缰野马开心地去阅读其中让我们最有兴趣的部分,都说兴趣是最好的老师👩‍🏫,兴趣老师会引导我们走向正确的道路,让我们获取我们需要的收获,最后甚至还会送给你一朵小红花🌹当作奖励🤭。

一、前瞻

那就让我们从这次开源提交开始:commit链接

翻译过来就是

优化同步数据时数据初始化的代码。 如果数据同步需要数据初始化,则实现DataChangedInit.

大致意思就是实现DataChangedInit去优化原先的数据初始化,让我们看看怎么个优化法呢,DataChangedInit是怎么起到作用的!

二、探索

可以看到底层接口DataChangedInit 实现了CommandLineRunner,顾名思义作用是在项目启动时执行。

java 复制代码
public interface DataChangedInit extends CommandLineRunner {

}

让我们先整体看下整个提交所涉及的类。

看下父类的实现。执行的时候判断notExist 方法,若notExist为false的话就执行syncDataService的异步代码 。可以猜到上图的各个子类实现主要就是实现notExist 方法来判断是否使用同步代码 。我们注意下SyncDataService后面需要提及到。

java 复制代码
public abstract class AbstractDataChangedInit implements DataChangedInit {

    /**
     * SyncDataService, sync all data.
     */
    @Resource
    private SyncDataService syncDataService;

    @Override
    public void run(final String... args) throws Exception {
        if (notExist()) {
            syncDataService.syncAll(DataEventTypeEnum.REFRESH);
        }
    }

    /**
     * check exist.
     *
     * @return boolean.
     */
    protected abstract boolean notExist();
}

子类代码:

java 复制代码
public class ZookeeperDataChangedInit extends AbstractDataChangedInit {

    private final ZkClient zkClient;

    /**
     * Instantiates a new Zookeeper data changed init.
     *
     * @param zkClient        the zk client
     */
    public ZookeeperDataChangedInit(final ZkClient zkClient) {
        this.zkClient = zkClient;
    }

    @Override
    protected boolean notExist() {
        return !zkClient.exists(DefaultPathConstants.PLUGIN_PARENT)
                && !zkClient.exists(DefaultPathConstants.APP_AUTH_PARENT)
                && !zkClient.exists(DefaultPathConstants.META_DATA);
    }
}

三、总结

那我们好奇本次优化的点究竟是什么呢,我们看下旧代码的实现 可以找到答案,其实本次优化是为了后续可扩展性,把重复的代码抽象起来 。

可以看到ZooKeeper、Nacos、Concus的数据同步都有重复的入参SyncDataService ,且这3个实现类实现相同的功能竟然没有一个父类来承接。

我们回顾AbstractDataChangedInit提到的SyncDataService ,这步就是一个优化了,把重复的SyncDataService入参抽象到父类AbstractDataChangedInit,同时让实现相关功能的类都有相同的父类DataChangedInit来进行归类。

相关推荐
1360967572310 分钟前
一台 4 核 8G 已经跑了 6 个站点,我是怎么把第 7 个塞进去的
后端
对象存储与RustFS11 分钟前
JuiceFS + 对象存储:把 S3 变成 POSIX 文件系统实测
后端·rust·开源
她的男孩20 分钟前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛21 分钟前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端
yunwei3722 分钟前
eBPF 入门开发实践教程一:Hello World,基本框架和开发流程
linux·后端·性能优化
全栈Agent 小李26 分钟前
【无标题】
前端·后端·agent·ai编程·全栈·cursor·mcp
高频因子挖掘机28 分钟前
历史 K 线突然少一天?用交易日历、停牌信息和数据校验逐步排查
后端·github·api
行者全栈架构师1 小时前
从 55% 到 6%:一个快餐营养规划器的算法迭代实录
后端·算法·架构
余槐i1 小时前
无慢查询 RT 却飙升:cProfile 定位 FastAPI 事件循环阻塞
后端·python·性能优化·fastapi·asyncio
AINative软件工程1 小时前
LLM 应用的 Adaptive Batching 工程实践:动态合批把吞吐提升 3 倍,但延迟的坑你踩过吗
后端·llm·ai编程