原文网址:Spring Cloud Ribbon--负载均衡的原理_IT利刃出鞘的博客-CSDN博客
简介
本文介绍SpringCloud的ribbon的负载均衡的原理。
我另外一篇文章的最后分析到了负载均衡:Feign最终调用Ribbon进行负载均衡。
负载均衡概述
负载均衡在系统架构中非常重要,一定要去实施,因为负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。我们通常所说的负载均衡都指的是服务端负载均衡,其中分为硬件负载均衡和软件负载均衡。硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,比如F5 等;而软件负载均衡则是通过在服务器上安装一些具有均衡负载功能或模块的软件来完成请求分发工作,比如Nginx等。
在 Spring Cloud 构建的微服务系统中, Ribbon 作为服务消费者的负载均衡器,有两种使用
方式,一种是和 RestTemplate 相结合,另一种是和 Feign 相结合(Feign 已经默认集成了 Ribbon)。
Ribbon与 Eureka整合后,Ribbon会从Eureka Server中获取服务实例清单,将其放到本应用里存放,当调用其他服务时会根据这个服务实例清单的信息进行负载均衡,选择要调用的服务。
Ribbon 有很多子模块,但很多模块没有用于生产环境,目前 Netflix 公司用于生产环境的Ribbon子模块如下:
- ribbon-loadbalancer:可以独立使用或与其他模块一起使用的负载均衡器 API。
- ribbon-eureka: Ribbon 结合 Eureka 客户端的 API,为负载均衡器提供动态服务注册列表信息。
- ribbon-core: Ribbon 的核心 API。
负载均衡器
SpringCloud中定义了LoadBalancerClient作为负载均衡器的通用接口,并且针对Ribbon实现了RibbonLoadBalancerClient,但它在具体实现客户端负载均衡时,是通过Ribbon的ILoadBalancer接口实现的。下面我们根据ILoadBalancer接口的实现类逐个看看它是如何实现客户端负载均衡的。
AbstractLoadBalancer
AbstractLoadBalancer是ILoadBalancer接口的抽象实现。
源码:
public abstract class AbstractLoadBalancer implements ILoadBalancer {
public enum ServerGroup{
ALL,
STATUSJJP,
STATUS_NOT_UP
}
public Server chooseServer{) {
return chooseServer(null);
}
public abstract List<Server> getServerList(ServerGroup serverGroup);
public abstract LoadBalancerStats getLoadBalancerStats();
}
在该抽象类中定义了一个关于服务实例的分组枚举类ServerGroup,它包含以下三种不同类型。
- ALL:所有服务实例。
- STATUS_UP:正常服务的实例。
- STATUS_N〇T_UP:停止服务的实例。
另外,还实现了一个chooseServer()函数,该函数通过调用接口中的chooseServer(Objectkey)实现,其中参数key为null,表示在选择具体服务实例时忽略key的条件判断。
最后,还定义了两个抽象函数。
- getServerList (ServerGroup serverGroup) : 定义了根据分组类型来获取不同的服务实例的列表。
- getLoadBalancerStats (): 定义了获取 LoadBalancerStats 对象的方法,LoadBalancerStats对象被用来存储负载均衡器中各个服务实例当前的属性和统计信息。这些信息非常有用,我们可以利用这些信息来观察负载均衡器的运行情况,同时这些信息也是用来制定负载均衡策略的重要依据。
BaseLoadBalancer
BaseLoadBalancer类是Ribbon负载均衡器的基础实现类,在该类中定义了很多关于负载均衡器相关的基础内容。
上边只是部分内容,为便于维护,本文已迁移到此地址:Spring Cloud Ribbon-负载均衡的原理 - 自学精灵