对于负载均衡依据介质而分可以分成硬件负载均衡和软件负载均衡,软件的负载均衡则是通过在服务器上安装负载均衡功能的模块或者软件来完成请求分发工作。
无论是硬件负载均衡还是软件的负载均衡都是通过维护一个下挂的服务器清单列表,通过心跳检测功能剔除有问题的服务器节点,保证剩余服务器节点的可访问。客户端提交访问请求到负载均衡设备时,该设备会依据某种负载均衡算法,选择一个服务器用于转发客户端请求。
可以依据可提供服务的服务器清单所存储的位置细分成客户端负载均衡和服务端负载均衡。客户端负载均衡是客户端节点自己从注册中心获取一份服务端节点的服务清单自己进行维护(如Ribbon)。服务器端负载均衡将在服务端前有一个软件自己维护服务端节点,进行负载均衡(如nginx)。
Spring Cloud Ribbon是一个基于http和TCP的客户端负载均衡工具,它是基于Netfix Ribbon实现。
Ribbon主要有以下几个模块:
- ribbon 内置的负载均衡算法
- ribbon-core ribbon的核心jar包,包含主要核心代码,API及部分配置内容
- ribbon-httpclient 基于 Apache HttpClient 封装的 REST 客户端,集成了负载均衡模块,可以直接在项目中使用来调用接口
- ribbon-loadbalancer ribbon的负载均衡模块
- ribbon-transport 基于netty实现多协议的支持,比如HTTP,TCP 和UPD的支持
ribbon的负载均衡策略有:
- RandomRule 从服务实例清单中随机选择一个服务实例的功能
- RoundRibbonRule 以线性轮询的方式,依次选择服务实例
- RetryRule 对选定的负载均衡策略机上重试机制,也就是说当选定了某个策略进行请求负载时在一个配置时间段内若选择 Server 不成功,则一直尝试使用 subRule 的方式选择一个可用的 Server。
- WeightedResponseTimeRule 根据实例的运行情况计算权重,并根据权重选择实例也就是根据响应时间分配一个 Weight(权重),响应时间越长,Weight 越小,被选中的可能性越低。
- BestAvaliableRule 通过遍历负载均衡器中所维护的所有服务实例,会过滤掉故障的实例,并找出并发请求数最小的一个。所以此策略就是选择出最闲的一个
- AvailablityFilteringRule 通过线性抽样的方式直接尝试寻找可用且比较闲的实例来使用
- ZoneAvoidanceRule 使用 ZoneAvoidancePredicate 和 AvailabilityPredicate 来判断是否选择某个 Server,前一个判断判定一个 Zone 的运行性能是否可用,剔除不可用的 Zone(的所有 Server),AvailabilityPredicate 用于过滤掉连接数过多的 Server。
参考 :http://c.biancheng.net/view/5353.html
《Spring Cloud 微服务实战》