Ribbon负载均衡

简介: 本节深入解析Ribbon负载均衡机制,介绍其为何在RestTemplate上添加@LoadBalanced注解。Ribbon通过客户端实现负载均衡,结合Eureka服务发现,利用拦截器选择服务实例并重写请求地址。文章详解了负载均衡分类、常见算法、Ribbon自定义策略及饥饿加载优化,并引导读者思考不同架构下的负载均衡实现差异。

Ribbon负载均衡
在上一节我们引入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.代码声明式注册
在启动类追加以下代码即可,此优先级更高,但修改必须重启应用,且全局生效
通过查看IRule实现类,可以做其余负载均衡实现方案的更多测试
2.配置文件声明式配置
此配置优点在于不用重启应用,打包发布,但缺点是无法做到全局配置,必须声明规则对应的服务
4.Ribbon饥饿加载
在上述的测试中不知是否有读者发现:当请求第一次到某个实例时,其响应速度明细要慢一点,这里就是因为Ribbon默认采用饥饿加载,只有访问时才会创建LoadBalanceClient,从而导致第一次时间要长点,日志如下:
修改饥饿加载前启动日志
修改饥饿加载前访问日志
修改饥饿加载机制,通过在配置文件中追加以下配置即可
配置饥饿加载
YAML
复制代码
1
2
3
4
ribbon:
eager-load:
enabled: true # 开启饥饿加载
clients: userservice # 指定饥饿加载服务
修改饥饿加载后启动日志
修改饥饿加载后访问日志
至此我们的工程如下,有需自行下载导入:
cloud.zip
(52 KB)
5.总结
上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。
负载均衡作为现如今架构必须考量的一个点,要了解和深入学习的地方还很多,如下一节我们要学习的Nacos是怎么实现的?它为什么反其道而行要在服务端实现?ZK也可作为注册中心它是怎么实现的?网关GateWay也可做负载均衡它又是怎么实现的呢?篇幅问题,更多的答案留给读者朋友们在未来的工作生涯中慢慢思考。
思考问题
Ribbon是什么?解决了什么问题?
Ribbon实现的是客户端,还是服务端负载均衡?
Ribbon如何实现负载均衡?
还有哪些技术点可以实现负载均衡?
负载均衡算法?如何实现?还有哪些技术有体现?
6.推荐阅读资料
了解负载均衡算法:阿里云实操课程链接
掌握Ribbon实现负载均衡原理:本文链接

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
1天前
|
存储 缓存 搜索推荐
特别加餐丨倒排检索加速(二):如何对联合查询进行加速?
本文深入探讨联合查询的加速方法,针对倒排索引中复杂查询场景,系统介绍四种工业级优化技术:调整次序法通过优化求交/并集顺序降低计算代价;快速多路归并法利用跳表提升多列表合并效率;预先组合法提前计算高频查询结果;缓存法则借助LRU机制动态存储热点组合,显著提升检索性能。
|
1天前
|
SQL 安全 关系型数据库
了解SQL注入
SQL注入是利用Web应用输入验证缺陷,将恶意SQL代码插入数据库查询,从而绕过认证、窃取数据或执行系统命令的攻击方式。常见于用户输入未严格过滤的场景,如登录框。攻击者可通过构造特殊语句操控数据库逻辑,造成信息泄露、数据篡改等严重后果。OWASP将其列为头号Web安全威胁。防御需结合参数化查询、输入验证与错误信息管控。
9 1
|
1天前
|
监控 Java 应用服务中间件
微服务保护Sentinel
本课程系统讲解微服务雪崩问题及Sentinel解决方案,涵盖限流、熔断、隔离、降级等核心机制。通过实战掌握Sentinel部署、三种流控模式(直接、关联、链路)、四种流控效果(快速失败、预热、排队)、Feign整合、线程隔离与授权规则,并了解规则持久化方案,全面提升微服务稳定性与高可用能力。
17 0
|
1天前
|
存储 NoSQL Linux
Redis集群部署指南
本教程基于CentOS7详解Redis集群部署,涵盖单机安装、主从复制、哨兵高可用及分片集群搭建。通过多实例模拟真实环境,深入讲解配置、启动、主从切换与数据读写测试,助你掌握Redis分布式架构核心技能。
11 0
|
1天前
|
SQL 容灾 Nacos
Seata的部署和集成
本文介绍Seata分布式事务框架的部署与集成。首先下载并解压seata-server-1.5.1,修改application.yml配置,将seataServer.properties配置上传至Nacos作为统一配置中心,并创建所需数据库表。启动tc-server后,注册到Nacos,通过控制台可查看服务状态。各微服务需引入Seata依赖,并在application.yml中配置相关参数。为实现高可用,可搭建多节点TC集群,如GZ和HZ集群,通过Nacos统一管理事务组映射,微服务从Nacos读取client.properties配置,动态切换TC集群连接,提升系统容灾能力。
13 0
|
1天前
|
消息中间件 存储 NoSQL
Mac系统安装教程
本文介绍在Mac系统上安装RabbitMQ的两种方法:通过Homebrew一键安装和二进制文件手动安装。RabbitMQ是基于AMQP协议的开源消息代理,支持异步通信、解耦服务,在微服务架构中广泛应用。教程涵盖安装、启动、验证全过程,附官网及参考链接,适合初学者快速上手部署。
18 0
|
1天前
|
JSON Dubbo Java
Feign远程调用
Feign简化Spring Cloud微服务间HTTP调用,替代RestTemplate,解决硬编码、可读性差问题。通过注解声明客户端,集成注册中心实现服务发现。支持自定义日志、编码器、连接池(如Apache HttpClient)优化性能,并可通过抽取公共模块实现最佳实践,提升代码复用与维护性。(238字)
18 0
|
1天前
|
存储 缓存 NoSQL
分布式缓存Redis(高级)
本课程深入讲解Redis高级应用,涵盖持久化机制(RDB/AOF)、主从同步、哨兵集群、分片集群搭建与故障转移,结合SpringBoot实战RedisTemplate集成,助力掌握高可用、高性能的分布式缓存架构设计与落地。
13 0
|
1天前
|
消息中间件 Shell Linux
RabbitMQ部署指南
本指南详细介绍RabbitMQ在CentOS7中基于Docker的单机与集群部署,涵盖DelayExchange插件安装、普通模式与镜像模式集群搭建、仲裁队列配置及高可用测试,助力实现稳定可靠的消息队列服务。
15 0
|
1天前
|
消息中间件 存储 Java
消息中间件RabbitMQ(高级)
本节深入RabbitMQ高级特性,涵盖消息可靠性保障、持久化、消费者确认与重试机制,结合TTL与死信交换机实现延迟队列,通过惰性队列解决消息堆积,并详解普通集群、镜像集群及仲裁队列的搭建与应用,全面提升RabbitMQ在生产环境中的高可用与稳定性。
18 0