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

Ribbon实战

一、前置知识

1.1 负载均衡定义

负载均衡指的是将网络请求通过不同的算法分配到不同的服务器上的技术,从而提升系统的性能。

1.2 负载均衡工具

负载均衡工具可以分分为客户端负载均衡工具和服务端负载均衡工具,它们的区别如下。

表1-1 负载均衡工具分类[1]

维度客户端负载均衡工具服务端负载均衡工具
决策位置客户端代码中实现中间层(如Nginx、负载均衡器)
灵活性高(支持自定义算法,如业务哈希)较低(依赖中间层配置)
性能开销客户端需计算实例选择,可能增加延迟额外网络跳转,可能成为瓶颈
容错性客户端需处理重试/降级中间层自动剔除故障节点
服务发现强依赖注册中心(如Eureka)可静态配置或动态集成
适用协议HTTP、gRPC、RPCHTTP、TCP、UDP
1.3 负载均衡算法

表1-2 负载均衡算法[2]

算法工作原理适用场景优点缺点
轮询(Round Robin)​按顺序依次分配请求(如A->B->C->A->B)服务器性能相近、无状态服务(如静态资源)简单公平,易于实现忽略服务器负载差异,性能不均时效率低
加权轮询(Weighted RR)​根据服务器性能分配权重(如5:3:2),高权重服务器获得更多请求服务器性能差异明显(如新旧硬件混合)按能力分配资源,优化利用率需手动配置权重,无法动态响应负载变化
最少连接(Least Connections)​优先选择当前连接数最少的服务器长连接服务(数据库、视频流)动态适应负载,避免服务器过载忽略服务器处理能力差异
加权最少连接(Weighted LC)​结合服务器权重和当前连接数,选择(连接数/权重)最小的服务器高性能异构集群(如混合云环境)兼顾性能与实时负载,资源利用率高算法复杂,需实时监控服务器状态
源IP哈希(IP Hash)​根据客户端IP计算哈希值,固定分配到同一服务器需会话保持的应用(如购物车、登录状态)保证会话一致性服务器故障时关联用户受影响
随机(Random)​完全随机分配请求测试环境或简单负载场景实现简单,无状态依赖分配不可控,可能造成负载不均
最快响应时间(Fastest Response)​选择响应时间最短的服务器对延迟敏感的应用(如金融交易)提升用户体验需持续监控服务器响应时间
一致性哈希(Consistent Hashing)​哈希环映射请求,服务器扩容/缩容时仅影响少量请求分布式缓存(Redis集群)减少节点变动的影响实现复杂度较高
动态性能分配(Dynamic Ratio)​根据CPU、内存等实时指标动态调整流量分配服务器性能波动大的场景精准匹配当前负载需高性能监控系统支持

二、Ribbon实战

2.1 项目结构

本项目使用Eureka作为注册中心,使用方法参见:Ereka实战。

图2-1 项目结构 

服务列表如下。其中SpringCloudEurekaProductApplication02和SpringCloudEurekaProductApplication为product服务的实例,创建步骤见:IDEA中一个服务创建多个实例。

图2-2 服务实例 

2.2 order模块新建以下代码

创建RestTemplate对象,并添加@LoadBalanced注解开启负载均衡。

@Configuration
public class LoadBalanceConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

创建控制器访问product服务。

@RestController
@RequestMapping("/loadBalance")
public class LoadBalanceController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/test")public String test(){String url = String.format("http://%s/loadTest", "spring-cloud-eureka-product");ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);return forEntity.getBody();}
}
2.2 product模块新建代码
@RequestMapping
@RestController
public class LoadBalanceController {// order在配置文件中设置@Value("${order}")private Integer order;@RequestMapping("/loadTest")public String loadTest(){return "服务器:" + order;}
}
2.3 运行

分别启动server、product、product02、order服务,启动成功后,访问注册中http://localhost:8080/,结果如下图所示。

图2-3 注册中心 

访问两次http://localhost:9003/loadTest,分别得到以下结果。后面的数字是两个product服务激活的配置文件中配置的order的值,分别为1和2。

图2-4 访问结果 

三、总结

核心点就是创建RestTemplate,然后添加@LoadBalance注解,使用RestTemplate对象方法时自动实现负载均衡。

参考

[1][2] 腾讯元宝

http://www.dtcms.com/a/277839.html

相关文章:

  • 【枚举+差分】P6070 『MdOI R1』Decrease
  • RAG升级:Re-rank模型微调,实现极致检索精度
  • 【读书笔记】《C++ Software Design》第八章 The Type Erasure Design Pattern
  • 虚拟线程,多线程,单线程
  • 小白成长之路-LVS
  • 神经网络的基础原理介绍(网络、传播、梯度、以及一些常见的神经网络原型介绍)
  • 【设计模式】策略模式(政策(Policy)模式)
  • pycharm+SSH 深度学习项目 远程后台运行命令
  • AI生成单词消消乐游戏. HTML代码
  • hercules zos 安裝 jdk 8
  • 【读书笔记】《C++ Software Design》第十章与第十一章 The Singleton Pattern The Last Guideline
  • MyBatis04-MyBatis小技巧
  • 【读书笔记】《Effective Modern C++》第六章 Lambda Expressions
  • Spring AI多模态API初体验:文字、图片、语音,一个接口全搞定!
  • 【研报复现】开源证券:均线的收敛与发散
  • DevOps
  • 深度学习图像分类数据集—玉米粒质量识别分类
  • 设计模式之单例模式:深入解析全局唯一对象的艺术
  • JVM 锁自动升级机制详解
  • 哈希扩展 --- 布隆过滤器
  • 肿瘤浸润淋巴细胞是什么,与三级淋巴结构的关系
  • 会计 - 22 - 外币折算
  • Linux713 SAMBA;磁盘管理:手动挂载,开机自动挂载,自动挂载
  • 补:《每日AI-人工智能-编程日报》--2025年7月12日
  • CTFSHOW pwn161 WP
  • 如何成为 PostgreSQL 中级专家
  • 论文学习_SemDiff: Binary Similarity Detection by Diffing Key-Semantics Graphs
  • 4G PPP模式与以太网接口在LwIP中的融合应用
  • JAVA AI智能体——1 入门
  • Redis 基础详细介绍(Redis简单介绍,命令行客户端,Redis 命令,Java客户端)