Ribbon是一种客户端负载均衡的解决方案,它通常与Spring Cloud一起使用,以在微服务架构中实现负载均衡。
客户端负载均衡器的实现原理是通过注册中心,如 Nacos,将可用的服务列表拉取到本地(客户端),再通过客户端负载均衡器(设置的负载均衡策略)获取到某个服务器的具体 ip 和端口,然后再通过 Http 框架请求服务并得到结果。
Ribbon通过在客户端中添加拦截器来实现负载均衡。当客户端发出请求时,拦截器会根据一组预定义的规则选择一个服务实例来处理请求。这些规则可以基于多个因素进行选择,包括服务实例的可用性、响应时间、负载等级等。
Ribbon的核心是负载均衡算法,它决定了如何选择服务实例。Ribbon提供了多种负载均衡算法,包括轮询、随机、加权随机、加权轮询、最少连接数等,他们的具体实现是实现了IRule接口,继承自AbstractLoadBalanceRule实现的:
Ribbon还提供了一些高级功能,如服务列表的动态刷新、失败重试、请求重试、请求超时控制等。这些功能可以帮助客户端更好地适应动态的服务拓扑,并提高系统的可用性和容错性。
但是需要注意的是,Nacos 2021 移除了Ribbon的支持,取而代之的是spring-cloud-loadbalancer
1、POM依赖增加对Nacos和Ribbon的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
在Spring Boot应用程序中配置Nacos注册中心:
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_SERVER_ADDR:localhost:8848}
在需要调用远程服务的类中注入Ribbon Client:
@RestController
public class MyController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/invoke")
public String invoke() {
// 发送请求并获取响应
String response = restTemplate.getForObject("http://my-service/my-api", String.class);
return response;
}
}
在应用程序启动类中配置Ribbon Client:
@Configuration
public class RibbonConfig {
@Bean
public IRule ribbonRule() {
// 使用随机算法选择服务实例
return new RandomRule();
}
@Bean
@LoadBalanced //使用@LoadBalanced注解来启用负载均衡功能。
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.build();
}
}
Ribbon的工作流程大致如下: