快速理解微服务中Ribbon的概念

一.基本概念

1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。

2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。

3.Ribbon 主要解决的是在微服务架构中,多个服务实例之间进行通信时如何选择合适的服务实例的问题。

但是 Ribbon 已经停止了主动维护。

Netflix 于 2018 年宣布 Ribbon 将不再作为新功能的开发重点,并在后续的版本中减少了对 Ribbon 的支持,官方表示,Ribbon 已经进入维护模式,意味着不会有新的功能更新和重大改动,但会继续提供 bug 修复和安全更新。

二.Ribbon的原理

使用方法:

就是在RestTemplate上添加@LoadBalanced注解,Ribbon就生效了,当在使用RestTemplate进行远程请求的时候,就会使用负载均衡策略。

基本原理:

1.通过拦截器对被注解@LoadBalanced修饰的RestTemplate进行拦截(通过AOP扫描到这个注解注释的RestTemplate,然后获取到这个方法的参数,根据获取到的参数就可以做2、3步的操作);

2.将RestTemplate中调用的服务名,解析成具体的IP地址(这一步需要去注册表查询),由于一个服务名会对应多个地址,那么在选择具体服务地址的时候,需要做负载均衡(比如一个Server有IP1和IP2地址的时候,Ribbon会根据不同的负载均衡算法选出合适的IP地址来进行调用)。

3.确定目标服务的IP和PORT后,通过Httpclient进行http的调用。

三.Ribbon的负载均衡算法

Ribbon的核心组件IRule自带的七种负载均衡算法:

1.轮询:RoundRobinRule;

2.随机:RandomRule;

3.重试:RetryRule(先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用的服务);

4.RoundRobinRule的扩展:WeightedResponseTimeRule(响应速度越快的实例选择权重越多大,越容易被选择);

5.会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务: BestAvailableRule

6.先过滤掉故障实例,再选择并发较小的实例:AvailabilityFilteringRule;

7.复合判断Server所在区域的性能和Server的可用性选择服务器:ZoneAvoidanceRule(默认规则)。

自定义算法步骤(以随机算法):

1.定义配置类:

java 复制代码
@Configuration
public class MyRibbonRuleConfig {

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
    @Bean
    public IRule MyRibbonRuleConfig (){
        // 定义随机负载均衡算法
        return new RandomRule();
    }
}

2.主启动类上加上@RibbonClient()注解

java 复制代码
@SpringBootApplication
@RibbonClient(name = "ORDER-SERVICE",configuration = MyRibbonRuleConfig.class)
public class OrderMain {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class, args);
    }
}

四.推荐的替代方案

对于新的微服务项目,Spring Cloud 团队推荐使用 Spring Cloud LoadBalancer 来替代 Ribbon,Spring Cloud LoadBalancer 提供了比 Ribbon 更加现代化的负载均衡支持,并与 Spring Cloud 生态系统更紧密集成,如果项目中仍然使用 Ribbon,并且无法立即迁移,可以继续使用,但要注意它不再接收新的功能和改进,且可能会逐步淘汰。

1.Spring Cloud LoadBalancer 提供了不同的负载均衡策略,例如:

(1)RoundRobinLoadBalancer:轮询负载均衡;

(2)RandomLoadBalancer:随机负载均衡;

(3)WeightedResponseTimeLoadBalancer:基于响应时间加权的负载均衡策略。

2.配置负载均衡策略:

java 复制代码
@Configuration
public class LoadBalancerConfig {

    @Bean
    public LoadBalancer loadBalancer() {
        // 可以根据需要选择不同的负载均衡策略
        return new RoundRobinLoadBalancer(); // 默认使用 RoundRobin 策略
    }
}

也可以通过 Spring 配置文件来选择不同的负载均衡策略:

java 复制代码
spring:
  cloud:
    loadbalancer:
      ribbon:
        enabled: false  # 禁用 Ribbon(如果你之前在使用 Ribbon)

启用轮训策略:

java 复制代码
spring:
  cloud:
    loadbalancer:
      round-robin:
        enabled: true  # 启用轮询策略

总结:

1.SpringCloud LoadBalancer 是 Spring Cloud 推荐的负载均衡解决方案,逐渐替代了 Ribbon;

2.它更轻量并且与现代的服务发现和微服务架构更加兼容;

3.配置 RestTemplate 或直接使用 LoadBalancerClient,你可以在代码中实现服务调用时的负载均衡。

相关推荐
serendipity_hky4 分钟前
【微服务 - easy视频 | day01】准备工具+gateway网关及路由至内部服务
java·微服务·架构·gateway·springcloud
周杰伦_Jay5 小时前
【Go微服务框架深度对比】Kratos、Go-Zero、Go-Micro、GoFrame、Sponge五大框架
开发语言·微服务·golang
回家路上绕了弯9 小时前
海量日志分析:一天内最大在线人数与最长持续时间计算方案
后端·微服务
A.说学逗唱的Coke1 天前
【观察者模式】深入 Spring 事件驱动模型:从入门到微服务整合实战
spring·观察者模式·微服务
论迹1 天前
【Spring Cloud 微服务】-- 服务拆分原则
java·spring cloud·微服务
阿里云云原生2 天前
阿里云微服务引擎 MSE 及 API 网关 2025 年 10 月产品动态
阿里云·微服务·云原生·云计算
Tadas-Gao2 天前
MySQL存储架构解析:从数据无序到索引艺术的演进
数据库·分布式·mysql·微服务·云原生·架构
CV_J2 天前
编写微服务api
微服务·云原生·架构
黄暄2 天前
微服务面试题(14题)
java·spring cloud·微服务·架构·java-rabbitmq·java-zookeeper
忙碌5442 天前
智能应用开发指南:深度学习、大数据与微服务的融合之道
大数据·深度学习·微服务