一、前置知识

1.1 负载均衡定义

负载均衡指的是将网络请求通过不同的算法分配到不同的服务器上的技术,从而提升系统的性能。

1.2 负载均衡工具

负载均衡工具可以分分为客户端负载均衡工具和服务端负载均衡工具,它们的区别如下。

表1-1 负载均衡工具分类[1]

维度客户端负载均衡工具服务端负载均衡工具
决策位置客户端代码中实现中间层(如Nginx、负载均衡器)
灵活性高(支持自定义算法,如业务哈希)较低(依赖中间层配置)
性能开销客户端需计算实例选择,可能增加延迟额外网络跳转,可能成为瓶颈
容错性客户端需处理重试/降级中间层自动剔除故障节点
服务发现强依赖注册中心(如Eureka)可静态配置或动态集成
适用协议HTTP、gRPC、RPCHTTP、TCP、UDP
1.3 负载均衡算法

表1-2 负载均衡算法[2]

算法工作原理适用场景优点缺点
轮询(Round Robin)​按顺序依次分配请求(如A->B->C->A->B)服务器性能相近、无状态服务(如静态资源)简单公平,易于实现忽略服务器负载差异,性能不均时效率低
加权轮询(Weighted RR)​根据服务器性能分配权重(如5:3:2),高权重服务器获得更多请求服务器性能差异明显(如新旧硬件混合)按能力分配资源,优化利用率需手动配置权重,无法动态响应负载变化
最少连接(Least Connections)​优先选择当前连接数最少的服务器长连接服务(数据库、视频流)动态适应负载,避免服务器过载忽略服务器处理能力差异
加权最少连接(Weighted LC)​结合服务器权重和当前连接数,选择(连接数/权重)最小的服务器高性能异构集群(如混合云环境)兼顾性能与实时负载,资源利用率高算法复杂,需实时监控服务器状态
源IP哈希(IP Hash)​根据客户端IP计算哈希值,固定分配到同一服务器需会话保持的应用(如购物车、登录状态)保证会话一致性服务器故障时关联用户受影响
随机(Random)​完全随机分配请求测试环境或简单负载场景实现简单,无状态依赖分配不可控,可能造成负载不均
最快响应时间(Fastest Response)​选择响应时间最短的服务器对延迟敏感的应用(如金融交易)提升用户体验需持续监控服务器响应时间
一致性哈希(Consistent Hashing)​哈希环映射请求,服务器扩容/缩容时仅影响少量请求分布式缓存(Redis集群)减少节点变动的影响实现复杂度较高
动态性能分配(Dynamic Ratio)​根据CPU、内存等实时指标动态调整流量分配服务器性能波动大的场景精准匹配当前负载需高性能监控系统支持

二、Ribbon实战

2.1 项目结构

本项目使用Eureka作为注册中心,使用方法参见:Ereka实战。

图2-1 项目结构 

服务列表如下。其中SpringCloudEurekaProductApplication02和SpringCloudEurekaProductApplication为product服务的实例,创建步骤见:IDEA中一个服务创建多个实例。

图2-2 服务实例 

2.2 order模块新建以下代码

创建RestTemplate对象,并添加@LoadBalanced注解开启负载均衡。

@Configuration
public class LoadBalanceConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

创建控制器访问product服务。

@RestController
@RequestMapping("/loadBalance")
public class LoadBalanceController {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/test")public String test(){String url = String.format("http://%s/loadTest", "spring-cloud-eureka-product");ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);return forEntity.getBody();}
}
2.2 product模块新建代码
@RequestMapping
@RestController
public class LoadBalanceController {// order在配置文件中设置@Value("${order}")private Integer order;@RequestMapping("/loadTest")public String loadTest(){return "服务器:" + order;}
}
2.3 运行

分别启动server、product、product02、order服务,启动成功后,访问注册中http://localhost:8080/,结果如下图所示。

图2-3 注册中心 

访问两次http://localhost:9003/loadTest,分别得到以下结果。后面的数字是两个product服务激活的配置文件中配置的order的值,分别为1和2。

图2-4 访问结果 

三、总结

