代码编织梦想

在上一节我们引入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 # 指定饥饿加载服务
  • 修改饥饿加载后启动日志

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

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

5.总结

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

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


思考问题

  • Ribbon是什么?解决了什么问题?
  • Ribbon实现的是客户端,还是服务端负载均衡?
  • Ribbon如何实现负载均衡?
  • 还有哪些技术点可以实现负载均衡?
  • 负载均衡算法?如何实现?还有哪些技术有体现?

6.推荐阅读资料

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38964895/article/details/129653674

springcloud(四)------ribbon负载均衡_houdezaiwu1的博客-爱代码爱编程

前言 在前一篇介绍了消费者调用,调用方式是通过loadBalancerClient ,这样做自己选择服务,然后 得到 ServiceInstance 对象,再用 restTemplate 发送调用,显得有些麻烦,ribbo

spring cloud学习|第二篇:负载均衡-ribbon_程序猿的酒的博客-爱代码爱编程

目录 1.简介2.使用RestTemplate与Ribbon进行消费服务3.LoadBalancerClient介绍4.Ribbon源码简单分析5.Ribbon配置5.1 设置全局策略5.2 定制化策略5.3 配置方

SpringCloud-Ribbon负载均衡式服务消费者-爱代码爱编程

Ribbon简介        Ribbon是Netflix发布的负载均衡器,它有助于控制HTTP和TCP的客户端的行为。为Ribbon配置服务提供者地址后,Ribbon就可基于某种负载均衡算法,自动地帮助服务消费者去请求。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等。当然,我们也可为Ribbon实现自定义的负载均衡算法。在Spring

客户端负载均衡-Ribbon 基础篇-爱代码爱编程

客户端负载均衡-Ribbon 基础篇 文章目录 客户端负载均衡-Ribbon 基础篇前言项目环境1.负载均衡简介1.1 集中式负载均衡1.2 客户端负载均衡2.什么是 Ribbon?3.RestTemplate 简介4.原生 Ribbon 示例5.RestTemplate & Ribbon 示例6.参考 前言 本章主要介绍 Ribb

客户端负载均衡-Ribbon 源码分析-爱代码爱编程

客户端负载均衡-Ribbon 源码分析 文章目录 客户端负载均衡-Ribbon 源码分析前言项目环境1.Ribbon 主要组件2.组件作用和联系3.静态配置 ServerList 示例4.@LoadBalanced 原理分析5.Serverlist 如何获取&更新5.1 获取 Serverlist5.2 更新 Serverlist5.1

ribbon 默认负载均衡 是什么_springcloud-ribbon负载均衡-爱代码爱编程

一 前言 经过几篇的cloud系列文章,我想大家都有一个坚实的基础,后续的学习就会轻松很多,如果是刚刚来看的读者需要有eureka基础知识,或者查阅知识追寻者的cloud系列专栏;这篇文章主要讲解如何使用ribbon实现web service客户端调用,ribbon默认算法实现负载均衡等! 二 ribbon简介 ribbon是一个客

Ribbon负载均衡和RestTemplate使用-爱代码爱编程

在 Spring Cloud中,提供的服务调用是 Ribbon和 OpenFeign。Ribbon是 Netflix公司开发的组件,OpenFeign也是基于 Ribbon实现的工具。 Spring Cloud Netflix Ribbon是一个基于HTTP和TCP的客户端负载均衡的组件工具,它对 Netflix Ribbon的二次封装。通过Spring

Spring Cloud-02-Ribbon负载均衡-爱代码爱编程

关于负载均衡 负载均衡⼀般分为服务器端负载均衡和客户端负载均衡 所谓服务器端负载均衡,⽐如Nginx、F5这些,请求到达服务器之后由这些负载均衡器根据⼀定的算法将请求路由到⽬标服务器处理。 所谓客户端负载均衡,⽐如我们要说的Ribbon,服务消费者客户端会有⼀个服务器地址列表,调⽤⽅在请求前通过⼀定的负载均衡算法选择⼀个服务器进⾏访问,负载均衡算法的

SpringCloud基础(二)Ribbon:负载均衡-爱代码爱编程

目录 1、基础使用 2、自带策略 2.1、RandomRule 随机 2.2、RoundRobinRule:轮询 2.3、RetryRule:重试 2.4、ZoneAvoidanceRule:默认的线性轮询 3、自定义策略 3.1、自定义选择 3.2、自定义策略 1、基础使用 Ribbon主要负责解决在集群部署时客户端选择连接到哪一个

springcloud入门实战:Feign+Ribbon实现客户端负载均衡-爱代码爱编程

Feign+Ribbon实现客户端负载均衡 理论上,如果服务端同一个服务提供者存在多个运行实例,一般的负载均衡方案分为以下两种: 1.服务端负载均衡 在消费者和服务提供者中间使用独立的反向代理服务进行负载均衡。可以通过硬件的方式提供反向代理服务,比如F5专业设备;也可以通过软件的方式提供反向代理服务,比如Nginx反向代理服务器;更多的情况是两种方式

springcloudalibaba篇(三)之ribbon负载均衡器_yli_jing的博客-爱代码爱编程

1、什么是Ribbon 目前主流的负载均衡大致有以下两种 服务端的负载均衡,比如nginx客户端的负载均衡,Ribbon就属于客户端自己做负载均衡Spring Cloud Ribbon是基于Netflix实现的一套客户端的负载均衡工具,Ribbon客户端组件提供一系列的完善的配置,如超时、重试等,通过Load Balancer获取到服务提供的所有机器实

springcloud alibaba整合ribbon负载均衡_藤井大叔的博客-爱代码爱编程

SpringCloud Alibaba整合Ribbon负载均衡 什么是Ribbon常见的负载均衡算法随机轮询加权轮询地址Hash最小连接数 Ribbon的使用Ribbon负载均衡策略随机负载均衡器(RandomR

springcloud-爱代码爱编程

文章目录 前言一、Ribbon二、使用步骤1.引入库2.使用3.IRule4.IRule定制化5.Ribbon负载均衡算法 前言 大致学习了以下SpringCloud中的Ribbon