一、负载均衡
其含义就是将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行;(就是客户端调用服务提供方时的如何调用多个实例的策略)
1、主流负载均衡的方案
集中式负载均衡:在消费者和服务提供方中间使用独立的方式进行负载;(Nginx)
客户端根据自己的请求情况做负载均衡,Ribbon就属于客户端自己做负载均衡;
2、客户端的负载均衡
例如Spring cloud中的Ribbon,客户端会有一个服务器地址列表,再请求发送前通过负载均衡算法选择一个服务器;即在客户端就进行负载均衡算法分配;
3、常见的负载均衡算法
随机、轮训、加权轮训、地址hash、最小连接数;
二、Ribbion
Spring Cloud Ribbon是基于Netflix Ribbon 实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时,重试等。通过Load Balancer获取到服务提供的所有机器实例,Ribbon会自动基于某种规则(轮询,随机)去调用这些服务。Ribbon也可以实现我们自己的负载均衡算法。
1、Ribbon扩展功能
Ribbon相关接口:org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration
IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。
Rule:Ribbon的负载均衡策略,默认采用ZoneAvoidanceRule实现,该策略能够在多区域环境下选出最佳区域的实例进行访问。
IPing:Ribbon的实例检查策略,默认采用DummyPing实现,该检查策略是一个特殊的实现,实际上它并不会检查实例是否可用,而是始终返回true,默认认为所有服务实例都是可用的。
ServerList:服务实例清单的维护机制,默认采用ConfigurationBasedServerList实现。
ServerListFilter:服务实例清单过滤机制,默认采ZonePreferenceServerListFilter,该策略能够优先过滤出与请求方处于同区域的服务实例。
ILoadBalancer:负载均衡器,默认采用ZoneAwareLoadBalancer实现,它具备了区域
感知的能力。
2、Ribbon负载均衡策略
a、RandomRule:随机选择一个Server
b、RetryRule:对选择的Server做重试,直到选择到一个可用的Server;
c、RoundRobinRule:轮训选择;
d、AvailabilityFilteringRule:过滤链接失败的Server,并过滤掉那些高并发的后端Server;其实就是检查Staus里记录的各个Server状态;
e、BestAvailableRule:选择最小的并发请求的Server,跳过不健康的Server;
f、WeightedResponseTimeRule:根据响应时间加权,响应时间越长权重越小,被选中可能性越低;
g、ZoneAvoidanceRule:默认的负载均衡策略,即复合判断Server所在区域的性能和Server的可用性选择Server,在没有区域的环境下,类似于轮询
h、NacosRule: 优先调用同一集群的实例,基于随机权重
3、饥饿加载
Ribbon默认懒加载,意味着只有在发起调用时才会创建客户端;可通过配置修改为饥饿加载:ribbon:eger-load:enabled:true ribbon:eger-load:clients:执行需要饥饿加载的服务名
三、LoadBlancer
Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代
Ribbon。