当前位置: 首页 > news >正文

SpringCloud之Ribbon

SpringCloud之Ribbon

————————————————————————————————————

推荐文档: https://www.springcloud.cc/spring-cloud-dalston.html#spring-cloud-ribbon

1.什么是Ribbon

Ribbon 是 Spring Cloud 微服务架构中实现客户端负载均衡的核心组件,由 Netflix 开源并集成到 Spring Cloud 生态中。它通过动态分配请求到多个服务实例,提升系统的可用性和性能。


2. 客户端负载均衡

与服务端负载均衡的区别:

  • Nginx 属于服务端负载均衡(集中式),请求先经 Nginx 转发到后端服务。

  • Ribbon 将负载均衡逻辑嵌入服务消费者,直接从注册中心(如 Eureka)获取服务列表,在本地选择实例并调用。

优势:减少单点故障,降低网络跳转延迟,适应动态伸缩。

Ribbon与Nginx对比

特性Ribbon (客户端负载均衡)Nginx (服务端负载均衡)
部署位置集成在服务消费者进程内独立服务器或集群
服务发现动态从注册中心获取服务列表需手动配置或通过脚本更新
灵活性支持动态策略调整和深度定制配置相对静态,修改需重启
性能影响减少网络跳转,延迟更低增加额外网络跃点
典型用例微服务内部调用南北流量(客户端到网关)

3. 核心能力

动态服务发现:集成注册中心(如 Eureka),自动更新可用实例列表。

多种负载策略:支持轮询、随机、响应时间加权等算法。

故障容错:超时重试、服务熔断(常与 Hystrix 结合)。


4.工作流程

步骤 1:消费者从注册中心拉取服务实例列表,缓存在本地。

步骤 2:通过 IRule 策略(如轮询,随机,权重等)选择目标实例。

步骤 3:RestTemplate 发起请求(需添加 @LoadBalanced 注解)。

步骤 4:若请求失败,根据配置重试或切换实例。


5.核心组件

ILoadBalancer:负载均衡器,管理实例列表与选择逻辑。

IRule:定义负载策略(如 RandomRule 随机选择)。

ServerList:动态获取服务实例列表(与 Eureka 集成)。


6. IRule策略对比

策略名称实现类工作原理适用场景缺点
轮询策略RoundRobinRule按服务实例列表顺序依次选择(如 A→B→C→A)节点性能均匀的无状态服务(如静态API)无法感知节点实时负载
随机策略RandomRule完全随机选择实例节点性能相近的简单服务可能将流量引向高负载节点
权重响应时间策略WeightedResponseTimeRule根据实例历史响应时间动态分配权重(响应越快权重越高)节点性能差异大的集群(如混合部署新旧服务器)冷启动阶段可能分配不均
最小连接数策略BestAvailableRule选择当前并发请求数最少的实例高并发场景(如秒杀系统)需监控并发数,增加系统开销
可用性过滤策略AvailabilityFilteringRule过滤故障节点和高并发节点,剩余节点轮询选择高可用要求的服务(如支付系统)依赖健康检查机制
区域感知策略ZoneAvoidanceRule优先选择同区域实例,避开高延迟或故障区域跨机房/云区域部署(如全球业务)单区域部署时退化为轮询
重试策略RetryRule在指定时间窗内重试获取可用服务(默认基础策略为轮询)网络波动环境或服务临时不可用重试可能增加请求延迟
自定义策略继承 AbstractLoadBalancerRule按业务逻辑定制(如基于 IP 哈希的会话保持)会话保持的服务(如用户登录状态)需开发成本,扩展性需手动处理

7.适用场景

  • 微服务间调用(如通过 RestTemplate 或 Feign)。

  • 需灵活定制负载策略或深度集成 Spring Cloud 的场景。


8.总结:

Ribbon 作为微服务架构的“流量调度器”,通过客户端负载均衡显著提升系统弹性。其核心价值在于:

✅ 轻量集成:无需独立部署,与 Spring Cloud 生态无缝协作。

✅ 灵活扩展:支持策略定制和容错机制。

⚠️ 演进过渡:虽被 Spring Cloud LoadBalancer 取代,但理解其原理仍是掌握微服务治理的关键基础。

http://www.xdnf.cn/news/1102447.html

相关文章:

  • 从延迟测试误区谈起:SmartPlayer为何更注重真实可控的低延迟?
  • 飞算JavaAI 实战笔记
  • 从零实现一个GPT 【React + Express】--- 【3】解析markdown,处理模型记忆
  • 继承和多态扩展学习
  • 没有Mac如何完成iOS 上架:iOS App 上架App Store流程
  • Django--02模型和管理站点
  • 【Springboot】Bean解释
  • CPT203-Software Engineering: Project Managent 项目管理
  • 继承 示例
  • 飞算 JavaAI:开启 Java 开发新时代
  • 使用Python将目录中的JPG图片按后缀数字从小到大顺序纵向拼接,很适合老师发的零散图片拼接一个图片
  • Set 二分 -> 剑指算法竞赛
  • 【9】PostgreSQL 之 vacuum 死元组清理
  • Ant ASpin自定义 indicator 报错
  • 模拟开关、可编程增益仪表放大器电路
  • VLM-R1 + GRPO 算法完整复现全过程日志
  • 随手记录第二十话 -- Python3版本虚拟环境安装与AI的接入使用
  • RuoYi+Uniapp(uni-ui)开发商城系统
  • python学习DataFrame数据结构
  • 数据结构第一章复杂度的认识
  • 【java17】使用 Word 模板导出带替换符、动态表格和二维码的文档
  • iOS 数组如何设计线程安全
  • 提示工程:突破Transformer极限的计算科学
  • 工具分享--IP与域名提取工具
  • Spring 声明式事务:从原理到实现的完整解析
  • 小架构step系列11:单元测试引入
  • 分享|2025年机器学习工程师职业技术证书报考指南
  • 如何使用 Python 删除 Excel 中的行、列和单元格 – 详解
  • 《探索电脑麦克风声音采集多窗口实时可视化技术》
  • xFile:高性能虚拟分布式加密存储系统——Go