Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,经过Spring Cloud Ribbon的封装,在微服务架构中使用客户端负载均衡调用很是简单。Ribbon是Spring Cloud整个你们庭中相对而言比较复杂的模块,直接影响到服务调度的质量和性能。java
负载均衡是对系统的高可用、网络压力的缓解和处理能力扩容的重要手段之一。负载均衡分为:算法
(1)服务端负载均衡:维护一个可用的服务端清单,经过心跳检测来剔除故障的服务端节点,保证清单中都是可正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(轮询、加权等)从维护的可用服务端清单中取出一台服务端端地址,而后进行转发。服务器
(2)客户端负载均衡:和服务端负载均衡最大的不一样点在于服务清单所存储的位置。在客户端负载均衡中,全部客户端节点都维护着本身要访问的服务端清单,而这些服务端端清单来自于服务注册中心。网络
在和Feign结合的场景下,最终请求会转发成 http://<服务名称>/<relative-path-to-service>的格式,经过LoadBalancerFeignClient,
提取出服务标识<服务名称>,而后根据服务名称在上下文中查找对应服务的负载均衡器FeignLoadBalancer。负载均衡器负责根据既有的服务实例的统计信息,挑选出最合适的服务实例。架构
(1)Ribbon经过ILoadBalancer接口对外提供统一的选择服务器(Server)的功能,此接口会根据不一样的负载均衡策略(IRule)选择合适的Server返回给使用者。并发
public interface ILoadBalancer { void addServers(List<Server> var1); Server chooseServer(Object var1); void markServerDown(Server var1); /** @deprecated */ @Deprecated List<Server> getServerList(boolean var1); List<Server> getReachableServers(); List<Server> getAllServers(); }
(2)IRule是负载均衡策略的抽象,ILoadBalancer经过调用IRule的choose()方法返回Server,其核心方法以下:负载均衡
public interface IRule { Server choose(Object var1); void setLoadBalancer(ILoadBalancer var1); ILoadBalancer getLoadBalancer(); }
IRule的实现类有:框架
(3)IPing用来检测Server是否可用,ILoadBalancer的实现类维护一个Timer每隔10s(this.pingIntervalSeconds = 10)检测一次Server的可用状态dom
public interface IPing { boolean isAlive(Server var1); }