Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
Ribbon提供了抽象接口,如IClient,IClientConfig,IRule,ILoadBalancer
IClient:客户端接口,依赖IClientConfig配置执行请求,返回响应。
IClientConfig:客户端配置,主要是属性配置,依赖于IClientConfigKey
IClientConfigKey:客户端配置键,包含key,类型及对应值信息。
ReloadableClientConfig:支持重新加载的客户端配置,其依赖Property以及PropertyResolver
Property:动态配置的封装。
ReloadableProperty:支持重新加载的动态配置
PropertyResolver:配置解析器,用于解耦配置与属性源。
AbstractLoadBalancerAwareClient:使用LoadBalancer的客户端抽象类,执行时,创建LoadBalancerCommand命令,当中会调用抽象方法getRequestSpecificRetryHandler来配置,基于RxJava调用
负载均衡接口,其依赖于Server类,支持添加Server,选择Server以及获取所有及可用 Server列表。
AbstractLoadBalancer:包含大多数LoadBalancer的公有特征,同时提供了抽象方法根据ServerGroup获取服务器列表方法
BaseLoadBalancer:实现了AbstractLoadBalancer,也是其它类的基类,其依赖IRule,IPing,IPingStrategy接口。
DynamicServerListLoadBalancer:可以根据数据源动态更新Server列表
ZoneAwareLoadBalancer:分区的动态负载均衡。
其它**LoadBalancer继承自BaseLoadBalancer,决定了**LoadBalancer的依赖组件
负载均衡的规则接口,有很多不同的实现类,主要是根据各自的规则从负载均衡得到 的Server列表中选取其中的一个Server。
AbstractLoadBalancerRule:是其它规则类的公共基类,是公共的特征即依赖ILoadBalancer。
ClientConfigEnabledRoundRobinRule:内部包含RoundRobinRule,同时也提供根据客户端配置来设置规则。
PredicateBasedRule:基于AbstractServerPredicate过滤,然后基于round robin
AvailabilityFilteringRule:先基于round robin得到server,如果server不可用,继续下一个
ZoneAvoidanceRule:首先基于zone区选择,然后再根据server的可用性来选择。
BestAvailableRule:选择并发数最小的
RandomRule:随机选择
RoundRobinRule:轮询方式
ResponseTimeWeightedRule:基于响应时间的权重
WeightedResponseTimeRule:基于响应时间的权重
判断服务器是否是存活的接口
AbstractLoadBalancerPing:抽象基类,提供基本实现, 主要是成员AbstractLoadBalancer。
NIWSDiscoveryPing:基于服务发现,通过发现实例信息的状态 判断服务器是否是存活
PingUrl:主要是通过向服务器发送get请求, 根据响应来判断是否是存活
对于多个服务器判断存活的策略,当前只有一个实现类SerialPingStrategy,遍历Server依次IPing。
对于Server的过滤器,有不同的实现类
ZoneAffinityPredicate:过滤与当前客户端不在同一服务区的服务器
AvailabilityPredicate:过滤处于断路以及有太多并发连接的服务器
CompositePredicate:多个过滤器and操作
ZoneAvoidancePredicate:过滤测量指标超过阀值的服务区
参考资料:
https://github.com/Netflix/ribbon