当前位置: 首页 > news >正文

Spring Cloud LoadBalancer

什么是负载均衡?

如果一个服务对应多个实例,我们需要把流量合理的分配给多个实例;当服务流量增⼤时, 通常会采⽤增加机器的⽅式进⾏扩容, 负载均衡就是⽤来在多个机器或者其他资源,中, 按照⼀定的规则合理分配负载.

服务端负载均衡

⽐较有名的服务端负载均衡器是Nginx. 请求先到达Nginx负载均衡器, 然后通过负载均衡算法, 在多个服务器之间选择⼀个进⾏访问.

客户端负载均衡

把负载均衡的功能以库的⽅式集成到客⼾端, ⽽不再是由⼀台指定的负载均衡设备集中提供.
⽐如Spring Cloud的Ribbon, 请求发送到客⼾端, 客⼾端从注册中⼼(⽐如Eureka)获取服务列表, 在发 送请求前通过负载均衡算法选择⼀个服务器,然后进⾏访问.
Ribbon是Spring Cloud早期的默认实现, 由于不维护了, 所以最新版本的Spring Cloud负载均衡集成的是Spring Cloud LoadBalancer(Spring Cloud官⽅维护)
客⼾端负载均衡和服务端负载均衡最⼤的区别在于服务清单所存储的位置

使用Spring Cloud LoadBalancer实现负载均衡

1.给RestTemplate这个Bean添加@LoadBalanced注解。

2.修改远程调用代码的url的IP端口号为服务名称。

负载均衡策略

负载均衡策略是一种思想,无论哪种负载均衡器,它们的负载均衡策略都是相似的。Spring Cloud LoadBalancer仅支持两种负载均衡策略:轮询策略和随机策略。

  1. 轮询(Round Robin):轮询策略是指服务器轮流处理用户请求,这是一种实现最简单,也是最常用的策略。
  2. 随机选择(Random):这个策略是指随机选择一个后端服务器来处理新的请求。

自定义负载均衡策略

Spring Cloud LoadBalancer 默认负载均衡策略是 轮询策略, 实现是 RoundRobinLoadBalancer, 如果服务的消费者如果想采⽤随机的负载均衡策略, 也⾮常简单
  1. 自定义随机算法对象, 通过 @Bean 将其加载到 Spring 容器中
public class LoadBalancerConfig {
        @Bean
        ReactorLoadBalancer<ServiceInstance> randomLoadBalancer (Environment
environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
                String name =
environment.getProperty(LoadBalancerClientFactory. PROPERTY_NAME );
                System.out.println( "==============" +name);
                return new
RandomLoadBalancer (loadBalancerClientFactory.getLazyProvider(name,
ServiceInstanceListSupplier.class), name);
        }
}

   2.使⽤ @LoadBalancerClient 或者 @LoadBalancerClients 注解在RestTemplate 配置类上⽅, 使⽤ @LoadBalancerClient 或 @LoadBalancerClients 注解, 可以对不同的服务提供⽅配置不同的客⼾端负载均衡算法策略. 

