什么是 Ribbon呢?

一、Spring Cloud Ribbon 客户端负载均衡

Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端侧负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。Bibbon 的架构图如下所示:

简单的说,Springcloud Ribbon 是一个基于HTTP和TCP的客户端负载均衡工具。Springcloud 将面向服务的REST 模板请求自动转换成客户端负载均衡的服务调用 。我们可以在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。

客户端负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。通常意思上的负载均衡是指服务端负载均衡其中分为硬件负载均衡和软件负载均衡。硬件和软件负载基本原理图如下所示:

客户端负载均衡中所有客户端节点都要维护着自己要访问的服务端清单,这些服务端的清单来自于服务注册中心(Eureka)。

二、实现客户端负载均衡

服务提供者(Service Provider)只需要启动多个服务实例并注册到一个注册中心或是多个相关联的服务注册中心。

服务消费者(Service consumer)直接通过调用被@LoadBalanced 注解修饰过的TestTemplate 来实现面服务的接口调用。

三、Eureka使用Ribbon架构

Ribbon工作时分为两步:

第一步先选择 Eureka Server,获取可用服务列表,从可用的服务列表中它优先选择在同一个Zone且负载较少的Server;

第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询round robin、随机Random、根据响应时间加权等。

四、负载均衡策略

简单轮询负载均衡(RoundRobin)

以轮询的方式依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。

随机负载均衡 (Random)

随机选择状态为UP的Server

加权响应时间负载均衡 (WeightedResponseTime)

一 个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择 server。

区域感知轮询负载均衡(ZoneAware)

区域感知负载均衡内置电路跳闸逻辑,可被配置基于区域同源关系(Zone Affinity,也就是更倾向于选择发出调用的服务所在的托管区域内,这样可以降低延迟,节省成本)选择目标服务实例。它监控每个区域中运行实例的行 为,而且能够实时的快速丢弃一整个区域。这样在面对整个区域故障时,帮我们提升了弹性。

五、Ribbon自带负载均衡策略比较

策略名策略父类策略描述实现说明

BestAvailableRuleClientconfigEnabledRoundRobinRule选择一个最小的并发请求的server逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server

AvailabilityFilteringRulePredicateBasedRule过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态

WeightedResponseTimeRuleRoundRobinRule根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低。一 个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择 server。

RetryRuleAbstractLoadBalancerRule对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server

RoundRobinRuleAbstractLoadBalancerRuleroundRobin方式轮询选择server轮询index,选择index对应位置的server

RandomRuleAbstractLoadBalancerRule随机选择一个server在index上随机,选择index对应位置的server

ZoneAvoidanceRulePredicateBasedRule复合判断server所在区域的性能和server的可用性选择server使 用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个 zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的 Server。

Ribbon使用:

Ribbon是基于消费者端的负载均衡,所以下面的代码都是在消费者端上面修改

添加Ribbon依赖:

<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>

启动类添加Ribbon注解:

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "MICROSERVICECLOUD-DEPT")
public class DeptConsumer80_App {

	public static void main(String[] args) {
		SpringApplication.run(DeptConsumer80_App.class, args);

	}

}

Ribbon默认使用轮询机制,负载均衡基本配置完毕,具体可以查看其它两篇Ribbon文章

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