【SpringCloud】负载均衡(Spring Cloud LoadBalancer)
负载均衡
当服务流量增大时,通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。
服务端负载均衡
在服务端进行负载均衡的算法分配。
比较有名的服务端负载均衡器是Nginx。请求先到达Nginx负载均衡器,然后通过负载均衡算法,在多个服务器之间选择一个进行访问。
客户端负载均衡
Spring Cloud LoadBalancer 是 Spring Cloud 最新版本的负载均衡集成组件,取代了早期的 Ribbon,也是本文使用的负载均衡组件。它允许将负载均衡功能作为库集成到客户端,而不再依赖于单独的负载均衡设备。客户端通过从注册中心(如 Eureka)获取服务列表,并使用负载均衡算法选择一个服务器来发送请求。这种方式不仅提升了系统的灵活性和可扩展性,还通过在客户端实现负载均衡来优化服务请求的分发和性能。
二者区别
- 位置:服务端负载均衡位于服务端,而客户端负载均衡位于客户端。
- 作用对象:服务端负载均衡处理所有入站请求,而客户端负载均衡处理发出的请求。
- 控制粒度:服务端负载均衡可以全局控制请求的分发,而客户端负载均衡可以基于局部条件和策略做出请求选择。
- 服务端负载均衡是一种较为传统的方法,适用于管理入站到一个服务的所有请求,特别是在客户端数量众多时。它可以简化客户端逻辑,使客户端无需关心后端服务器的复杂性。
客户端负载均衡则允许更灵活的请求处理,特别适用于分布式系统架构,如微服务架构,其中每个服务可能需要根据不同的标准选择不同的后端服务。
Spring Cloud LoadBalancer
从Spring Cloud 2020.0.1版本开始,移除了Ribbon组件,改为使用Spring Cloud LoadBalancer组件来实现客户端负载均衡。
模拟多服务实例
对于上一篇的订单服务调用商品服务http://t.csdnimg.cn/r3KGs 当时只有一个商品服务。这里模拟多个商品服务,让订单服务去调用。
总共启动三个商品服务。
请求多次订单服务。
让订单服务多次调用商品服务,观察日志。
每次只用一个实例在工作。
手动负载均衡
//计数器private AtomicInteger count = new AtomicInteger(1);private List<ServiceInstance> instances;@PostConstructpublic void init(){//从Eureka中获取服务列表instances = discoveryClient.getInstances("product-service");}public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//计算轮流的实例idnexint index= count.getAndIncrement() % instances.size();//获取实例String uri = instances.get(index).getUri().toString();//拼接urlString url = uri+"/product/"+orderInfo.getProductId();log.info("远程调用url:{}", url);ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
使用组件
这里我们使用Spring Cloud LoadBalancer来实现客户端负载均衡。
添加注解
给RestTemplate这个Bean添加@LoadBalanced注解
@Configuration
public class BeanConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
修改IP端口为服务名
public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "http://product-service/product/"+orderInfo.getProductId();log.info("远程调用url:{}", url);ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
观察日志
可以看出成功实现了负载均衡。
自定义负载均衡策略
负载均衡策略一般有轮询,随机。Spring Cloud LoadBalancer默认使用的是轮询。接下来将自定义一个随机的算法。
定义随机算法对象
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;// 不需要Configuration注解,只需要在组件扫描范围内即可
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);}
}
使用注解
使用 @LoadBalancerClient 或者 @LoadBalancerClients 注解在RestTemplate配置类的上方。
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;// name = "product-service" 表示只对 product-service 使用 LoadBalancerConfig 配置
@LoadBalancerClient(name = "product-service",configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
LoadBalancer原理
LoadBalancer的实现主要依赖于LoadBalancerInterceptor类。该类会拦截RestTemplate的请求,然后通过Eureka从服务注册中心根据服务ID获取服务列表。随后,利用负载均衡算法选取真实的服务地址信息,并替换原始的服务ID。
相关文章:
【SpringCloud】负载均衡(Spring Cloud LoadBalancer)
负载均衡 当服务流量增大时,通常会采用增加机器的方式进行扩容。负载均衡就是用来在多个机器或者其他资源中,按照一定的规则合理分配负载。其中的实现可以分成客户端负载均衡和服务端负载均衡。 服务端负载均衡 在服务端进行负载均衡的算法分配。 比…...
三生随记——输入法之谜
在深夜的电脑前,李浩专心致志地敲打着键盘,为他的小说写下最后一章。然而,随着他不断输入文字,他渐渐察觉到一丝不对劲。每次他尝试输入特定的词汇,输入法都会自动跳转到一些与主题毫不相关的句子,甚至有些…...
【名词解释】Unity中的3D物理系统:刚体
Unity中的3D物理系统是用于模拟现实世界中物体的运动和相互作用的一套工具和组件。刚体(Rigidbody)是Unity 3D物理系统中的一个核心组件,它允许游戏对象(GameObject)受到重力和外力的影响,并参与碰撞检测。…...
icon转svg处理
一般情况下,图标我们可以找UI或者去iconfont.cn获得一个svg格式的文件。然后再IDE中以文本的方式打开,然后格式化,就可以看到代码。代码中一般是最外层一个svg标签,里面是一个或者多个path。这个时候,我们使用h方法来实…...
已成功见刊检索的国际学术会议论文海报展示(2)
【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议(CITCE 2024) 大会官网:www.citce.org 时间地点:2024年11月1-3日,中国-武汉 收录检索:EI Compendex,Scopus 主办单位:四川师范…...
EasyCVR/EasyDSS无人机直播技术助力野生动物监测
近日有新闻报道,一名挖掘机师傅在清理河道时,意外挖出一只稀有的扬子鳄,挖机师傅小心翼翼地将其放在一边,扬子鳄也顺势游回一旁的河道中。 随着人类对自然环境的不断探索和开发,野生动物及其栖息地的保护显得愈发重要。…...
AI视频教程下载-ChatGPT 生产力 + 时间管理
ChatGPT Productivity Time Management. ChatGPT Productivity ChatGPT 显著提升生产力 不寻常的时间管理技巧。ChatGPT 工作,Chat GPT 自动化,ChatGPT 2023! 对关于ChatGPT的讨论感到好奇,想知道如何利用它为自己带来好处吗&a…...
Java 集合框架:LinkedList 的介绍、使用、原理与源码解析
大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 014 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…...
【Ruby爬虫01】某吃瓜网站图片数据采集
介绍 由于最近在学习Ruby,写一个爬虫锻炼一下。涉及xml解析、多线程、xpath语法等基础知识。 实现代码 使用说明 使用前请先安装如下gem gem install nokogiri http openssl# nokogiri:一个解析xml和html的库,支持css、xpath语法 # htt…...
可以免费领取tokens的大模型服务
本文更新时间:2024年6月20日 豆包大模型 “亲爱的客户,模型提供方将在5月15日至8月30日期间,为您提供一次独特的机会,即高达5亿tokens的免费权益。这是我们对您长期支持的感谢,也是对未来合作的期待。” 在8月30日之…...
NSSCTF-Web题目11
目录 [鹤城杯 2021]EasyP 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]numgame 1、题目 2、知识点 3、思路 [鹤城杯 2021]EasyP 1、题目 2、知识点 php代码审计 3、思路 打开题目,出现一段代码,我们对代码进行审计 这里出现了很多不懂的…...
【数据结构】第十八弹---C语言实现堆排序
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、堆排序 1.1、基本思想 1.2、初步代码实现 1.3、代码优化 1.4、代码测试 总结 1、堆排序 在博主数据结构第十二弹---堆的应用有详细讲解堆…...
[面试题]Kafka
[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…...
centos7 离线安装zip和unzip
解压的时候发现不能解压,报-bash: unzip: command not found 1、访问https://www.rpmfind.net/linux/rpm2html/search.php?queryzip&submitSearch…&systemcentos&arch#/ 2、输入zip和centos搜索,选择el7下载 3、输入unzip和centos搜索&am…...
Linux下lsof命令使用
目录 lsof 命令使用指南基本语法常用选项使用示例 lsof vs netstatlsofnetstat区别示例对比 lsof 命令使用指南 lsof (List Open Files) 是一个用于列出当前系统中打开文件的命令,适用于 Unix 和类 Unix 操作系统。它不仅可以列出常规文件,还可以列出打…...
基于ChatGPT的大型语言模型试用心得
近年来,ChatGPT这样的大型语言模型,它如同一颗冉冉升起的新星,迅速在商业、教育、娱乐等多个领域照亮了创新的天空,极大地革新了我们的工作与日常生活。 最近我发现一些国内用户也能自由访问的中文ChatGPT APP。这个平台不仅提供…...
Python 列表添加多个值(四种方法)
Python 列表添加多个值有多种方法,以下是其中几种实现方法: 一、使用extend()方法 Python 中列表对象有一个 extend() 方法,它可以一次性添加另一个列表中的所有元素到当前列表中。 例1: a = [1, 2, 3] b = [4, 5, 6] a.extend(b)...
VMware RedHat虚拟机磁盘扩容(添加磁盘和扩展磁盘)
前言 自己的电脑上配一个虚拟机还是很有必要的,用起来比双系统方便一点,之前搞了100g的ubuntu没用到,后面重装redhat觉得随便搞个20g就够用了,后面用到之后就遇到磁盘不够用的情况,只能说情况允许的话,磁盘…...
最近,GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人整体感受等
GPT-4o是一款引人瞩目的人工智能技术,它在之前版本的基础上取得了长足的进步。本文将对GPT-4o进行评价,包括版本间的对比分析、GPT-4o的技术能力以及个人整体感受等。 首先,我们来进行GPT-4o与之前版本的对比分析。GPT-4o相较于GPT-3和GPT-2…...
C#面:C#支持多重继承么?
C#不支持多重继承。在C#中,一个类只能直接继承自一个基类。这是由于C#的设计目标之一是避免多重继承可能带来的复杂性和潜在的问题。 然而,C#提供了接口(interface)的概念来实现类似多重继承的功能。一个类可以实现多个接口&…...
细说MCU修改回调函数调用模式的方法
目录 1、硬件及工程 2、实现方法 (1)修改while(1)中的代码: (2)修改2 (3)修改3 (4)修改4 (5)修改5 3、下载并运行 在本文作者的文章中&a…...
Java共享台球室无人系统支持微信小程序+微信公众号
共享台球室无人系统 🎱 创新台球体验 近年来,共享经济如火如荼,从共享单车到共享汽车,无一不改变着我们的生活方式。而如今,这一模式已经渗透到了更多领域,共享台球室便是其中之一。不同于传统的台球室&a…...
如何开发一个海外仓系统?难度在哪,怎么选择高性价解决方案
作为海外仓管理的重要工具,海外仓系统的实际应用价值还是非常高的。为了让大家能更好的理解wms海外仓系统,今天会介绍海外仓系统开发的逻辑架构,以及作为海外仓企业要怎么确定高性价比的数字化管理解决方案。 1、开发海外仓系统要考虑的功能…...
计算机组成原理(Wrong Question)
目录 一、计算机系统概述 *1.1 计算机发展历程 1.2 计算机系统层次结构 1.3 计算机的性能指标 二、 数据的表示和运算 2.1 数制和编码 2.2 运算方法和运算电路 2.3 浮点数的表示与运算 三、存储系统 3.1 存储器概述 3.2 主存储器 3.3 主存储器与CPU的连接 3.4 外部…...
ACL2024 | AI的时空穿越记:大型语言模型共时推理的奇幻之旅!
作者:苏肇辰 标题:Living in the Moment: Can Large Language Models Grasp Co-Temporal Reasoning? 录取:ACL2024 Main 论文链接:https://arxiv.org/abs/2406.09072 代码链接:https://github.com/zhaochen0110/Cotem…...
从xxl-job源码中学习Netty的使用
1. 启动与Spring实例化 com.xxl.job.core.executor.impl.XxlJobSpringExecutor.java类 继承SmartInitializingSingleton 类,在afterSingletonsInstantiated 实例化后方法中 调用initJobHandlerMethodRepository 把所有的xxljob任务管理起来; private…...
人工智能发展历程了解和Tensorflow基础开发环境构建
目录 人工智能的三次浪潮 开发环境介绍 Anaconda Anaconda的下载和安装 下载说明 安装指导 模块介绍 使用Anaconda Navigator Home界面介绍 Environment界面介绍 使用Jupter Notebook 打开Jupter Notebook 配置默认目录 新建文件 两种输入模式 Conda 虚拟环境 添…...
makefile追加warning日志
在Makefile中,你不能直接“追加”warning日志到构建过程中,但你可以通过几种方式在构建时产生额外的警告或消息。以下是一些常用的方法: 使用echo或printf命令: 在Makefile的规则中,你可以使用echo或printf命令来输出警…...
不要直接使用unidefined 而使用void 0
为什么不要使用unidefined 而使用void 0? 在JavaScript中,undefined 和 void 0 都可以用来表示未定义的值,但它们在使用和上下文中有一些微妙的差异,这也是为什么有时可能会推荐使用 void 0 而不是直接使用 undefined。 全局污染ÿ…...
注解详解系列 - @Scope:Bean作用域管理
注解简介 在今天的注解详解系列中,我们将探讨Scope注解。Scope是Spring框架中的一个重要注解,用于定义Spring bean的作用域。通过指定bean的作用域,我们可以控制bean的生命周期和创建方式。 注解定义 Scope注解用于指定Spring bean的作用域…...
达州网站制作/谁有恶意点击软件
4.后续计量(1)持有至到期投资后续计量:按摊余成本进行后续计量。(2)企业在初始确认以摊余成本计量的金融资产或金融负债时,就应当计算确定实际利率,并在相关金融资产或金融负债预期存续期间或适用的更短期间内保持不变。金融资产或金融负债的…...
高安网站找工作做面点事/seo怎么优化排名
C大多数语句都以分号结束 表达式ival5,末尾加上分号变成表达式语句 1 空语句 最简单的语句是只有一个分号的空语句 常见情况是,空语句会使用在循环中 while (cin >> s && ! sought);// 空语句使用空语句应该加上注释,让读者…...
在哪个国家做垂直网站好/营业推广的方式
按键精灵将表格录入网页.doc按键精灵将表格录入网页篇一:基于按键精灵的自动输入程序的实现2012.3.1基于按键精灵的自动输入程序的实现高琪琪(无锡职业技术学院 江苏 无锡 214121)摘要:本文讨论如何通过按键精灵读取excel表格中的内容,之后通…...
如何设置wordpress的文章分类/黄页88网站推广方案
【Web技术】HTML详解head标签 一个网页由head和body标签组成 body用来呈现网页内容,而head标签中除了title标签还有什么作用与属性呢? <html><head><title>文档的标题</title></head><body>文档的内容... ...<…...
做我的世界背景图的网站/b2b平台排名
【转载】超简单IFRAME自适应网页! 大 | 中 | 小 [2007/01/14 22:38 | 分类: 其他技术 WEB标准 | by feifengxlq ] 来之蓝色理想:http://bbs.blueidea.com/thread-2145145-1-1.html解决方法:1、建立一个bottom.js的文件,然后输入…...
阜蒙县建设学校网站是什么/石家庄网站建设排名
http://www.lydsy.com/JudgeOnline/problem.php?id3319 题意:给一棵n节点的树(n<1e6),m个操作(m<1e6),每次操作有两种:1、查询u到根的第一条黑边的编号。2、将u到v的路径全部…...