【SpringCloud】负载均衡

目录

  • 负载均衡
    • 什么是负载均衡
    • 生活场景
    • 为什么需要负载均衡
    • 负载均衡手段
      • 负载均衡总的来说有两种实现手段
      • 负载均衡具体可以通过多种手段来实现
    • SpringCloud中的负载均衡组件
      • Ribbon VS Nginx负载均衡区别
        • 集中式LB
        • 进程内LB
  • Ribbon
    • Ribbon的工作原理
      • Ribbon在工作时分成两步
    • 使用
      • 1.提供者集群
      • 2.引入依赖
      • 4.测试
  • Ribbon的负载均衡策略
    • 核心组件
    • 轮询
    • 随机
      • 代码案例
    • 权重
      • 代码案例
    • 最小连接数
      • 代码案例
    • 重试
      • 代码案例
    • 可用性敏感策略
      • 代码案例
    • 区域敏感策略
      • 代码案例
  • 总结

负载均衡

什么是负载均衡

  • 负载均衡(Load Balancing)是指在分布式系统中,将工作负载(Workload)平均分配给多个服务器或计算机资源,以提高系统的性能、可靠性和可扩展性。
    在这里插入图片描述

生活场景

  • 我们在日常生活中经常免不了要去一些比较拥挤的地方,比如地铁站、火车站、电影院、银行等。无论是买票,还是排队入场,这些场所一般都会设置多个服务点或者入口的。如果没有人引导的话,大多数情况下,最近的入口会挤满人。而哪些距离较远的服务点或者入口就宽松很多。
    在这里插入图片描述
  • 这种情况下,就会大大浪费资源,因为如果可以把这些排队的人很好的分散到各个入口的话会大大缩短排队时间。其实,软件的建设也是一样的。为了提升系统的服务能力,很多网站采用集群部署,就像话剧院有多个入口一样。这时候,就需要一个协调者,来均衡的分配这些用户的请求,可以让用户的可以均匀的分派到不同的服务器上。

在这里插入图片描述

为什么需要负载均衡

负载均衡是一种分配和管理网络流量的技术,主要用于确保网络服务的高可用性、可扩展性和性能优化。以下是需要负载均衡的主要原因:

  1. 高可用性:负载均衡可以将流量分配到多个服务器上,当其中一台服务器发生故障时,流量会自动转移到其他正常工作的服务器上,从而确保服务的连续性和可用性。

  2. 扩展性:负载均衡可以将流量分布到多个服务器上,允许系统根据需要动态地添加或删除服务器。这样可以更好地应对流量的增长和业务的扩展。

  3. 性能优化:负载均衡可以根据服务器的负载情况将流量分配到最空闲或最适合处理当前请求的服务器上,从而提高系统的响应速度和吞吐量。

  4. 故障恢复:当一台服务器发生故障时,负载均衡可以自动将流量转移到其他正常工作的服务器上,从而实现快速的故障恢复,减少服务中断时间。

  5. 节约成本:通过负载均衡,可以充分利用服务器的资源,提高服务器的利用率,从而减少不必要的硬件投入和维护成本。

总的来说,负载均衡是一种提高系统性能、可用性和可扩展性的重要技术,适用于各种网络应用和服务。

负载均衡手段

负载均衡总的来说有两种实现手段

一种是服务端负载均衡器,另一种是客户端负载均衡器

  • 服务端负载均衡器的问题是,它提供了更强的流量控制权,但无法满足不同的消费者希望使用不同负载均衡策略的需求,而使用不同负载均衡策略的场景确实是存在的,所以客户端负载均衡就提供了这种灵活性。
  • 客户端负载均衡也有其缺点,如果配置不当,可能会导致服务提供者出现热点,或者压根就拿不到任何服务的情况
  • 服务端负载均衡器和客户端负载均衡器的区别如下图所示
    在这里插入图片描述在这里插入图片描述
  • 客户端负载均衡器的实现原理是通过注册中心,如 Nacos,将可用的服务列表拉取到本地(客户端),再通过客户端负载均衡器(设置的负载均衡策略)获取到某个服务器的具体 ip 和端口,然后再通过 Http 框架请求服务并得到结果,其执行流程如下图所示:
    在这里插入图片描述