核心点就是创建RestTemplate,然后添加@LoadBalance注解,使用RestTemplate对象方法时自动实现负载均衡。

参考

[1][2] 腾讯元宝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914492.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914492.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914492.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cs285学习笔记(一):课程总览

根据 Fall 2023 学期的官方课程日程&#xff0c;这里是 CS 285 全课程的 Lecture 大纲及内容摘要&#xff0c;详细对应周次和主题&#xff0c;方便你快速定位每节课要点、相关作业与视频资源 &#x1f3af; 官方课程地址 YouTobe 视频地址 blibli视频(带中文字幕) &#x…

OkHttp SSE 完整总结(最终版)

1. SSE 基础概念 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09;是一种 Web 标准&#xff0c;允许服务器向客户端推送实时数据。 核心特点 单向通信&#xff1a;服务器 → 客户端 基于 HTTP 协议&#xff1a;使用 GET 请求 长连接&#xff1a;连…

聚宽sql数据库传递

自建数据库从聚宽到Q-MT自动化交易实战 从接触聚宽以来一直都是手动跟单&#xff0c;在网上看到许多大佬的自动交易文章&#xff0c;心里也不禁十分痒痒。百说不如一练&#xff0c;千讲不如实干。经过一番努力&#xff0c;终于成功实盘了&#xff0c;效果还可以&#xff0c;几…

es里为什么node和shard不是一对一的关系

提问&#xff1a; 既然多个shard会被分配到同一个node上&#xff0c;那么为什么不把多个shard合并成一个然后存在当前node上呢&#xff0c;简而言之也就是让node和shard形成一对一的关系呢 &#xff1f;非常好的问题&#xff0c;这正是理解Elasticsearch分片&#xff08;shard…

浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别

首先做一个基本的分类 名称描述npm,cnpm,yarn,pnpm都是Javascript包管理器nvm是Node.js版本控制器npx命令行工具 I.npm,cnpm,yarn,pnpm npm (Node Package Manager) npm是Node.js默认的包管理器&#xff0c;随Node.js的安装会一起安装。使用npm可以安装&#xff0c;发布&…

滑动窗口-76.最小覆盖子串-力扣(LeetCode)

一、题目解析1.不符合要求则返回空串("")2.子串中重复字符的数量要不少于t中该字符的数量二、算法原理解法1&#xff1a;暴力枚举哈希表这里的暴力枚举也可以优化&#xff0c;即在包含t中元素处枚举&#xff0c;如在A、B和C处开始枚举&#xff0c;减少不必要的枚举 解…

从零构建搜索引擎 build demo search engine from scratch

从零构建搜索引擎 build demo search engine from scratch 我们每天都会使用搜索引擎&#xff1a;打开google等搜索引擎&#xff0c;输入关键词&#xff0c;检索出结果&#xff0c;这是一次搜索&#xff1b;当打开历史记录旁边的&#x1f50d;按钮&#xff0c;输入关键词&#…

pytorch小记(二十九):深入解析 PyTorch 中的 `torch.clip`(及其别名 `torch.clamp`)

pytorch小记&#xff08;二十九&#xff09;&#xff1a;深入解析 PyTorch 中的 torch.clip&#xff08;及其别名 torch.clamp&#xff09;深入解析 PyTorch 中的 torch.clip&#xff08;及其别名 torch.clamp&#xff09;一、函数签名二、简单示例三、广播支持四、与 Autograd…

快速分页wpf

/*没有在xaml设置上下文window.context是因为 命名空间一直对应不上 所以在xaml.cs 里面绑定*/ <Window x:Class"DataGrid.views.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft…

如何彻底禁用 Chrome 自动更新

如何彻底禁用 Chrome 自动更新 随着谷歌将 Chrome 浏览器版本升级至 138&#xff0c;它即将彻底抛弃对 Manifest V2 扩展的支持。许多用户希望将浏览器版本锁定在 138&#xff0c;以继续使用 uBlock Origin、Tampermonkey 等常用扩展。 本文总结了四种有效方法&#xff0c;帮助…

