# 《RPC手撸专栏》第51章:基于SPI扩展增强型加权随机算法负载均衡策略

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

大家好,我是冰河~~

在前面的章节中,我们基于SPI扩展了JDK、Json、Hessian2、FST、Kryo和Protostuff序列化与反序列化机制,在服务消费者端基于SPI扩展了JDK、CGLib、Javassist、ByteBuddy和ASM动态代理机制。在服务提供者端,基于SPI扩展了JDK、CGLib、Javassist、ByteBuddy和ASM反射机制调用真实方法的功能。

# 一、前言

我现在已经基于SPI扩展实现了九种算法的负载均衡策略了,还要扩展吗?!

在前面的文章中,我们一起实现了基于SPI扩展随机算法、加权随机算法、轮询算法、加权轮询算法、Hash算法、加权Hash算法、基于源IP地址Hash算法、基于源IP地址加权Hash算法和基于Zookeeper的一致性Hash算法负载均衡策略,服务消费者可以根据这些算法实现的负载均衡策略,从多个服务提供者中选择一个,与其进行连接从而实现数据交互。

以上负载均衡策略都是基于最基本的算法实现的,并且在前面的文章中,已经说明后续会实现增强型XXX算法的负载均衡策略。所以,从本章开始,我们就一起实现一些增强型的负载均衡算法,这些算法其实也非常简单,更多的是根据服务提供者的权重来实现负载均衡。小伙伴们跟紧了,别掉队。

# 二、目标

目标很明确:基于SPI扩展增强型加权随机算法负载均衡策略!

什么是增强型加权随机算法的负载均衡策略呢?看到这个概念的时候,小伙伴们不要慌,这只是冰河个人为它起的名字而已,叫它增强型XXXX负载均衡策略,只是跟之前实现的负载均衡策略区分开而已,没啥特殊的地方。

接下来,实现的几种负载均衡策略中,主要是根据服务提供者的权重来实现相应的负载均衡算法,服务提供者的权重越大,则通过负载均衡算法被选中的概率越大。

举个简单的例子:例如,现在有服务A和服务B两个服务提供者实例,服务A的权重是1,服务B的权重是2,则理论上服务B被选中的概率是服务A的2倍。

接下来,我们就一起来实现基于SPI扩展增强型加权随机算法的负载均衡策略。

# 三、设计

如果让你设计基于SPI扩展增强型加权随机算法的负载均衡策略,你会怎么设计呢?

基于SPI扩展增强型加权随机算法的负载均衡策略的流程如图51-1所示。

图51-1

由图51-1可以看出如下信息:

(1)服务提供者会通过自定义类扫描器整合注册中心,将服务注册到注册中心。

(2)服务注册到注册中心的元数据,例如服务的名称、服务的版本号、服务地址、服务端口和服务分组等信息,元数据会贯穿整个服务的注册与发现流程。

(3)服务注册与发现接口对外提供服务注册与发现的方法,服务提供者通过自定义扫描器会调用服务注册与发现接口的方法实现服务注册功能。

(4)基于服务注册与发现的接口,服务提供者会实现多个服务注册与发现的实现类,每个实现类对应着一种注册中心服务。

(5)服务消费者会通过服务注册与发现接口订阅注册中心的服务,会从注册中心获取到服务提供者发布的服务信息,实现服务发现的功能。

(7)服务消费者从注册中心获取到服务提供者发布的服务信息后,会基于SPI机制动态加载普通算法(我们将第42章~第50章实现的负载均衡算法统称为普通算法)和基于增强型加权随机算法的负载均衡策略,从多个服务中选择一个进行远程网络连接。

(8)服务消费者会直接与根据基于SPI机制动态加载的负载均衡策略选择出的服务提供者建立连接,实现数据交互。也就是说,后续服务消费者会与服务提供者直接实现数据交互。

# 四、实现

说了这么多,具体要怎么实现呢?

# 核心类实现关系

基于SPI扩展增强型加权随机算法负载均衡策略的核心类关系如图51-2所示。

图51-2

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码