1,概述

1.是什么

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。
简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法。

2.能干嘛

LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用)。
常见的负载均衡有软件Nginx,LVS,硬件 F5等。

Ribbon本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

集中式LB

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。
实现:负载均衡+RestTemplate调用

总结:

Spring Cloud Ribbon是Spring Cloud中的一个组件,它提供了客户端负载均衡的功能,可以与服务发现组件(如Eureka)结合使用,实现服务之间的负载均衡。

原理:

1.服务注册与发现

服务提供者将自身注册到服务注册中心(如Eureka),服务消费者通过服务注册中心获取可用的服务提供者实例信息。

2.Ribbon客户端

消费者端的Ribbon客户端会从服务注册中心获取服务提供者的实例列表,并根据配置的负载均衡策略选择合适的服务实例来发送请求。

3.负载均衡策略

Ribbon支持多种负载均衡策略,包括轮询、随机、权重等,消费者可以根据需要进行配置。

4.请求重试与容错

Ribbon还支持请求重试和容错机制,当请求失败时可以进行重试或者切换到其他可用的服务实例。

使用详解:

0.架构说明:

Ribbon在工作时分成两步

  • 第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.

  • 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。

总结:

Ribbon 是一个软负载均衡的客户端组件,它可以和其他所需请求的客户端结合使用,和 eureka 结合只是其中的一个实例。

1.添加依赖

首先需要在项目中添加Spring Cloud Ribbon的依赖,通常可以通过Maven或Gradle来进行添加。

org.springframework.cloudspring-cloud-starter-netflix-ribbon

如果引入了spring-cloud-starter-netflix-eureka-client依赖,就不需要加spring-cloud-starter-ribbon引用,因为spring-cloud-starter-netflix-eureka-client自带了spring-cloud-starter-ribbon引用。

2.配置Ribbon客户端

在Spring Boot应用的配置文件中,可以配置Ribbon的一些属性,例如负载均衡算法、连接超时时间、重试次数等。以下是一个简单的配置示例:

my-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRuleConnectTimeout: 3000ReadTimeout: 60000

3.整合服务发现

如果使用服务发现组件(如Eureka),需要将Ribbon与服务发现组件整合,以便获取服务实例列表。

4.结合RestTemplate

通常情况下,Ribbon会与RestTemplate结合使用来进行服务间的通信。在使用RestTemplate时,可以通过服务名来调用其他服务,Ribbon会自动进行负载均衡。

@Autowiredprivate RestTemplate restTemplate;public String callOtherService() {return restTemplate.getForObject("http://my-service/api/data", String.class);}

5.自定义配置

可以根据实际需求对Ribbon进行自定义配置,包括负载均衡策略、超时设置、重试次数等。

@Configurationpublic class RibbonConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}}

通过上述配置,RestTemplate将会整合Ribbon的负载均衡功能,可以实现服务之间的负载均衡。同时,可以在RestTemplate中使用服务名称代替具体的URL,Ribbon会根据服务名称自动选择合适的服务实例来发送请求。

6.测试负载均衡

为了测试负载均衡效果,可以启动多个相同服务的实例,然后调用该服务,观察请求的分发情况。根据配置的负载均衡算法,请求应该会被均匀地分发到各个服务实例上。