你好,我是尹吉欢。本文来自拉勾教育专栏《 300分钟搞懂 Spring Cloud 》。欢迎来到课时 3 "客户端负载均衡-Ribbon "的学习。

众所周知,随着用户量的增加,我们的应用访问量也会随之增加,单台服务器已经不能满足高并发的业务需求了,这个时候就需要多台服务器组成集群来应对高并发带来的业务压力,同时也需要负均衡器来对流量进行合理分配。

负载均衡是一种基础的网络服务,它的核心原理是按照指定的负载均衡算法,将请求分配到后端服务集群上,从而为系统提供并行处理和高可用的能力。

负载均衡的方式有很多种,在 Spring Cloud 体系中,Ribbon 就是负载均衡的组件,所有的请求都将通过 Ribbon 来选取对应的服务信息。

目前主流的负载方案分为两种:

  • 一种方案是集中式负载均衡,在消费者和服务提供方中间使用独立的代理方式进行负载,有硬件的负载均衡器,比如 F5,也有软件,比如 Nginx。
  • 另一种方案则是客户端自己做负载均衡,根据自己的请求情况做负载,Ribbon 就属于客户端自己做负载的框架。

本文来自拉勾教育专栏《 300分钟搞懂 Spring Cloud 》

集中式负载均衡

首先我们来看下集中式负载均衡,图中就是集中式负载均衡的工作原理,负载均衡器负责维护需要负载的服务实例信息,如:192.168.1.1:8080 和 192.168.1.2:8080 这两个实例。客户端不是直接请求 192.168.1.1:8080 和 192.168.1.2:8080 这两个实例,而是通过负载均衡器来做转发,客户端的请求到了负载均衡器这里,负载均衡器会根据配置的算法在 192.168.1.1:8080 和 192.168.1.2:8080 这两个实例中选取一个实例,转发到具体的实例上。

这样的好处是客户端不需要关心对应服务实例的信息,只需要跟负载均衡器交互,服务实例扩容或者缩容,客户端不需要修改任何代码。


客户端负载均衡

现在看到的是客户端负载均衡,客户端负载均衡需要自己维护服务实例的信息,然后通过某些负载均衡算法,从实例中选取一个实例,直接进行访问。

最后我们总结下集中式负载均衡和客户端负载均衡最大的区别就是对服务实例信息的维护,集中式负载均衡的信息是集中进行维护的,比如 Nginx,都会在配置文件中进行指定。客户端负载均衡的信息是在客户端本地进行维护的,我们可以手动配置,但最常见的是从注册中心进行定时拉取。


Ribbon

我们接下来学习 Ribbon。

Ribbon 是由 Netflix 发布的负载均衡器,它有助于控制 HTTP 和 TCP 的客户端的行为。Ribbon 属于客户端负载均衡。

为 Ribbon 配置服务提供者地址后,Ribbon 就可基于某种负载均衡算法,自动的帮助服务消费者去请求。同时 Ribbon 默认为我们提供了很多负载均衡算法,例如轮询、随机等。


主要组件

我们使用 Ribbon 主要是用于负载均衡场景,那么需要实现一个通用的负载均衡框架,是需要很多组件支持的,Ribbon 中就提供了这些组件,有了这些组件,整个框架的扩展性便会更好,更灵活,我们可以根据业务需求,选择是否要自定义对应的组件来满足特定场景下的需求。

你现在看得到的脑图就是 Ribbon 中的主要组件,以及每个组件下目前已有的一些实现,其实这里并没有把所有的内容都整理出来,还有一些你可以课后自己去补充。

下面我们通过 Ribbon 的使用场景来分别介绍这些组件,当我们需要通过 Ribbon 选择一个可用的服务实例信息,进行远程调用的时候,Ribbon 会根据指定的算法从服务列表中选择一个服务实例进行返回。

在这个选择服务实例的过程中,服务实例信息是怎么来的?

这就需要一个服务实例的存储组件来支持,ServerList 就是这个组件。存储分为静态和动态两种方式。静态存储需要事先配置好固定的服务实例信息,动态存储需要从注册中心获取对应的服务实例信息。

有了服务信息后,在某些场景下我们可能需要过滤一部分信息,这个时候可以用 ServerListFilter 组件来实现过滤操作。

Ribbon 会将服务实例在本地内存中存储一份,这样不需要每次都去注册中心获取,这种场景的问题在于,当服务实例增加或者减少后,本地怎么更新呢?这个时候需要用到ServerListUpdater 组件,ServerListUpdater 组件就是用于服务实例更新操作。

还有个问题就是,缓存到本地的服务实例信息有可能已经无法提供服务了,这个时候就需要有一个检测的组件,来对服务实例信息进行检测是否可用,这个组件就是 IPing。

Ribbon 会根据指定的算法来选择一个可用的实例信息,IRule 组件提供了很多种算法策略来选择实例信息。

最后就是我们使用的入口了,我们要选择一个可用的服务,怎么选择?问谁要这个服务?

ILoadBalancer 这个时候就上场了,ILoadBalancer 中定义了软件负载均衡操作的接口,比如动态更新一组服务列表,根据指定算法从现有服务器列表中选择一个可用的服务等操作。

最后做下总结,就从 Ribbon 的核心功能出发,我们分析了 Ribbon 内部的主要组件,以及每个组件的职责,并且这些组件都可以让我们自定义,扩展性很强。

本文来自拉勾教育专栏《 300分钟搞懂 Spring Cloud 》

版权声明:本文版权归属拉勾教育及该专栏作者,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发布/发表,违者必究。


北城码农Alex
153 声望17 粉丝