谈谈微服务的Ribbon知识点

Ribbon负载均衡

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。(负载均衡+RestTemplate调用),在服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单。

复制代码
 @Configuration
 public class AppConfiguration {
     @Bean
     @LoadBalanced // 开启负载均衡能力
     public RestTemplate restTemplate() {
         return new RestTemplate();
     }
 }

此时当我们使用RestTemplate就会变成这个样子,url变为了http://provider/test,不会直接使用http://ip:port/test的形式,而是使用服务名称,根据服务名称去注册中心获取实际的服务信息,最终再转换为要请求的地址。

当发起远程调用时,ribbon先从注册中心拉取服务地址列表,然后按照一定的路由策略选择一个发起远程调用,一般的调用策略是轮询

负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

不同规则的含义如下:

内置负载均衡规则类 规则描述
RoundRobinRule 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为"短路"状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule 随机选择一个可用的服务器。
RetryRule 重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

自定义配置

通过定义IRule实现可以修改负载均衡规则,有两种方式:

代码方式:在启动类中,定义一个新的IRule

官方文档明确给出了警告:这个自定义配置类不能放在@ComponentScan所扫描的当前包下以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了。 (如果在@ComponentScan所扫描的当前包下以及子包下,则全部的客户端都采用这种策略,不只只是这个服务,比如我们打算在订单服务下进行随机,但是其他物流服务....都会采用随机)

复制代码
@Bean
public IRule randomRule(){
    return new RandomRule();
}

配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:

复制代码
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

相关推荐
I疯子1 分钟前
2026-04-13 打卡第 6 天
开发语言·python
LucaJu3 分钟前
Java + EasyExcel 实现单个接口导出多个Excel
java·excel
断眉的派大星3 分钟前
值传递和引用传递
开发语言
无忧智库6 分钟前
企业数字化的“底层逻辑”:深度解构4A架构中的数据基石(PPT)
分布式·微服务·架构
素玥7 分钟前
实训7 json文件数据用python导入数据库
数据库·python·json
大邳草民7 分钟前
Python 对象模型与属性访问机制
开发语言·笔记·python
钝挫力PROGRAMER11 分钟前
关于软件架构的一些疑惑
微服务·云原生·架构
Rick199311 分钟前
Redis 底层架构图
数据库·redis·缓存
xyq202411 分钟前
Swift 下标脚本
开发语言
橘子编程12 分钟前
密码学完全指南:从基础到实战
java·python·密码学