Spring Cloud_Ribbon
负载均衡
负载均衡:将负载(工作任务、访问请求)进行平衡,分摊到多个操作单元(例如,服务器、组件)上进行执行
负载均衡保证了高性能、高可用(单点故障)、扩展性(水平伸缩)
负载均衡的方式
- 应用集群:将同一应用部署到多个机器
- 负载均衡设备:将用户的请求,根据负载均衡算法,分发到集群中的一台处理服务器
负载均衡的作用
- 解决并发压力,提供应用处理性能
- 提供故障转移,实现高可用
- 通过添加或者减少服务器数据,提供网站的扩展性
- 安全防护(负载均衡设备做一些过滤,黑白名单等)
负载均衡分类
- 硬件负载均衡:F5
- 软件负载均衡:Nginx
- 服务端负载均衡:F5、Nginx
- 客户端负载均衡:Ribbon
集中式 LB VS 进程内 LB
- 集中式 LB:服务的消费方和提供方之间使用独立的负载均衡,例如 Nginx,由该设施负责把请求通过某种策略转发至服务的提供方
- 进程内 LB:将负载均衡逻辑集成到消费方,消费方从服务注册中心获取哪些地址可用,然后自己从这些地址中选择一个合适的服务器
Ribbon 属于进程内 LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址
常见的负载均衡算法 / 均衡策略
- 轮询:请求按照顺序轮流分配
- 加权轮询:按照请求顺序和权重分配
- 随机
- 加权随机:按照权重随机请求
- 源地址哈希法
- 最小连接数法
Ribbon
- 主要功能是提供客户端的负载均衡算法和服务调用
- Ribbon 客户端组件提供一些列完善的配置项,比如连接超时,重试等
- 在配置文件中列出 Load Balanced 后面的机器,Ribbon 会自动基于某种规则(简单轮训,随机连接等)去连接这些机器
Ribbon 核心组件
- 负载均衡器 Load balancer:管理负载均衡的组件
- 服务列表 Server List:获取所有服务的地址信息,并存到本地
- 服务列表过滤 ServerListFilter:将获取到的服务列表按照过滤规则过滤
- 服务列表更新 ServerListUpdater:从注册中心获取最新的注册表信息
- 心跳检测 ping:检测哪些服务可用
- 负载均衡策略 Rule
Ribbon 本地负载均衡客户端 VS Nginx 服务端负载均衡的区别
- Nginx 是服务器负载均衡,客户端的所有请求都会交给 Nginx,即负载均衡是由服务端实现的
- Ribbon 本地负载均衡,在调用微服务接口时,会在注册中心上获取信息列表,之后缓存到 JVM 本地,从而在本地实现 RPC 远程服务调用技术
==Ribbon 的负载均衡策略==
- 线性轮询均衡:轮流依次请求不同的服务器,不需要记录当前所有连接的状态,是无状态调度
- 可用服务过滤负载均衡:过滤故障和并发连接数量超过阀值的服务,对剩余的服务列表按照轮训策略进行访问
- 加权响应时间负载均衡:为每个服务按响应时长分配权重,响应时间越长,权重越低,被选中的概率越低
- 区域感知负载均衡:更倾向于选择发出调用的服务所在的区域内的服务,降低延迟,是 Ribbon 默认的策略
- 重试负载均衡:通过轮训均衡选择服务器,如果请求失败或响应超时,可以选择重试
- 高可用均衡:忽略请求失败的服务器,尽量找并发比较低的服务器,这种会给服务器集群带来成倍的压力
- 随机负载均衡:随机选择服务器,适合并发比较大的场景
