Ribbon负载均衡

简介: 本文深入解析Spring Cloud中@LoadBalanced注解的作用,详解Ribbon如何在客户端实现负载均衡,涵盖负载均衡原理、算法分类、硬件与软件方案对比,并介绍Ribbon自定义策略及饥饿加载优化。通过源码流程与配置示例,帮助读者全面掌握Ribbon核心机制,为后续学习Nacos、Gateway等负载均衡实现打下基础。(238字)

在上一节我们引入Eureka的同时,不知读者朋友们是否还有印象:我们在启动类getRestTemplate方法上追加了注解 @LoadBalanced,为什么加这个注解?这个注解解决了什么问题?本节笔者将给读者们做详尽的讲解。
1.负载均衡
1.1 什么是负载均衡
传统架构下的网站,随着流量的增加,高并发、海量数据的挑战逐步而来。为了提升系统的性能,架构师们往往开始从垂直扩展、水平扩展两个角度来解决问题:
垂直扩展
网站发展的早期可以通过增加服务器的硬件处理能力:CPU、内存、磁盘等方面提升服务器处理的能力,然而单机的瓶颈总是存在的,一旦触及瓶颈想再提升,付出的成本会极高,显然这不符合分布式系统的设计理念。
水平扩展
通过集群部署的方式,将一台服务器的请求压力,分摊到多台机器上,集群中的应用服务器通常被设计成无状态。但是如何将流量均匀分摊到各机器上,或优先分配到高性能机器上又成了一个问题,由此引申出“负载均衡”的概念。
负载均衡(Load Balance)是如今高并发、高可用系统中不可或缺的关键组件,目标是:尽力将用户流量按照架构设计分发(并非一定均匀)到集群中多台服务器上,从而提高系统整体的响应速度和可用性。
1.2 负载均衡分类
硬件负载均衡(包括但不限于)
● F5
● A10
软件负载均衡(包括但不限于)
● Nginx
● HAProxy
● LVS
1.3 负载均衡算法
为不影响章节重点,需做进一步了解的可移步:负载均衡算法
2.Ribbon如何实现负载均衡
Ribbon与大多数负载均衡实现机制一样在客户端实现(不同于后续我们讲解的Nacos,Nacos在服务端实现),其主要流程为:
● 在RestTemplate标注@LoadBalanced注解,此时通过RestTemplate发起的RESTful请求都会被负载均衡
● 当请求发起时,会被LoadBalancedInterceptor拦截,其主要实现两个功能:
○ 从多个可用Server中选择一个Server,选择算法即上述1.3中之一
○ 重构请求URI:服务名-->具体ip、端口
● LoadBalancerClient内部持有LoadBalancer并调用getServer方法得到一个Server,而这个Server是通过Eureka服务注册,ILoadBalancer持有的upServerList、allServerList中获取(底层依赖ServerListUpdater动态更新所有serverList)
完整源码交互流程总结如下,感兴趣的可做进一步研究:

3.Ribbon自定义负载均衡策略
1.代码声明式注册
在启动类追加以下代码即可,此优先级更高,但修改必须重启应用,且全局生效
@Bean
public IRule getRandomRule() {
return new RandomRule();
}
通过查看IRule实现类,可以做其余负载均衡实现方案的更多测试

2.配置文件声明式配置
此配置优点在于不用重启应用,打包发布,但缺点是无法做到全局配置,必须声明规则对应的服务
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则
4.Ribbon饥饿加载
在上述的测试中不知是否有读者发现:当请求第一次到某个实例时,其响应速度明细要慢一点,这里就是因为Ribbon默认采用饥饿加载,只有访问时才会创建LoadBalanceClient,从而导致第一次时间要长点,日志如下:
● 修改饥饿加载前启动日志

● 修改饥饿加载前访问日志

修改饥饿加载机制,通过在配置文件中追加以下配置即可
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: userservice # 指定饥饿加载服务
● 修改饥饿加载后启动日志

● 修改饥饿加载后访问日志

