golang 微服务的负载均衡

上次我们说了一下 微服务的容错处理,是用的 断路器

这一次我们来一起看看 微服务的负载均衡是如何做的

负载均衡

负载均衡是什么呢?

他能够将大量的请求,根据负载均衡算法,将不同的请求分发到多台服务器上进行处理,使得所有的服务器负载都维持在一个高效稳定的状态,进而可以提高系统的吞吐量,和保证系统的可用性

例如我们的访问服务器是这样的

用户 – 网络 – 服务器 – 数据库

golang 微服务的负载均衡_第1张图片

那么,如果这一个服务器的请求数很高,超过了服务器能能处理的极限,自身无法及时响应的时候,则会出现异常,甚至无法连接,用户就无法得到及时的期望结果

那么我们至少可以期望服务器部署是这个样子的

golang 微服务的负载均衡_第2张图片

就是在服务器的前面加一个负载均衡器,这样外部请求的压力就可以又 多个服务器来分担,并且请求给到任何一个服务器,得到的响应都是一样的

那么我们一起来看看负载均衡的类型都有哪些

负载均衡的类型

负载均衡的类型有 2 类:

  • 软件负载均衡

一般是独立的负载均衡软件来实现外部请求的分发,一般这样的软件配置简单,使用成本很低,并且能够满足基本的负载均衡要求,例如 haproxy

那么这就要对重点关注在软件的质量和该软件部署在所属服务器的性能上面,若软件质量不行,或者部署的服务器性能不行,都会成为系统吞吐量的瓶颈

  • 硬件负载均衡

硬件的负载均衡,必然是依赖特殊负载均衡设备来做的,部署成本相对较高,可是对于软件的负载均衡,硬件的做法能够满足更多种场景的使用

例如常见的例子,DNS 负载均衡 和 反向代理负载均衡

DNS 负载均衡

例如在 DNS服务器中,我们会给一个同一个名称配置多个 IP,那么不同的 DNS 请求就会解析到不同的 IP 地址,进而这就可以达到 不同请求去访问不同的服务器的目的,这就是咱们的 DNS 负载均衡

反向代理负载均衡

我们平时项目中使用到的服务网关就是反向代理负载均衡

作为客户端,你是不知道你访问的这个地址是不是真正的服务器的地址,你访问了网关地址之后,网关会根据路由将你的请求发送给对应服务器去处理,最终返回结果,例如这样

golang 微服务的负载均衡_第3张图片

负载均衡算法

如何保证能够让每一个服务器的都能够处于高效稳定的运行呢,这就需要优秀的负载均衡算法出马了

负载均衡算法定义了如何将外部请求分散到各个服务器实例中,它能够有效的提高吞吐量

一般会有这几种算法:

  • 随机法

随机从服务器集群中任选一台。这种方法确实很简单,保证了请求的分散性,可是这种方法无法做到当前的请求分配是否合理以及不同服务器自身的负载能力

  • 轮询或者加权轮询法

就是轮流的将请求分配给集群中每一个服务器,加权的话,就是按照比例轮询的方式将请求分配给集群中的每一个服务器,如:

轮询 3 个服务器

golang 微服务的负载均衡_第4张图片

加权轮询 3 个服务器,若 A 占比 20%,B 占比 50 % ,C 占比 30%

golang 微服务的负载均衡_第5张图片

  • Hash 法或者一致性 Hash 的方式

就是使用 hash 算法将请求分散到集群中每一个服务器上面

一致性 hash 指的是,在将请求分散到每个服务器时,若其中一个服务器挂掉了,这个算法能够将请求平摊到剩下的服务器上面,这样可以避免请求剧烈的变动

  • 最小连接数方法

就是将请求分配到连接数最少的服务器上面,但是负载均衡器需要如何知道呢?

因此使用这种算法,就需要负载均衡器与服务器之前产生数据交互,这样它在可以了解集群中服务器的连接数情况

今天就到这里,学习所得,若有偏差,还请斧正

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

golang 微服务的负载均衡_第6张图片

好了,本次就到这里

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

你可能感兴趣的:(负载均衡,golang,微服务)