Spring Cloud教程-使用Ribbon进行客户端负载均衡
使用Ribbon进行客户端负载均衡
Netflix Ribbon
Netflix Ribbon是Netflix开源软件(Netflix OSS)的一部分。它是一个云库,提供客户端负载均衡。它会自动与Netflix服务发现(Eureka)进行交互,因为它是Netflix家族的一部分。
Ribbon主要提供了客户端负载平衡算法。它是一个客户端负载均衡器,可以控制HTTP和TCP客户端的行为。重要的一点是,当我们使用Feign时,Ribbon也会应用。
Ribbon的特点
- 负载均衡
- 容错性
- 异步模型中的多协议支持
- 缓存和批处理
模块
- ribbon: 它是一个API,集成了负载均衡、容错性、缓存和
- ribbon-loadbalancer: 它是一个负载均衡器API,可以独立使用或与其他模块一起使用。
- ribbon-eureka: 它使用Eureka客户端,为Spring Cloud提供了一个动态的服务器列表。
- ribbon-transport: 它是一个支持HTTP、TCP和UDP的传输客户端。这些协议使用带有负载平衡功能的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-service的application.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的实例,如下图所示:
首先,在端口8000上运行CurrencyExchangeServiceApplication,然后在端口8001上运行CurrencyExchangeServiceApplication。
在两个端口上都运行CurrencyExchangeServiceApplication后,通过发送请求http://localhost:8100/currency-converter-feign/from/EUR/to/INR/quantity/10000
来运行CurrencyConversionServiceApplication.java。它返回以下响应。
在上图中,端口8000表示currency-exchange-service在端口8000上运行并处理当前请求。
现在,刷新页面。我们获得相同的响应,除了端口号和数量,因为我们已更改请求中的数量。
在上图中,端口8001表示currency-exchange-service在端口8001上运行并处理当前请求。
让我们通过一个图形来理解负载均衡:
在上图中,Ribbon将负载分配给三个活动的CurrencyExchangeServices。CurrencyExchangeService1在端口8000上运行,CurrencyExchangeService2在端口8001上运行,依此类推。因此,通过CurrencyCalculationService使用Ribbon进行的所有调用都分布在这三个服务之间。