关于Ribbon

一.Ribbon是什么

Ribbon是一个客户端负载均衡器,它可以很好地控制HTTP和TCP客户端的行为。

Ribbon 是netflix 公司开源的基于客户端的负载均衡组件,是Spring Cloud大家庭中非常重要的一个模块;

主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。这个负载均衡指的是客户端的负载均衡。

Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。

简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。

二.Ribbon能做什么

主要实现中间层应用层析的负载均衡。Ribbon提供以下特性:

(1)负载均衡器,可支持插拔式的负载均衡规则。

(2)对多种协议提供支持,例如HTTP、TCP、UDP。

(3)集成了负载均衡功能的客户端。

三.Ribbon原理

Spring Cloud将Ribbon的API进行了封装,使用者可以使用封装后的API来实现负载均衡,也可以直接使用Ribbon的原生API。

Ribbon主要有以下三大子模块:

(1)ribbon-core:该模块为Ribbon项目的核心,主要包括负载均衡器接口定义、客户端接口定义、内置的负载均衡实现等API。

(2)ribbon-eureka:为Eureka客户端提供的负载均衡实现类。

(3)ribbon-httpclient:对Apache的HttpClient进行封装,该模块提供了还有负载均衡功能的REST客户端。

1、负载均衡器组件

Ribbon的负载均衡器主要与集群中的各个服务器进行通信,负载均衡器需要提供以下基础功能:

维护服务器的IP、DNS名称等信息。

根据特定的逻辑在服务器列表中个循环。

为了实现负载均衡的基础功能,Ribbon的负载均衡器有以下三大子模块:

(1)Rule:一个逻辑组件,这些逻辑将会决定从服务器列表中返回哪个服务器实例。

(2)Ping:该组件主要使用定时器来确保服务器网络可以连接。

(3)ServerList:服务器列表,可以通过静态的配置确定负载的服务器,也可以动态指定服务器列表。如果动态指定服务器列表,则会有后台的线程来刷新该列表。

Spring Cloud中定义了LoadBalancerClient为负载均衡器等接口,并且针对Ribbon实现了RibbonLoadBalancerClient,但是它在具体实现客户端负载均衡时,则是通过Ribbon的ILoadBalancer接口实现。

负载均衡器LoadBalancer的实现原理图:

2、负载均衡机制

Ribbon的负载均衡器接口定义了服务器的操作,主要用于服务器的选择。在默认情况下会使用RoundRobinRule的规则逻辑。

3、自定义负载规则

如果想自定义负载均衡规则,可以编写一个IRule接口的实现类。在自定义规则类中,实现的choose方法调用了ILoadBalancer的getAllServers方法,返回全部服务器。

可以根据自己业务规则返回指定的服务器。然后在客户端代码中调用负载均衡器的setRule(new MyRule(lb))设置负载规则为我们自定义的负载规则。

4、Ribbon与Nginx区别

Ribbon本地负载均衡,原理:在调用接口的时候,会在eureka注册中心上获取注册信息服务列表,获取到之后,缓存在jvm本地,使用本地实现rpc远程调用技术进行调用。即客户端实现负载均衡。

Nginx服务器负载均衡,客户端所有请求都会交给nginx,然后再由nginx实现转发请求。即服务端实现负载均衡。

应用场景

Ribbon本地负载均衡器适合在微服务rpc远程调用,比如Dubbo、SpringCloud。

Nginx服务负载均衡器适合针对服务器端,比如Tomcat、Jetty。

原文地址:https://www.cnblogs.com/ZJOE80/p/13023760.html