一、负载均衡介绍
由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。
针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)
负载均衡英文缩写SLB,它的主要算法如下
加权轮询(WRR)算法:为每台分配一个权重,权重表示相对于其他服务器,自身能处理连接的能力。权重为n表示SLB为下一服务器分配流量之前,要为这台服务器分配n条新连接。
加权最小连接(WLC)算法:SLB会将新连接分配给活动连接数最少的真实服务器。为每台真实服务器分配权重m,服务器处理活动连接的能力等于m除以所有服务器权重之和。SLB会将新连接分配给活动连接数远少于其能力范围的真实服务器。
使用加权最小连接(WLC)算法时,SLB使用一种慢启动的方式来控制对新加真实服务器的访问。“慢启动”限制了新连接的建立频率并允许逐渐增加,以此来防范服务器的的过载。
二、分类
服务端负载均衡
负载均衡是我们处理高并发、缓解网络压力和进行服务端扩容的重要手段之一,但是一般情况下我们所说的负载均衡通常都是指服务端负载均衡,服务端负载均衡又分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。
硬件负载均衡主要通过在服务器节点之间安装专门用于负载均衡的设备,常见的如F5。
软件负载均衡则主要是在服务器上安装一些具有负载均衡功能的软件来完成请求分发进而实现负载均衡,常见的就是Nginx。
无论是硬件负载均衡还是软件负载均衡,它的工作原理都不外乎下面这张图:
无论是硬件负载均衡还是软件负载均衡都会维护一个可用的服务端清单,然后通过心跳机制来删除故障的服务端节点以保证清单中都是可以正常访问的服务端节点,此时当客户端的请求到达负载均衡服务器时,负载均衡服务器按照某种配置好的规则从可用服务端清单中选出一台服务器去处理客户端的请求。这就是服务端负载均衡。
客户端负载均衡
Netfilx发布的负载均衡器,是一个基于http、tcp的客户端负载均衡工具,具有控制http、tcp客户端的行为,为ribbon配置服务提供者的地址后,ribbon就可以经过springCloud的封装实心客户端负载均衡的服务调用。
使用springcloud ribbon实现与eureka的配合
ribbon可从eureka服务注册表中获取服务提供者的地址列表,使用一定的负载均衡算法,Ribbon的工作主要分为2步。
1.先选择eureka service ,优先选择一个zone负载较小的service。
2.根据用户制定策,从service取得eureka 服务注册表中选择一个地址。
提供的策略:轮询Round Robin、随机Random、ResponseTime加权
/* 使用属性自定义功能区客户端
从版本1.2.0开始,Spring Cloud Netflix现在支持使用属性与Ribbon文档兼容来自定义功能区客户端。
这允许您在不同环境中更改启动时的行为。
支持的属性如下所示,应以<clientName>.ribbon.:
NFLoadBalancerClassName:应该实施 ILoadBalancer
NFLoadBalancerRuleClassName:应该实施 IRule
NFLoadBalancerPingClassName:应该实施 IPing
NIWSServerListClassName:应该实施 ServerList
NIWSServerListFilterClassName 应实施 ServerListFilter
在这些属性中定义的类优先于使用@RibbonClient(configuration=MyRibbonConfig.class)Spring 定义的bean 以及由Spring Cloud Netflix提供的默认值。
描述:配置文件中定义ribbon优先代码定义
*/
在微服务架构中使用客户端负载均衡使用。
1.服务提供者启动多个服务 注册到服务注册中心同一个实例。
2.服务消费者通过使用注解的方式修饰RestTemplate实现向服务的接口进行调用。
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}