负载均衡具体可以通过多种手段来实现

以下是一些常见的负载均衡手段:

  1. 基于DNS的负载均衡:通过使用DNS来将流量分布到不同的服务器上。在DNS解析请求时,返回多个服务器的IP地址,客户端根据返回的IP地址选择一个服务器进行连接。

  2. 集中式负载均衡:使用专门的负载均衡设备(如负载均衡器或负载均衡服务器)来分发流量。这些设备通常位于服务器和客户端之间,根据特定的算法将流量分配到不同的服务器上。

  3. 分布式负载均衡:将负载均衡的功能分散到多个服务器上,每个服务器都负责分发一部分的流量。这种方式可以提高系统的扩展性和容错性。

  4. 会话保持(Session Affinity):某些应用需要保持与特定服务器的会话状态,这需要负载均衡器将同一用户的请求始终分发到同一台服务器上,以保证会话的连续性。

  5. 基于内容的负载均衡:根据请求的内容或URL等特征来进行负载均衡。例如,可以根据请求的路径将静态资源请求分发到专门处理静态资源的服务器。

  6. 哈希负载均衡:根据客户端请求的特征(如IP地址、用户标识等)计算哈希值,将相同哈希值的请求定向到同一台服务器上。这可以保证相同请求始终分发到同一台服务器上。

需要注意的是,不同的负载均衡手段适用于不同的场景和需求,需要根据具体的应用和系统来选择合适的负载均衡策略。

SpringCloud中的负载均衡组件

  • 在spring cloud H版大部分使用的负载均衡组件就是Ribbon和OpenFegin
  • 而在spring cloud跟新后官方宣布在 SpringCloud 2020版本以后 SpringCloud剔除掉了 除了eureka-server与 eureka-client 除外的所有 Netflix组件,spring也给出了使用spring cloud Loadbalancer替代的方案
  • 但就在目前,Ribbon以及OpenFegin仍然是主流的负载均衡的方案

Ribbon VS Nginx负载均衡区别

  • Nginx是服务器负载均衡,客户端所有请求都会交给Nginx,然后由Nginx实现转发请求。即负载均衡是由服务端实现的。
  • Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
集中式LB
  • 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;
进程内LB
  • 将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。
  • Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

在这里插入图片描述在这里插入图片描述

Ribbon

  • Ribbon 是 Spring Cloud 技术栈中非常重要的基础框架,它为 Spring Cloud 提供了负载均衡的能力
  • 比如 Fegin 和 OpenFegin 都是基于 Ribbon 实现的,就连 Nacos 中的负载均衡也使用了 Ribbon 框架。
  • Ribbon 框架的强大之处在于,它不仅内置了 7 种负载均衡策略,同时还支持用户自定义负载均衡策略,所以其开放性和便利性也是它得以流行的主要原因。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。

  • Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。
  • 简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。
  • 我们很容易使用Ribbon实现自定义的负载均衡算法。

Ribbon的工作原理

在这里插入图片描述

Ribbon在工作时分成两步

  • 第一步先选择 EurekaServer ,它优先选择在同一个区域内负载较少的server.
  • 第二步再根据用户指定的策略,在从server取到的服务注册列表中选择一个地址。
  • 其中Ribbon提供了多种策略:比如轮询、随机和根据响应时间加权。

使用

1.提供者集群

复制几个demo-user-provider服务,只需要保证端口不一致就可以,其他配置一致,尤其是服务名称必须要一致,因为对于注册中心而言,多个demo-user-provider服务实例的作用都是一样的,就像是在食堂打饭,多个窗口的饭是一样的,就是多个实例,但是都同属于一个服务
在这里插入图片描述

2.引入依赖

  • 其实引入了Eureka的坐标即可,spring-cloud-starter-netflix-eureka-client自带了spring-cloud-starter-ribbon引用
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

