网站空间上传教程,珠海响应式网站制作,杭州尚层别墅装饰公司,河北省建设厅网站手机版ShenYu是一个异步的#xff0c;高性能的#xff0c;跨语言的#xff0c;响应式的 API 网关。有关ShenYu的介绍可以戳这。 一、前瞻
今天我们尝试不同的代码阅读方式#xff0c;按模块来去阅读源码#xff0c;看看效果如何。
本次阅读锁定在shenyu-loadbalancer#xf… ShenYu是一个异步的高性能的跨语言的响应式的 API 网关。有关ShenYu的介绍可以戳这。 一、前瞻
今天我们尝试不同的代码阅读方式按模块来去阅读源码看看效果如何。
本次阅读锁定在shenyu-loadbalancer根据模块名可以了解这个模块主要作用就是负载均衡。
我们可以根据这个模块的组织机构来思考本次的阅读线索
整个模块为ShenYu提供了什么功能我们很好奇负载均衡的cache缓存有什么作用spi的作用是什么
二、探索
那开始我们今天的模块阅读。
看起来factory就是这个模块的核心了作为工厂来生产核心对象我们就从这个工厂开始阅读。
public final class LoadBalancerFactory {private LoadBalancerFactory() {}/*** Selector upstream.** param upstreamList the upstream list* param algorithm the loadBalance algorithm* param ip the ip* return the upstream*/public static Upstream selector(final ListUpstream upstreamList, final String algorithm, final String ip) {LoadBalancer loadBalance ExtensionLoader.getExtensionLoader(LoadBalancer.class).getJoin(algorithm);return loadBalance.select(upstreamList, ip);}
}很明显LoadBalancerFactory是作为外部的调用中心那LoadBalancerFactory又是调用了内部的什么模块去返回我们接着往下看。
SPI
public interface LoadBalancer {/*** this is select one for upstream list.** param upstreamList upstream list* param ip ip* return upstream*/Upstream select(ListUpstream upstreamList, String ip);
}可以看到通过select方法进行调用内部方法。
我们可以看下这个接口类的类图看下调用的最终实现者是什么对象。 类图很清晰地告诉我们最终实现者共有6个子类对象也就是说每个子类对象都是不同的负载均衡算法实现。
大家有没看到类图最上面的底层接口SPI和模块里的spi文件夹是相对应的spi的作用就是存储各种负载均衡算法的实现。那我们就解决了我们的阅读线索3。 spi的作用是什么 我们继续探索看看阅读线索2的答案 负载均衡的cache缓存有什么作用 查询代码发现缓存对象是UPSTREAM_MAP但很奇怪这个核心的缓存对象只有删除、设置的引用却没有使用的逻辑。
通过Git的历史查询发现这个缓存对象被废弃了最新版本的核心缓存对象应该是下面这两个 private final MapString, ListUpstream healthyUpstream Maps.newConcurrentMap();private final MapString, ListUpstream unhealthyUpstream Maps.newConcurrentMap();找到了核心缓存对象我们就来看看这个cache对象的作用究竟是什么。
我们看看调用缓存的对应方法。 Upstream流从shenyu-loadbalancer取出需要负载均衡时把该缓存传入。也就是说这个模块的cache充当了存储所有Upstream流的作用。
到这我们就解决了阅读线索2的问题了。
三、总结
而阅读线索3也显而易见整个模块为ShenYu提供了什么功能。我们可以看下上文我们提到的工厂对象。
public final class LoadBalancerFactory {private LoadBalancerFactory() {}/*** Selector upstream.** param upstreamList the upstream list* param algorithm the loadBalance algorithm* param ip the ip* return the upstream*/public static Upstream selector(final ListUpstream upstreamList, final String algorithm, final String ip) {LoadBalancer loadBalance ExtensionLoader.getExtensionLoader(LoadBalancer.class).getJoin(algorithm);return loadBalance.select(upstreamList, ip);}
}核心方法很清晰我们传入Upsteam列表通过这个模块的负载均衡算法负载均衡地返回其中一个对象。
这也就是这个模块提供的功能。
未完待续。。。
好了今天的分享就到这。大家能否感受到通过按模块这种方式来阅读源码的乐趣呢 创作不易不妨点赞、收藏、关注支持一下各位的支持就是我创作的最大动力❤️