回顾负载均衡的一些知识

一 概述

当系统面临大量的用户访问,负载过高的时候,通常会增加服务器数量来进行横向扩展,多个服务器的负载需要均衡,以免出现服务器负载不均衡,部分服务器负载较大,部分服务器负载较小的情况。通过负载均衡,使得集群中服务器的负载保持在稳定高效的状态,从而提高整个系统的处理能力。

系统的负载均衡分为软件负载均衡和硬件负载均衡。软件负载均衡使用独立的负载均衡程序或系统自带的负载均衡模块完成对请求的分配派发。硬件负载均衡通过特殊的硬件设备进行负载均衡的调配。

二 软件负载均衡的不同类型

基于DNS的负载均衡:利用DNS实现负载均衡,就是在DNS服务器配置多个A记录,不同的DNS请求会解析到不同的IP地址。一般,大型的网站使用DNS作为第一级负载均衡。

基于IP的负载均衡:根据请求的IP进行负载均衡。LVS就是具有代表性的基于IP的负载均衡实现。

二 不同的负载均衡

  1. 本地负载均衡,一般使用Ribbon,通过轮询机制,总请求次数 % 服务器总数取模后就调用相对应索引的服务。
  2. 服务器端的负载均衡,一般使用nginx。

客户端负载均衡服务端负载均衡最大的区别在于服务端地址列表的存储位置,在客户端负载均衡中,所有的客户端节点都有一份自己要访问的服务端地址列表,这些列表统统都是从服务注册中心获取到,并缓存到服务发现客户端;

服务器端负载均衡

服务端负载均衡中,客户端节点只知道单一服务代理的地址,即负载均衡器的地址,服务代理则知道所有服务端的地址,即所有的服务地址都保存在负载均衡器中的服务注册表中。

换言之,在负载均衡器中维护一个可用的服务实例清单,当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负载均衡算法)从可用服务实例清单中选取其中一个去处理客户端的请求。

在SpringCloud中我们如果想要使用客户端负载均衡,直接使用@LoadBalanced注解即可,这样客户端在发送请求的时候会根据负载均衡策略从服务端列表中选择一个服务端,向该服务端发起网络请求,从而实现负载均衡。

例如Nginx,通过Nginx进行负载均衡,客户端发送请求至Nginx,Nginx通过负载均衡算法,在多个服务器之间选择一个进行访问,即在服务器端服务器端再进行负载均衡算法分配。

目前而言,最主流的负载均衡技术还是反向代理负载均衡,所有主流的Web服务器都热衷于支持基于反向代理的负载均衡。他的核心工作就是根据一定规则,将HTTP请求转发到服务器集群的单一服务器上。

三 客户端负载均衡器——Spring Cloud Netflix Ribbon

Ribbon是管理HTTP和TCP服务客户端的负载均衡器。Ribbon具有一系列带有名称的客户端(Named Client),也就是带有名称的Ribbon客户端(Ribbon Client)。每个客户端由可配置的组件构成,负责一类服务的调用请求。Spring Cloud通过RibbonClientConfiguration为每一个Ribbon客户端创建一个ApplicationContext上下文来进行组件配置。Ribbon作为Spring Cloud的负载均衡机制的实现,可以与OpenFeign和RestTemplate进行无缝对接,让二者具有负载均衡的能力。

客户端服务负载均衡

Ribbon是RESTful HTTP客户端OpenFeign负载均衡的默认实现。Ribbon作为客户端负载均衡器,Ribbon在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这就是客户端进行服务在均衡的分配。

四 Ribbon实现负载均衡策略

IRule是定义Ribbon负载均衡策略的接口,可以通过实现该接口来自定义自己的负载均衡策略,RibbonClientConfiguration配置类则会给出IRule的默认实例。IRule接口的choose方法就是这一对服务器中根据一定规则选出一个服务器。IRule有很多默认的实现类,这些实现类根据不同的算法和逻辑进行负载均衡。

IRule的类图

在大多数情况下,这些默认的实现类是可以满足需求的,如果有特殊需求,可以自己实现。

  • RoundRobinRule:默认,轮询,即按一定的顺序轮换后去实例的地址。
  • RandomRule:随机,即以随机的方式获取实例的地址。
  • AvailabilityFilteringRule:会过滤掉由于多次访问故障而处于断路器跳闸状态的服务,以及并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问。
  • ClientConfigEnabledRoundRobinRule:使用roundRobinRule随机选择服务器。
  • WeightedResponseTimeRule:根据响应时间去计算所有服务的权重(weight),响应时间越长,权重越低,权重越低的服务器,被选择的可能性越低。如果刚启动统计的信息量不足时,则使用默认轮询的策略,即RoundRobinRule,等到统计信息足够时,会切换到WeightedResponseTimeRule策略。
  • RetryRule:先按照RoundRobinRule的策略获取服务,如果获取服务失败,则在指定的时间内会进行重试,获取可用的服务。
  • BestAvailableRule:会过滤掉由于多次访问故障二处于断路器跳闸状态的服务,然后选择最小请求数的服务器。
  • ZoneAvoidanceRule:默认规则,根据服务器所属的服务区的整体运行状况来轮询选择,即复合判断server所在区域的性能和server的可用性选择服务器。

Ribbon的负载均衡策略既有RoundRobinRule和RandomRule这样的不依赖于服务器运行状况的策略,也有AvailabilityFilteringRule和WeightedResponseTimeRule等多种基于服务器运行状态决策的策略。这些策略既可以根据单个服务器的运行状况,也可以依据整个服务区的与运行状况选择具体调用的服务器,适用于各种场景需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值