流批一体的“奥卡姆剃刀”:Apache Cloudberry 增量物化视图应用解析

引言&#xff1a;流批一体&#xff0c;理想与现实的鸿沟 在数据驱动的今天&#xff0c;“实时”二字仿佛拥有魔力&#xff0c;驱使着无数企业投身于流批一体架构的建设浪潮中。我们渴望实时洞察业务变化&#xff0c;实时响应用户需求。以 Apache Flink 为代表的流处理引擎&…

C# 入门教程(三):详解字段、属性、索引器及各类参数与扩展方法

文章目录一、字段、属性、索引器、常量1.字段2.属性2.1 什么是属性2.2 属性的声明2.3 属性与字段的关系3 索引器4. 常量二、传值 输出 引用 数组 具名 可选参数&#xff0c;扩展方法2.1 传值参数2.1.1 值类型 传参2.1.2 引用类型 传参2.2 引用参数2.2.1 引用参数-值类型 传参2.…

《美术教育研究》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a;问&#xff1a;《美术教育研究》是不是核心期刊&#xff1f;答&#xff1a;不是&#xff0c;是知网收录的第一批认定学术期刊。问&#xff1a;《美术教育研究》级别&#xff1f;答&#xff1a;省级。主管单位&#xff1a; 安徽出版集团有限责任公司 主办…

每日算法刷题Day47:7.13:leetcode 复习完滑动窗口一章,用时2h30min

思考: 遇到子数组/子字符串可以考虑能不能用滑动窗口&#xff0c; 定长:逆向思维,答案不定 最大长度/最小长度:一般求长度 越长越合法/越短越合法/恰好:一般求数量 主要思考窗口条件成立&#xff0c; 判断条件是符合窗口条件(最小长度/越长越合法还是不符合(最大长度/越短越合法…

电流驱动和电压驱动的区别

理解电流驱动和电压驱动的区别对电路设计至关重要&#xff0c;尤其在高速、高抗噪要求的场景&#xff08;如LVDS&#xff09;。以下是两者的核心对比&#xff1a;一、电压驱动 (Voltage Drive) 核心原理&#xff1a; 驱动器输出一个受控的电压&#xff08;与负载阻抗无关&#…

宿舍电费查询——以ZUA为例

宿舍电费查询——以ZUA为例0. 安装抓包环境手机端桌面端1. 登录1.1 开启抓包后进入缴费页面&#xff1a;1.2 分析请求1.3 编写登录代码2. 获取楼栋及房间ID2.1 获取楼栋ID2.2 编写获取楼栋ID代码2.3 获取房间ID2.4 编写获取房间ID代码3. 获取剩余电费&#xff1a;3.1 选择房间号…

vue中计算属性的介绍

Vue.js 中的计算属性是基于它的响应式系统来实现的&#xff0c;它可以根据 Vue 实例的数据状态来动态计算出新的属性值。在 Vue 组件中&#xff0c;计算属性常用于对数据进行处理和转换&#xff0c;以及动态生成一些需要的数据。一、使用方式1.定义计算属性&#xff1a; 在Vue组…

MFC UI控件CheckBox从专家到小白

文章目录CheckBox勾选框控件控件与变量绑定控件点击消息映射互斥CheckBox勾选框控件 控件与变量绑定 方案一&#xff1a; BOOL m_bEnable1; BOOL m_bEnable2; void A::DoDataExchange(CDataExchange* pDX) {DDX_Check(pDX, IDC_CK_1, m_bEnable1);DDX_Check(pDX, IDC_CK_2, …

阿尔卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL

阿尔卡特ACT 250 ATP 150 AND ATP 400 分子泵控制器TURBOMOLECULAR PUMP CONTROLLER ALCATEL

python的小学课外综合管理系统

前端开发框架:vue.js 数据库 mysql 版本不限 后端语言框架支持&#xff1a; 1 java(SSM/springboot)-idea/eclipse 2.NodejsVue.js -vscode 3.python(flask/django)–pycharm/vscode 4.php(thinkphp/laravel)-hbuilderx 数据库工具&#xff1a;Navicat/SQLyog等都可以 摘要 随着…