使用 Ribbon 实现客户端负载均衡

2024年11月14日 | 阅读时长:3 分钟

Netflix Ribbon

Netflix Ribbon 是 Netflix 开源软件 (Netflix OSS) 的一部分。它是一个云库,提供客户端负载均衡。它可以自动与 Netflix 服务发现 (Eureka) 交互,因为它属于 Netflix 系列。

Ribbon 主要提供客户端负载均衡算法。它是一个客户端负载均衡器,可以控制 HTTPTCP 客户端的行为。重要的一点是,当我们使用 Feign 时,也会应用 Ribbon

Ribbon 的特性

  • 负载均衡
  • 容错性
  • 在异步模型中支持多种协议
  • 缓存和批处理

模块

  • ribbon: 这是一个集成了负载均衡、容错、缓存的 API,以及
  • ribbon-loadbalancer: 这是一个负载均衡器 API,可以独立使用,也可以与其他模块一起使用。
  • ribbon eureka: 它使用 Eureka 客户端,为 Spring Cloud 提供动态服务器列表。
  • ribbon-transport: 它是一个传输客户端,支持 HTTP、TCPUDP。 这些协议使用具有负载均衡功能的 RxNetty
  • ribbon-httpclient: 这是一个基于 Apache HttpClient 构建的 REST 客户端,集成了负载均衡器。
  • ribbon-core: 这是一个客户端配置 API。

负载均衡的类型

有两种类型的负载均衡

  • 服务器端负载均衡:服务器端负载均衡是单片的。它应用于客户端和服务器之间。它接受传入的网络、应用程序流量,并使用各种方法将流量分配到多个后端服务器。中间组件负责将客户端请求分发到服务器。
  • 客户端负载均衡:客户端保存服务器 IP 列表,以便它可以传递请求。 客户端从列表中随机选择一个 IP,并将请求转发到服务器。

让我们在我们的项目中配置 Ribbon 服务器。

步骤 1:转到项目 currency-conversion-service

步骤 2:打开 pom.xml 文件并添加 ribbon 依赖项

添加依赖项后,我们需要在代理上启用 ribbon。

步骤 3:打开 CurrencyExchangeServiceProxy.java 文件。 通过添加注解 @RibbonClient 并指定我们要与之通信的服务的名称来启用 Ribbon。 Ribbon 客户端为客户端提供声明式配置。

CurrencyExchangeServiceProxy.java

步骤 4:在注解 @FeignClient 中,删除属性 URL。 因为我们不需要与特定的服务通信。 我们将在 application.properties 文件中配置该 URL。

步骤 5:打开项目 currency-conversion-serviceapplication.properties 文件并配置服务器。 我们必须配置的属性是

我们配置了要调用的 currency-exchange-service 的两个实例。

application.properties

运行使用 Ribbon 实现的客户端负载均衡

我们有两个 CurrentlyExchangeServiceApplication.java 的实例,如下图所示

Client-Side Load Balancing with Ribbon

首先,在端口 8000 上运行 CurrencyExchangeServiceApplication,然后在端口 8001 上运行 CurrencyExchangeServiceApplication。

在两个端口上运行 CurrencyExchangeServiceApplication 后,通过发送请求 https://:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000 运行 CurrencyConversionServiceApplication.java。它返回以下响应。

Client-Side Load Balancing with Ribbon

在上图中,端口 8000 表示 currency-exchange-service 正在端口 8000 上运行并处理当前请求。

现在,刷新页面。 我们得到相同的响应,除了端口号和数量,因为我们更改了请求中的数量。

Client-Side Load Balancing with Ribbon

在上图中,端口 8001 表示 currency-exchange-service 正在端口 8001 上运行并处理当前请求。

让我们通过一个图来理解负载均衡

Client-Side Load Balancing with Ribbon

在上图中,Ribbon 在三个活动的 CurrencyExchangeServices 之间分配负载。 CurrencyExchangeService1 在端口 8000 上运行,CurrencyExchangeService2 在端口 8001 上运行,依此类推。 因此,无论通过 CurrencyCalculationService 使用 Ribbon 发出什么调用,都会在这些三个服务之间分配。