@LoadBalancerClient(name = "product-service", configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {
        @Bean
        @LoadBalanced
        public RestTemplate restTemplate (){
                return new RestTemplate ();
        }
}
@LoadBalancerClient 注解说明
1. name: 该负载均衡策略对哪个服务⽣效(服务提供⽅)
2. configuration : 该负载均衡策略 ⽤哪个负载均衡策略实现.

LoadBalancer原理

LoadBalancer 的实现, 主要是 LoadBalancerInterceptor , 这个类会对 RestTemplate 的请
求进⾏拦截, 然后从Eureka根据服务id获取服务列表,随后利⽤负载均衡算法得到真实的服务地址信息,替换服务id
public class LoadBalancerInterceptor implements ClientHttpRequestInterceptor {public ClientHttpResponse intercept(final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { URI originalUri = request.getURI();String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);return (ClientHttpResponse)this.loadBalancer.execute(serviceName, this.requestFactory.createRequest(request, body, execution));}
}

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

1. request.getURI() : 从请求中获取uri
2. originalUri.getHost():从uri中获取路径的主机名, 也就是服务id
3. loadBalancer.execute 根据服务id, 进⾏负载均衡, 并处理请求
继续往下面看
public class BlockingLoadBalancerClient implements LoadBalancerClient {    public <T> T execute(String serviceId, LoadBalancerRequest<T> request) throws IOException {String hint = this.getHint(serviceId);LoadBalancerRequestAdapter<T, TimedRequestContext> lbRequest = new LoadBalancerRequestAdapter(request, this.buildRequestContext(request, hint));Set<LoadBalancerLifecycle> supportedLifecycleProcessors = this.getSupportedLifecycleProcessors(serviceId);supportedLifecycleProcessors.forEach((lifecycle) -> {lifecycle.onStart(lbRequest);});//根据serviceId,和负载均衡策略, 选择处理的服务ServiceInstance serviceInstance = this.choose(serviceId, lbRequest);if (serviceInstance == null) {supportedLifecycleProcessors.forEach((lifecycle) -> {lifecycle.onComplete(new CompletionContext(Status.DISCARD, lbRequest, new EmptyResponse()));});throw new IllegalStateException("No instances available for " + serviceId);} else {return this.execute(serviceId, serviceInstance, lbRequest);}}
//根据serviceId,和负载均衡策略, 选择处理的服务public <T> ServiceInstance choose(String serviceId, Request<T> request) {//获取负载均衡器ReactiveLoadBalancer<ServiceInstance> loadBalancer = this.loadBalancerClientFactory.getInstance(serviceId);if (loadBalancer == null) {return null;} else {
//根据负载均衡算法, 在列表中选择⼀个服务实例Response<ServiceInstance> loadBalancerResponse = (Response)Mono.from(loadBalancer.choose(request)).block();return loadBalancerResponse == null ? null : (ServiceInstance)loadBalancerResponse.getServer();}}

 负载均衡跟LoadBalancer就介绍到这里,如果想深入了解,可以去继续阅读源码~

相关文章:

Spring Cloud LoadBalancer

什么是负载均衡&#xff1f; 如果一个服务对应多个实例&#xff0c;我们需要把流量合理的分配给多个实例&#xff1b;当服务流量增⼤时, 通常会采⽤增加机器的⽅式进⾏扩容, 负载均衡就是⽤来在多个机器或者其他资源&#xff0c;中, 按照⼀定的规则合理分配负载. 服务端负载…...

面向对象与设计模式第二课:设计模式实战

第三章&#xff1a;面向对象与设计模式 第二课&#xff1a;设计模式实战 设计模式是软件工程中的一项重要实践&#xff0c;它为解决常见的设计问题提供了经过验证的解决方案。本课将深入探讨几种常见的设计模式&#xff0c;并通过实际案例分析其在项目中的应用。 1. 每种设计…...

非科班出身如何转行程序员?

非科班出身是指那些大学专业为非计算机相关专业的人群&#xff0c;多数人对于计算机基础了解比较少&#xff0c;甚至零基础。这部分人群中有相当多一部分处于对于编程的兴趣和外界了解的印象想转行成为一名程序员。 非科班出身与计算机科班出身相比有着天然的劣势&#xff0c;在…...

多台NFS客户端访问一台nfs服务器

目录 1.安装服务 2.创建用户和用户组 3.写配置文件 (服务端) 4.创建/share目录 5.挂载服务&#xff08;在两个服务端上&#xff09; 6.测试 1.安装服务 yum -y install rpcbind nfs 2.创建用户和用户组 useradd -u 555 nfs-share groupadd -u 556 nfs-share …...

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波

【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波 前言MPU6050寄存器代码详解mpu6050.cmpu6050.h 使用说明 前言 本篇文章基于卡尔曼滤波的原理详解与公式推导&#xff0c;来详细的解释下如何使用卡尔曼滤波来解算MPU6050的姿态 参考资料&#xff1a;Github_mpu6050 MPU6050寄存器…...

Linux系统——ssh远程连接

Linux系统——ssh远程连接 一、ssh协议介绍1、远程连接协议2、ssh服务基本操作3、ssh常用操作 二、ssh加密1、加密算法类型2、对称加密算法3、非对称加密算法 三、免密ssh的配置1、ssh认证方式2、配置免密ssh3、ssh-copy-id做了什么&#xff1f; 四、ssh服务配置 一、ssh协议介…...

python学习-第一个小游戏(vscode环境)

学习小甲鱼的视频&#xff0c;写了一个小游戏&#xff0c;vscode环境 运行结果 源码地址&#xff1a; python小游戏-猜数字源码...

程序设计基础I-单元测试2(机测)

7-1 sdut-C语言实验-AB for Input-Output Practice (不确定次数循环) Your task is to Calculate a b. Too easy?! Of course! I specially designed the problem for all beginners. You must have found that some problems have the same titles with this one, yes, a…...

Claude 3.5深夜觉醒,学会模仿人类用电脑,力压GPT-4o

1.Claude 3.5深夜重磅更新 Anthropic AI深夜发布了备受期待的Claude 3.5系列更新&#xff0c;包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 虽然备受期待的Opus版本尚未公布&#xff0c;但新版本的Sonnet在推理能力上取得了显著的进步&#xff0c;超越了Open…...

PuTTY

PuTTY 是一个免费的开源终端仿真器和串口终端&#xff0c;广泛用于在 Windows 系统上进行 SSH、Telnet 和 Rlogin 等网络协议的连接。 它允许用户通过安全的方式访问远程计算机&#xff0c;常用于管理服务器和网络设备。 PuTTY 也支持公钥身份验证和端口转发等功能&#xff0c;…...

2024软件测试面试秘籍(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师…...

券商api怎么获取,如何获取券商API接口?

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…...

跟着六西格玛设计DFSS走,让你的项目、服务、产品都“牛”起来——张驰咨询

六西格玛设计&#xff0c;这一数据驱动的质量管理策略&#xff0c;正以其独特的魅力和广泛的适用性&#xff0c;在各行各业中掀起了一场质量革命。从精密的制造业到细致的服务业&#xff0c;再到复杂的项目管理&#xff0c;六西格玛设计以其严谨的逻辑和高效的方法&#xff0c;…...

【2024.10.22练习】机器人塔

题目描述 题目分析 由于数据小&#xff0c;直接考虑DFS搜索底层所有排列组合。 我的代码 需要注意&#xff1a;这个数据有点漏洞的是题干声明NM<231&#xff0c;但实际上有个测试点是等于231的。 一开始在build_tower&#xff08;&#xff09;函数中建完整个塔再判定是否…...

酒店预订订房小程序源码系统 多酒店入驻+打造类似美团的酒店模式 带完整的安装代码包以及搭建部署教程

系统概述 随着移动互联网的普及&#xff0c;小程序因其轻量级、无需下载安装、即用即走的特点&#xff0c;迅速成为各行业的标配。对于酒店预订行业而言&#xff0c;小程序不仅能够有效提升用户体验&#xff0c;还能降低运营成本&#xff0c;提高转化率。本源码系统正是基于这…...

springboot037基于SpringBoot的墙绘产品展示交易平台的设计与实现(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;墙绘产品展示交易平台设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产品展示…...

YOLOv8实战人脸-口罩检测与识别【数据集+YOLOv8模型+源码+PyQt5界面】

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对人脸-口罩数据集进行训练和优化&#xff0c;该数据集包含丰富的人脸-口罩图像样…...

《黑神话悟空》各章节boss顺序汇总

第一章BOSS顺序&#xff1a; 1、牯护院&#xff1a;犀牛精&#xff0c;位于苍狼岭娟&#xff0c;击败后能获得定身术。 2、广智&#xff1a;火刀狼&#xff0c; 位于观音禅院&#xff0c;击败后获得广智变身&#xff0c;记得敲钟。 3、蓝皮幽魂&#xff1a;蓝皮大头&#xff0…...

rust中cargo.toml详细介绍

1. cargo.toml介绍 Cargo.toml是 Rust 项目的配置文件,它使用 TOML(Tom’s Obvious, Minimal Language)格式。 1.1 基本结构 [package]:包含项目的基本信息。 name:项目名称。version:项目版本号。edition:Rust 版本,如 2018、2021 等。[package]name = "abc&q…...

jupyter notebook 笔记

nbclassic 经典版 新版的 jupyter notebook 太丑了。 最难受的是字体太小了。 我还是喜欢老版本的 jupyter notebook. 安装经典版: pip install nbclassic 启动经典版: jupyter server 或是 jupyter nbclassic 参考来源: https://github.com/jupyter/nbclassic jupyter note…...

欧洲千亿欧元纳米电子战略:产业政策、研发投入与市场拉动的博弈

1. 项目概述&#xff1a;一场关于欧洲纳米电子未来的千亿欧元豪赌2012年底&#xff0c;当欧洲大部分地区仍在应对欧债危机的余波时&#xff0c;一份名为《欧洲未来的创新&#xff1a;2020年后的纳米电子技术》的定位文件&#xff0c;在产业界投下了一颗重磅炸弹。这份由欧洲两大…...

AI 术语通俗词典:贝叶斯估计

贝叶斯估计是统计学、机器学习、概率推断和人工智能中非常重要的一个术语。它用来描述一种在已有认识的基础上&#xff0c;根据新数据更新参数判断的方法。换句话说&#xff0c;贝叶斯估计是在回答&#xff1a;我们原来对参数有一个初步判断&#xff0c;现在看到了一批数据&…...

uniapp中获取APP应用签名信息

/*** 获取应用签名MD5* returns {Promise<unknown>}*/ function getAppSignatureMD5() {return new Promise((resolve) > {// 1. 环境检查if (typeof plus "undefined" || uni.getSystemInfoSync().platform ! "android") {resolve(null);return…...

DocX入门指南:如何在不安装Word的情况下快速创建第一个Word文档

DocX入门指南&#xff1a;如何在不安装Word的情况下快速创建第一个Word文档 【免费下载链接】DocX Fast and easy to use .NET library that creates or modifies Microsoft Word files without installing Word. 项目地址: https://gitcode.com/gh_mirrors/doc/DocX Do…...

Cron表达式智能解析与生成工具:提升定时任务开发效率

1. 项目概述&#xff1a;一个为Cron表达式减负的智能助手 如果你是一名运维工程师、后端开发者&#xff0c;或者任何需要与定时任务打交道的人&#xff0c;那么你一定对Cron表达式又爱又恨。爱的是它那套简洁而强大的语法&#xff0c;能精准地定义“每月的第一个星期一的凌晨3…...

Midjourney 2026将取消/imagine?不,它正悄悄部署「自然语言-图像-3D资产」三合一原生工作流(附实测对比数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney 2026战略转向&#xff1a;从文本生成图像到原生三维资产创作范式跃迁 Midjourney 在 2026 年正式终止对纯 2D 图像输出的默认支持&#xff0c;全面启用 v6.5 “Tesseract” 引擎&#xff0c…...

嵌入式产品如何通过RTOS选型抢占市场先机

1. 项目概述&#xff1a;为什么“上市时机”是嵌入式产品的生死线在嵌入式系统开发这个行当里摸爬滚打了十几年&#xff0c;我见过太多团队把“功能实现”和“性能达标”作为项目的终极目标&#xff0c;却在一个更根本的问题上栽了跟头&#xff1a;上市时机。你可能觉得&#x…...

基于Helm与Kubernetes的以太坊节点自动化部署与运维实战

1. 项目概述&#xff1a;当以太坊遇见Kubernetes如果你和我一样&#xff0c;在区块链基础设施领域摸爬滚打多年&#xff0c;从早期手动编译客户端、配置systemd服务&#xff0c;到后来用Docker Compose编排节点&#xff0c;每一步都伴随着大量的重复劳动和运维痛点。当节点数量…...

线性调频等离子鞘套目标雷达探测平台【附代码】

✨ 长期致力于等离子鞘套、脉内多普勒频率、干扰目标抑制、FPGA研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;等离子鞘套回波建模与脉内多普勒参数提…...

量子噪声对机器学习模型的影响与缓解策略

1. 量子噪声与机器学习模型的复杂关系量子计算领域近年来最令人兴奋的进展之一&#xff0c;就是量子机器学习&#xff08;QML&#xff09;的兴起。作为一名长期跟踪量子计算发展的从业者&#xff0c;我亲眼见证了量子算法在机器学习任务中展现出的惊人潜力。然而&#xff0c;在…...