至此我们的工程如下,有需自行下载导入:
5.总结
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
负载均衡作为现如今架构必须考量的一个点,要了解和深入学习的地方还很多,如下一节我们要学习的Nacos是怎么实现的?它为什么反其道而行要在服务端实现?ZK也可作为注册中心它是怎么实现的?网关GateWay也可做负载均衡它又是怎么实现的呢?篇幅问题,更多的答案留给读者朋友们在未来的工作生涯中慢慢思考。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
缓存 前端开发 API
掌握无限可能:GraphQL在前端开发中的华丽变身
在前端开发领域,GraphQL作为一种革命性的查询语言和API规范,正逐渐崭露头角。本文将介绍GraphQL在前端开发中的应用,探讨其优势和实践经验。通过使用GraphQL,开发者可以轻松构建高效、灵活且可扩展的前端应用,极大地提升开发效率和用户体验。
|
5月前
|
NoSQL Java MongoDB
ongoDB实战演练
本项目实现头条文章评论功能,基于SpringDataMongoDB操作MongoDB数据库,支持评论的增删改查、按文章ID查询及点赞功能。构建article微服务模块,设计Comment实体类,封装评论信息,集成mongodb-driver驱动,完成持久化操作。
|
4月前
|
人工智能 JavaScript Java
多 AI 协同 + SDD 编程实践:一个 AI 全流程交付实录
本文提出Spec-Driven Development(SDD)范式,以解决AI编码中“写得快但写不对”的痛点。通过OpenSpec工具实现规范先行、分阶段验证,并构建Claude+Codex+Gemini多模型协同工作流,确保复杂业务(如跨境保险)下代码的高质量、可复现与可靠交付。(239字)
多 AI 协同 + SDD 编程实践:一个 AI 全流程交付实录
|
3月前
|
应用服务中间件 网络安全 nginx
Docker部署OpenClaw(Clawdbot) 绑定域名HTTPS开启公网访问 附阿里云快速部署步骤
在2026年AI自动化工具普及的背景下,OpenClaw(曾用名Moltbot、Clawdbot)凭借强大的任务执行能力、多场景适配特性,成为个人与轻量团队打造专属AI助手的热门选择。然而传统部署方式常受限于服务器已有服务,无法直接重装镜像,而Docker容器化部署完美解决这一痛点——通过隔离环境实现OpenClaw独立运行,不影响现有服务,同时支持灵活迁移与扩展。本文将详细拆解Docker部署OpenClaw的全流程,包含SSL证书申请、Nginx反向代理、域名绑定、HTTPS配置等关键步骤,所有代码命令可直接复制执行,同时新增阿里云OpenClaw快速部署步骤,满足不同用户的部署需求
4701 1
|
4月前
|
IDE 安全 开发工具
告别频繁切换分支!用 Git Worktrees + Claude Code 构建高效并行开发流
本文介绍 Git Worktrees 与 Claude Code 的高效组合:用 Worktrees 创建多分支独立工作区,零拷贝、秒级切换;Claude 则在隔离环境中安全试错、并行开发。告别 stash 焦虑,实现真正并行开发流。(239字)
3020 1
|
6月前
|
人工智能 监控 算法
Transformer模型训练全解析:从数据到智能的炼金术
模型训练是让AI从数据中学习规律的过程,如同教婴儿学语言。预训练相当于通识教育,为模型打下通用知识基础;后续微调则针对具体任务。整个过程包含数据准备、前向传播、损失计算、反向更新等步骤,需克服过拟合、不稳定性等挑战,结合科学与艺术,最终使模型具备智能。
|
5月前
|
存储 JSON NoSQL
MongoDB常用命令
本案例介绍如何使用MongoDB存储文章评论数据。通过`use articledb`创建并切换数据库,利用`db.createCollection()`显式或插入文档时隐式创建集合。文档以BSON格式存储,使用`insert()`方法添加数据,如评论内容、用户信息等。支持查看数据库与集合、删除操作,并遵循命名规范。适用于掌握MongoDB基本CRUD操作。(238字)
|
5月前
|
消息中间件 Kafka 数据库
异步消息组件MQ基础
本课程学习MQ应用场景及RabbitMQ入门,掌握同步与异步调用区别,理解消息队列的解耦、异步处理与流量削峰作用,熟悉RabbitMQ收发消息、多种交换机类型及队列特性,并应用于商城项目中。
|
8月前
|
SQL 测试技术 数据库
healenium+python+selenium
上次介绍了如何利用healenium+java+selenium来实现selenium的自愈,这次介绍如何healenium+python+selenium。关于healenium+python+selenium网上资料更少,并且甚至是错误的。在著名的书籍《软件测试权威指南中》也是有一定问题的。现在介绍如下
440 4