在这里插入图片描述

4.测试

访问:localhost:8084/consumer/doLogin
在这里插入图片描述

Ribbon的负载均衡策略

核心组件

  • 根据特定算法中从服务列表中选取一个要访问的服务
  • 通过在容器中注入这个接口的不同实现类就可以实现不同的负载均很算法
    在这里插入图片描述

轮询

  • 由上图可知,Ribbon 默认的负载均衡策略是轮询模式
  • 轮询策略:RoundRobinRule,按照一定的顺序依次调用服务实例。
  • 比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3,依次类推

随机

  • 随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例

代码案例

添加配置类

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule myRule() {
        return new RandomRule(); // 返回随机策略的Bean
    }
}

再访问:
在这里插入图片描述

权重

  • 权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。
  • 它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大

代码案例

配置类

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule myRule() {
        //return new RandomRule(); // 返回随机策略的Bean
        return new WeightedResponseTimeRule(); // 返回权重策略的Bean
    }
}

最小连接数

  • 最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。
  • 如果有相同的最小连接数,那么会调用轮询策略进行选取

代码案例

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule myRule() {
        //return new RandomRule(); // 返回随机策略的Bean
        //return new WeightedResponseTimeRule(); // 返回权重策略的Bean
        return new BestAvailableRule(); // 返回最小连接数策略的Bean
    }
}

重试

  • 重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务
  • 如果超过指定时间依然没获取到服务实例则返回 null

代码案例

@Configuration
public class RibbonConfiguration {
    @Bean
    public IClientConfig ribbonClientConfig() {
        DefaultClientConfigImpl config = new DefaultClientConfigImpl();
        return config;
    }

    @Bean
    public IRule myRule(IClientConfig config) {
        //return new RandomRule(); // 返回随机策略的Bean
        //return new WeightedResponseTimeRule(); // 返回权重策略的Bean
        config.setProperty(IClientConfigKey.Keys.ConnectTimeout,2000);// 设置连接超时为2000毫秒
        config.setProperty(IClientConfigKey.Keys.ReadTimeout,5000);// 设置读取超时为5000毫秒
        return new BestAvailableRule(); // 返回最小连接数策略的Bean
    }
}

可用性敏感策略

  • 可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例

代码案例

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule myRule(IClientConfig config) {
        //return new RandomRule(); // 返回随机策略的Bean
        //return new WeightedResponseTimeRule(); // 返回权重策略的Bean
        //return new BestAvailableRule(); // 返回最小连接数策略的Bean
        return new AvailabilityFilteringRule(); // 返回可用性敏感策略的Bean
    }
}

区域敏感策略

  • 区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。

代码案例

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule myRule(IClientConfig config) {
        //return new RandomRule(); // 返回随机策略的Bean
        //return new WeightedResponseTimeRule(); // 返回权重策略的Bean
        //return new BestAvailableRule(); // 返回最小连接数策略的Bean
        //return new AvailabilityFilteringRule(); // 返回可用性敏感策略的Bean
        return new ZoneAvoidanceRule(); // 返回区域敏感策略的Bean
    }
}

总结

类 型说 明
WeightedResponseTimeRule权重:根据响应时间分配一个weight(权重),响应时间越长,weight越小,被选中的可能性越低
RoundRobinRule轮询:轮询选择server(此为默认的负载均衡策略)
RandomRule随机:随机选择一个server
ZoneAvoidanceRule区域敏感策略:复合判断server所在区域的性能和server的可用性选择server
RetryRule重试:在一个配置时间段内,当选择server不成功时一直尝试重新选择
BestAvailableRule最小连接:选择一个并发请求最小的server
AvailabilityFilteringRule可用性敏感策略:过滤掉那些因为一直连接失败而被标记为circuit tripped的server,并过滤掉那些高并发的server(active connections 超过配置的阈值)
  • Ribbon 为客户端负载均衡器,相比于服务端负载均衡器的统一负载均衡策略来说,它提供了更多的灵活性。
  • Ribbon 内置了 7 种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略
  • 并且用户可以通过继承 RoundRibbonRule 来实现自定义负载均衡策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/653269.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《KAN》论文笔记

