Ribbon负载均衡
Ribbon是基于HTTP和TCP的客服端负载均衡工具,基于Netflix Ribbon实现 (っ ̯ -。)
Ribbon不像Spring Cloud 服务注册中心、配置中心、API网关那样独立部署,但它几乎存在于每个SpringCloud微服务中。包括为Fegin提供的声明式服务调用也是基于ribbon实现的
Ribbon 默认提供很多种负载均衡算法,轮询、随机、最小并发等等,还可以自定义负载均衡算法
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例
负载均衡不同方案
目前主流的负载均衡可分为两类: (๑‾ ꇴ ‾๑)
集中式负载均衡(服务器级别)
在consumer和provider之间使用独立的负载均衡设施(硬件F5,软件Ngnix),由设施负责把访问请求通过某种策略转发至Provider
进程内负载均衡(客户端级别)
把负载均衡逻辑集成到 consumer,consumer从注册中心拉取服务列表,在列表里选出一个合适的provider
Ribbon属于后者,它是一个类库,集成于consumer进程,consumer通过它获取provider地址
Ribbon 负载均衡策略
- 轮询(默认)
对应类名
RoundRobinRule
每次都按顺序取下一个provider,像时钟一样,每到点钟就取几
- 权重轮询
对应类名
WeightedResponseTimeRule
按provider响应时间分配一个权重,响应时间越长,权重越小,被选中的几率就低
第一轮为轮询策略,同时开启一个计时器,每 30 秒 收集一次每个 provider 的平均响应时间,当信息足够时,给每个 provider 附上一个权重,并按权重随机选择 provider
- 随机
对应类名
RandomRule
从 provider 列表随机选择一个
- 最少并发数
对应类名
BestAvailableRule
谁最闲就找谁,除非这个 provider 正在熔断
- 重试
对应类名
RetryRule
当轮询策略不可用的时候,重试策略会尝试选择集群中其他节点
- 可用性敏感
对应类名
AvailabilityFilteringRule
过滤掉 eureka 中一直处于连接失败的 provider和过滤掉繁忙的 provider
- 区域敏感性
对应类名
ZoneAvoidanceRule
按“片”找,如果这个IP区域内有一个或者多个实例不可达或者响应慢,会降低该“片”内其他IP被选中的权重