所谓负载均衡最简单的理解就是将一些高频次操作分摊到多个操作单元处理,缓解单节点单元处理的压力,提升平台整体的健壮性。那么如何去实现负载均衡机制呢?这里既然提到负载均衡机制也不得不说一下负载均衡都有哪些算法模式,我们常用的算法模式包括:轮询策略、加权轮询策略、随机策略等等。
轮询策略:所谓轮询策略从字面上讲,就是我们将服务以多节点的形式进行注册或者管理,服务在被调用的时候,会按照次序依次被触发调用,每个服务被调用的概率是一样的。
加权轮询策略:所谓加权轮询策略,从字面上看,就是对轮询策略进行加权。那么为什么进行加权处理呢。平时我们对服务进行多节点部署,部署的时候我们会发现服务器和服务器之间从性能、吞吐量上讲还是有差距的,这些差距将会导致用户在请求某些操作中反应速率时好时坏,那么,我们就需要多多节点服务进行加权处理,对性能好的服务器权重高一些(被调用的概率会提升),对性能差的服务器权重低一些,以保证服务的稳定性。
随机策略:从上面的讲解,我们就不难理解随机策略了,既然随机,那就表示着服务的调用是随机的,没有次序的。
实现负载均衡机制的方式方法也有很多种,如传统的服务器集、nginx代理、kafka等等,接下来我将从Springcloud入手,讲解SpringCloud是如何实现负载均衡。
提到springcloud负载均衡,大家不难想到springcloud的注册中心eureka,eureka做为Springcloud的核心作用及其重要。它管理者平台所有的服务,包括服务注册、服务发现、服务心跳监控等等,同时它自身也可以通过简单的位置实现的负载。首先我们要关闭服务保护模式(当然这种方式不建议使用)
关闭保护模式后,配置服务的心跳检测时长
这样节点服务在异常中断后,会被自动从eureka中剔除,至于调用,我们可以直接通过服务名去调用已经注册到eureka中的服务。eureka会自动去触发相同服务名下的一个节点去执行任务。当然这种方式安全性不高,不建议使用,接下来我们主要通过生产者消费者模式去讲解springcloud的负载机制,那么什么可以作为生产者、什么可以作为消费者呢。一般我们可以将处理业务的服务作为生产者,面向用户交互的作为消费者。然后生产者我们可以多节点部署、消费者加入缓存机制(redis),熔断机制(hystrix)去调用生产者给用户提供数据服务。示意图如下:
从上图我们可以看出,与用户有直接交互的只有消费者device服务,消费者device服务再通过服务路由及eureka服务去寻找我们需要的业务操作进行反馈即可,至于熔断器的加入是为了防止单一请求出现异常导致消费者服务资源被长期占用,redis的加入是为了解决频繁的多次查询相同的数据等类似情况,可以直接从缓存中提取数据,降低服务器压力。
算法配置:
springcloud默认算法配置为轮询策略,如果我们想切换成其他负载算法可以在配置文件中相应的配置。