Ribbon负载均衡

简介: 负载均衡是高并发系统中的关键技术,通过将流量分摊至多台服务器,提升系统性能与可用性。本文详解负载均衡概念、分类(硬件/软件)、常用算法及Ribbon的实现原理,涵盖自定义策略与饥饿加载优化,帮助读者深入理解客户端负载均衡机制。

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 # 指定饥饿加载服务
  • 修改饥饿加载后启动日志

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

至此我们的工程如下,有需自行下载导入📎cloud.zip

5.总结

上一节就已经实现的负载均衡笔者并未深入探讨,本节通过分析负载均衡算法、Ribbon实现负载均衡的底层原理和实现过程,让大家对负载均衡有了一个大体认识,同时针对Ribbon自定义负载均衡策略,饥饿加载让大家对于Ribbon的了解又多一些。Ribbon实现的负载均衡只是方案之一,我们可以尽量多了解但不要局限于此。

负载均衡作为现如今架构必须考量的一个点,要了解和深入学习的地方还很多,如下一节我们要学习的Nacos是怎么实现的?它为什么反其道而行要在服务端实现?ZK也可作为注册中心它是怎么实现的?网关GateWay也可做负载均衡它又是怎么实现的呢?篇幅问题,更多的答案留给读者朋友们在未来的工作生涯中慢慢思考。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
消息中间件 Java Nacos
SpringCloud概述
Spring Cloud是微服务的统一解决方案,具备注解驱动、开箱即用、组件丰富等特点,通过版本命名规范整合多子项目。Spring Cloud Alibaba融合Nacos、Sentinel、Seata等阿里开源组件,成为主流技术栈选择。
|
2月前
|
存储 负载均衡 算法
负载均衡算法
本文介绍多种负载均衡算法:随机、轮询、最小活跃数、源地址哈希及一致性哈希,涵盖适用场景与实现原理,结合代码与图示解析其调度机制,适用于分布式系统流量管理。
|
2月前
|
存储 Java 关系型数据库
微服务概述
本文介绍单体架构与微服务架构的区别,阐述微服务的定义、核心特征及优缺点,涵盖技术选型、部署方案与常见问题,帮助读者理解微服务演进逻辑,为后续实践打下理论基础。(238字)
|
2月前
|
XML JSON Java
什么是RESTful
RESTful是一种基于资源的API设计规范,强调URI代表资源、使用HTTP动词进行操作,实现统一标准、结构清晰、易于维护的接口风格,解决传统接口行为不规范问题。
|
2月前
|
消息中间件 Java 数据安全/隐私保护
异步消息组件MQ基础
本文介绍了MQ(消息队列)的基本概念,重点对比了同步调用与异步调用的区别,通过生活实例帮助理解。异步调用通过消息中间件实现解耦、异步处理和流量削峰,提升系统性能。常见的MQ如RabbitMQ、Kafka等适用于高并发场景。RabbitMQ基于AMQP协议,支持多语言,结合SpringAMQP可轻松实现消息收发。文章还演示了RabbitMQ的安装、配置、数据隔离及工作队列模型,强调“能者多劳”机制以优化消费效率。
异步消息组件MQ基础
|
2月前
|
负载均衡 Java 应用服务中间件
微服务网关与配置中心
本文介绍了微服务架构下的网关路由与鉴权机制,重点讲解使用Spring Cloud Gateway实现请求路由、负载均衡及JWT身份校验。通过Nacos实现服务发现,网关统一处理前端请求,解决多入口问题,并在全局过滤器中实现用户鉴权,保障系统安全。
|
2月前
|
关系型数据库 应用服务中间件 nginx
容器化部署引擎Docker
Docker是一种容器化技术,通过镜像打包应用及依赖,实现跨环境快速部署。它利用容器隔离运行应用程序,解决依赖冲突与环境差异问题,相比虚拟机更轻量、高效。
|
2月前
|
负载均衡 Java 数据安全/隐私保护
Gateway服务网关
网关是微服务架构的统一入口,核心功能包括请求路由、权限控制、限流及负载均衡。通过Spring Cloud Gateway可实现高效路由转发与过滤器处理,支持跨域配置,提升系统安全与性能。
Gateway服务网关
|
2月前
|
Java 数据库 微服务
微服务服务注册与发现
本文介绍了微服务架构的演进与实践。针对单体架构在团队协作、发布效率、扩展性等方面的局限,微服务通过将系统拆分为多个独立部署、单一职责的小型服务,实现高内聚、低耦合,提升系统的可维护性与伸缩能力。结合Spring Cloud与Spring Cloud Alibaba技术栈,文章以黑马商城项目为例,演示了如何创建微服务工程、进行服务拆分,并使用RestTemplate实现服务间远程调用,帮助开发者掌握微服务核心开发技能。
微服务服务注册与发现
|
2月前
|
Java Maven Nacos
Eureka服务注册与发现
本文详细介绍Eureka工程的搭建与部署,包括服务注册中心的创建、user-service和order-service接入流程,并实现多实例部署。通过配置说明与常见问题解决方案,帮助开发者快速掌握SpringCloud服务注册与发现机制,为后续微服务架构演进奠定基础。(239字)