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

相信我们大家碰到源码一开始都是比较无从下手的🙃,不知道从哪开始阅读、阅读了能收获什么。我认为有一种方法,可以解决上面的问题!

那就是通过阅读某一次开源的【commit】、某一次社区的【ISSUE】,从这个入口出发,去探索源码!!

至此,我们可以从堆砌的源码中脱离开来,如脱缰野马开心地去阅读让我们最有兴趣的部分,都说兴趣是最好的老师👩‍🏫,兴趣老师会引导我们走向正确的道路去获取我们所需的!最后甚至还会送给你一朵小红花🌹当作奖励🤭。

一、前瞻

那就让我们从这次开源提交开始:commit链接
在这里插入图片描述

翻译过来就是

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

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

二、探索

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

public interface DataChangedInit extends CommandLineRunner {

}

让我们先整体看下整个提交所涉及的类。
在这里插入图片描述

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

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();
}

子类代码:

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来进行归类。

shenyu网关是一款开源的API网关软件,它可以帮助开发者实现对接口的统一管理和流量控制。shenyu网关提供了多种功能,包括请求转发、请求过滤、流量限制、负载均衡等,帮助用户实现高可用和高稳定性的系统架构。 shenyu网关基于Java开发,使用简单方便,支持多种开源框架和中间件,如Spring Boot、Dubbo、Motan等。通过使用shenyu网关,开发者可以快速搭建起一个完善的微服务架构,可以轻松地管理和监控各个微服务之间的通信和流量。 另外,shenyu网关还提供了可视化的管理界面,方便用户进行参数配置、资源管理、性能监控等操作。用户可以通过该界面对各个服务进行细粒度的管理,实现功能的灵活配置和动态调整。 码云是中国最大的代码托管平台,类似于国外的GitHub。用户可以通过码云托管自己的代码仓库,并利用这个平台进行团队协作和项目管理。码云提供了Git版本控制、代码托管、代码审查等功能,支持多种开发语言和开发工具。 与GitHub不同的是,码云在国内具有更好的访问速度和稳定性,同时还提供了国内常用的Git代码托管服务,支持国内的开发者更方便地使用和访问。用户可以在码云上创建自己的项目仓库,与其他开发者进行交流学习,并共同进行开发和维护。 综上所述,shenyu网关和码云都是开发者常用的工具。shenyu网关可以帮助开发者实现API网关的功能,提供统一的接口管理和流量控制;码云则是代码托管平台,提供代码的版本控制和团队协作功能。两者的结合可以帮助开发者更好地进行微服务架构的开发和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值