原文出处 KAN: Kolmogorov–Arnold Networks (arxiv.org)https://arxiv.org/html/2404.19756v1 论文笔记 What 《KAN: Kolmogorov–Arnold Networks》——我们提出了 KolmogorovArnold Networks (KANs) 作为多层感知器 (MLP) 的有前途的替代方案。 我们表明&#xff0c;这…

.NET File Upload

VS2022 .NET8 &#x1f4be;基础上传示例 view {ViewData["Title"] "File Upload"; }<h1>ViewData["Title"]</h1><form method"post" enctype"multipart/form-data" action"/Home/UploadFile"…

MySQL 数据备份实战

文章目录 前言简介一、数据备份导出SQL文件第一步&#xff1a;登录MySQL第二步&#xff1a;选中数据库第三步&#xff1a;数据导出SQL文件 二、还原SQL文件第一步&#xff1a;登录MySQL第二步&#xff1a;创建数据库第三步&#xff1a;选中数据库第三步&#xff1a;终端命令行语…

探索超构光子学与人工智能相结合的下一代研究趋势

欢迎关注GZH《光场视觉》 一个研究小组在《固体与材料科学当前观点》&#xff08;Current Opinion in Solid State and Materials Science&#xff09;杂志上发表了一篇论文&#xff0c;强调了将超构 光子学研究与人工智能相结合的下一代研究趋势。超透镜引发了光学领域的一场…

[Linux]磁盘管理

一.Linux磁盘管理的原理 磁盘分区与Linux的目录是借助"挂载机制"链接的&#xff0c;将一个分区与一个目录连接起来。访问目录&#xff0c;相当于访问某块分区 lsblk命令: lsblk命令可以查看磁盘分区&#xff0c;以及每个分区所挂载的目录 lsblk -f 可以查看更细节的…

SurfaceFinger layer创建过程

SurfaceFinger layer创建过程 引言 本篇博客重点分析app创建Surface时候&#xff0c;SurfaceFlinger是如何构建对应的Layer的主要工作有那些&#xff01; 这里参考的Android源码是Android 13 aosp&#xff01; app端创建Surface 其核心流程可以分为如下接部分: app使用w,h,fo…

智慧校园学工管理系统的部署

学工体系思政服务该怎么规划建造&#xff1f;思政作为高校育人的中心使命&#xff0c;在做到让学生健康高兴生长的一起&#xff0c;也应满意学生生长成才的各类需求。使用技术为学生供给优质的信息化服务&#xff0c;是其间的有效途径。大数据让个性化教育成为可能&#xff0c;…

数据库|基于T-SQL添加默认约束、外键约束、内连接查询

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 前边学习了基于T-SQL48_47.基于T-SQL添加数据、CRUD操作、标识列详解&#xff1a;《数据库|基于T-SQL向数据库数据表中添加、修改、删除数据》 接下来接着学习基于T-SQL添加默认约束、外键约束、内连接查询&#xff0c…

基于直接二元搜索的片上偏振分束器设计 (Nature Photonics, 9, 6, (2015))案例复现

时间—2024.6.08 腾讯会议 智能算法驱动的光子学设计与应用

Python装饰器的应用

Python 中的装饰器是一种语法糖&#xff0c;可以在运行时&#xff0c;动态的给函数或类添加功能。装饰器本质上是一个函数&#xff0c;使用 函数名就是可实现绑定给函数的第二个功能 。它的作用就是在不修改被装饰对象源代码和调用方式的前提下为被装饰对象添加额外的功能。 …

小程序大能量:盲盒平台搭建与营销策略

一、引言 在移动互联网的浪潮下&#xff0c;小程序以其轻量级、即用即走的特点&#xff0c;成为了商家与消费者沟通的新桥梁。盲盒经济作为近年来兴起的消费趋势&#xff0c;结合小程序平台&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家带来了更多的商业机…

