使用Ribbon进行客户端负载均衡

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依赖项。

<dependency>  
<groupId>org.springframework.cloud</groupId>  
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>  
</dependency>  

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

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

@RibbonClient(name="currency-exchange-service")

CurrencyExchangeServiceProxy.java

package com.javatpoint.microservices.currencyconversionservice;  
import org.springframework.cloud.netflix.ribbon.RibbonClient;  
import org.springframework.cloud.openfeign.FeignClient;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.PathVariable;  
//@FeignClient(name="currency-exchange-service", url="localhost:8000")  
//Enabling feign  
@FeignClient(name="currency-exchange-service")  
//enabling ribbon  
@RibbonClient(name="currency-exchange-service")  
public interface CurrencyExchangeServiceProxy   
{  
@GetMapping("/currency-exchange/from/{from}/to/{to}")       //where {from} and {to} are path variable  
public CurrencyConversionBean retrieveExchangeValue(@PathVariable("from") String from, @PathVariable("to") String to); //from map to USD and to map to INR  
}  

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

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

name-of-the-application.ribbon.listOfServers=URLs

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

currency-exchange-service.ribbon.listOfServers=http://localhost:8000, http://localhost:8001

application.properties

spring.application.name=currency-conversion-service  
server.port=8100  
currency-exchange-service.ribbon.listOfServers=http://localhost:8000, http://localhost:8001  

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

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

client-side-load-balancing-with-ribbon.png

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

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

client-side-load-balancing-with-ribbon-1.png

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

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

client-side-load-balancing-with-ribbon-2.png

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

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

client-side-load-balancing-with-ribbon-3.png

在上图中,Ribbon将负载分配给三个活动的CurrencyExchangeServices。CurrencyExchangeService1在端口8000上运行,CurrencyExchangeService2在端口8001上运行,依此类推。因此,通过CurrencyCalculationService使用Ribbon进行的所有调用都分布在这三个服务之间。

标签: spring, Spring教程, spring cloud, spring cloud教程, spring cloud框架, spring cloud面试题, springcloud组件, springcloud微服务架构, springcloud入门教程, springcloud主件, spring cloud架构图