快速理解微服务中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,你可以在代码中实现服务调用时的负载均衡。

相关推荐
小毅&Nora30 分钟前
【AI微服务】【Spring AI Alibaba】 ④ 深度实战:从零构建通义千问聊天服务(2025 最新版)
人工智能·微服务·spring ai
喵个咪11 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
后端·微服务·go
Mr.朱鹏15 小时前
大模型入门学习路径(Java开发者版)下
java·python·学习·微服务·langchain·大模型·llm
时光追逐者16 小时前
一个基于 .NET 开源、功能强大的分布式微服务开发框架
分布式·微服务·开源·c#·.net·.net core
拾忆,想起21 小时前
单例模式深度解析:如何确保一个类只有一个实例
前端·javascript·python·微服务·单例模式·性能优化·dubbo
阿萨德528号1 天前
Maven 项目构建笔记 - 单体应用与简单微服务
笔记·微服务·maven
Coder_Boy_1 天前
业务导向型技术日志记录(2)
java·人工智能·驱动开发·微服务
沉迷技术逻辑1 天前
微服务保护和分布式事务
分布式·微服务·架构
野蛮人6号1 天前
黑马微服务 p23Docker02 docker的安装 如何正确安装docker,黑马微服务给的文档不行了,如何正确找到解决方法
java·docker·微服务·架构
小毅&Nora1 天前
【后端】【微服务网关】 ① 全景图:2025年主流网关选型、原理与实战指南
网关·微服务·架构