1、Ribbon介绍
Ribbon 是netflix 公司开源的基于客户端的负载均衡组件。
2、Ribbon工作原理
3、负载均衡器的核心--LoadBalancer
LoadBalancer 的职能主要有三个:
- 维护Sever列表的数量(新增、更新、删除等)
- 维护Server列表的状态(状态更新)
- 当请求Server实例时,能否返回最合适的Server实例
负载均衡器的内部基本实现原理
(1)如何维护Server列表?(新增、更新、删除)?
Server列表的维护从实现方法上分为两类:
-
1、基于配置的服务列表
netflix 在做Spring cloud 套件时,使用了分布式配置框架netflix archaius ,archaius 框架有一个特点是会动态的监控配置文件的变化,将变化刷新到各个应用上。也就是说,当我们在不关闭服务的情况下,如果修改了基于配置的服务列表时, 服务列表可以直接刷新 -
2、结合服务发现组件(如Eureka)的服务注册信息动态维护服务列表
基于Spring Cloud框架下,Eureka服务注册和发现是一个分布式服务集群必不可少的一个组件,它负责维护不同的服务实例(注册、续约、取消注册),借助Eureka的服务注册信息动态刷新ribbon 的服务列表
Server列表可能在运行的时候动态的更新,而具体的更新方式有如下两种实现方式:
- 基于定时任务的拉取服务列表
- 基于Eureka服务事件通知的方式更新
(2)负载均衡器如何维护服务实例的状态?
Ribbon负载均衡器将服务实例的状态维护托交给Pinger
、 PingerStrategy
、IPing
来维护,Ribbon默认的IPing实现是DummyPing,具体交互模式如下所示:
(3)如何从服务列表中挑选一个合适的服务实例?
在Ribbon的实现中,在ServerList中,维护着Server的实例,并返回最新的List<Server>集合,供LoadBalancer使用。
从服务列表中挑选最合适的服务实例
。LoadBalancer内部采用了如下图所示的组件完成:
定义IRule,从服务实例列表中,选择最合适的Server实例。
完整的算法包含如下:
- RandomRule:随机算法实现;
- RoundRobinRule:轮询负载均衡策略,依次轮询所有可用服务器列表,遇到第一个可用的即返回;
- RetryRule :先按照RoundRobinRule策略获取服务,如果获取服务失败会在指定时间内重试;
- AvaliabilityFilteringRule: 过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值) ;
- BestAvailableRule :会先过滤掉由于多次访问故障二处于断路器跳闸状态的服务,然后选择一个并发量最小的服务;
- WeightedResponseTimeRule: 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低;
- ZoneAvoidanceRule: 复合判断server所在区域的性能和server的可用性选择server