【前端常见面试题整理】

开放性的题目 自我介绍 突出学习能力 我想换工作的主要原因是 介绍项目 平时是如何学习前端开发的 主要就是两个途径&#xff0c;一个是查阅官方文档&#xff0c;然后就是在网上查找技术资料或者视频去学习。平时没事的时候也会看看github&#xff0c;同时关注一些社区和IT网…

企企通入选第一新声《2024年中国CIO数字化产品选型白皮书》供应链数字产品可信名录

近日&#xff0c;第一新声研究院根据多年产业数字化研究&#xff0c;历经近半年时间&#xff0c;并综合近200位CIO调研与推荐意见&#xff0c;发布《2024年中国CIO数字化产品选型白皮书》&#xff0c;并推出企业CIO选型指南及可信产品名录。企企通凭借其优秀的采购数字化与供应…

概率分布函数与误差函数的关系

正态函数&#xff08;高斯分布&#xff09; 对其求[b,x]区间的积分 标准误差函数 以下两个方程相等&#xff08;a,b取值任意&#xff09; 两个函数重合 可知正态函数 f(t) 在[b,x]的区间上积分等于 引用desmos计算器&#xff1a;Desmos | Lets learn together.

【研0深度学习】李宏毅2024春《生成式人工智能导论》持续更新...

文章目录 第1讲 什么是生成式人工智慧&#xff1f;第2讲 今日的生成式人工智慧厉害在哪里&#xff1f;第3-5讲 训练不了人工智慧&#xff0c;你可以训练你自己&#xff08;在不训练模型的情况下强化语言模型的方法&#xff09;第6讲 大模型修炼史——第一阶段 自我学习 累计实力…

Linux 系统中 ODBC 驱动的安装与配置指南

Linux 下的 ODBC 包 从发布包中获取&#xff0c;包名为 openGauss-*.*.0-ODBC.tar.gz。Linux 环境下&#xff0c;开发应用程序要用到 unixODBC 提供的头文件&#xff08;sql.h、sqlext.h 等&#xff09;和库 libodbc.so。这些头文件和库可从 unixODBC-2.3.0 的安装包中获得。 …

JavaWeb开发 2.Web开发 Web前端开发 ①介绍

内心一旦平静&#xff0c;外界便鸦雀无声 —— 24.5.27 一、初识Web前端 网页有哪些部分组成? 文字、图片、音频、视频、超链接 ...网页&#xff0c;背后的本质是什么? 前端代码前端的代码是如何转换成用户眼中的网页的? 通过浏览器转化(解析和渲染)成用户看…

PID控制中的积分到底是什么,为什么它可以将矩形线转换为曲线?simulink搭建PID控制,积分模块1/s

PID控制中的积分到底是什么&#xff0c;为什么它可以将矩形线转换为曲线&#xff0c; 这个问题呢其实道理很简单&#xff0c;用到的是初中的知识 我们做几个测试案例 如下面matlab搭建了积分1/s 那显示如下&#xff08;红色曲线相当于加速度、蓝色曲线相当于速度&#xff09;&a…

WHLUG活动回顾 | 4大技术分享!干货满满,热闹非凡!

内容来源&#xff1a;deepin&#xff08;深度&#xff09;社区 2024 年 5 月 25 日下午&#xff0c;由 deepin&#xff08;深度&#xff09;社区华中科技大学开放原子开源俱乐部联合举办的武汉 Linux 爱好者线下沙龙活动&#xff08;WHLUG&#xff09;在华中科技大学成功举办。…

因智而兴 向“新”而行 | 软通动力携子公司鸿湖万联亮相数字中国建设峰会·智算云生态大会

5月23日至27日&#xff0c;第七届数字中国建设峰会在福州盛大召开。作为峰会的重要组成部分&#xff0c;由中国电信、中国电科、中国电子联合主办的第三届智算云生态大会同步召开。此次大会以“国云注智 聚力向新”为主题&#xff0c;深入探讨了智算云、人工智能、数据要素、量…