SpringCloud--负载均衡

目录

前言

一.负载均衡的引入

1.1问题引入 

1.2代码修改实现

二.负载均衡介绍

2.1实现负载均衡

2.2负载均衡策略

2.3LoadBalancer 原理


学习专栏:http://t.csdnimg.cn/tntwg

前言

        在前面的Eureka当中,我们虽然实现了从注册中心中获取url,然后再与其他服务器进行交互!获取资源。

Eureka学习地址链接:http://t.csdnimg.cn/MPyJJ

一.负载均衡的引入

1.1问题引入 

        在SpringcloudEureka当中,我们学习到了如何获取,但是请问,如果有多台客户端同时请求这个数据呢?那我们又应该如何应对呢?

例子:我们可以进行多次访问TeacherService,全部访问同一个Teacher-service服务器,那么如何减轻他的负担呢?,方法:

虽然启动了多个实例,但是访问依然还是同一个机器,没有分担负荷!因此我们需要修改之前的代码!

1.2代码修改实现

@Service
public class StudentService {@AutowiredStudentMapper studentMapper;@AutowiredRestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;// 计时器private static AtomicInteger atomicInteger = new AtomicInteger(1);private static List<ServiceInstance> instances;@PostConstructpublic void init(){//根据应⽤名称获取服务列表instances = discoveryClient.getInstances("Teacher-service");}public StudentInfo getId(int id){StudentInfo studentInfo = studentMapper.getId(id);//每次都会自增!int index = atomicInteger.getAndIncrement() % instances.size();ServiceInstance instance = instances.get(index);String url = instance.getUri().toString()+"/Teacher/"+studentInfo.getClassroom();TeacherInfo teacherInfo = restTemplate.getForObject(url, TeacherInfo.class);studentInfo.setTeacherInfo(teacherInfo);return studentInfo;}
}

本次使用了计数器,将每次服务列表,轮播的进行负担,修改了Student-service的代码,让其每次访问不同的实例!分担压力。

二.负载均衡介绍

        负载均衡,就是指在高并发时,也就是服务流量增大时,通常会使用增加机器的方式进行扩容,而负载均衡,就是让多台机器按照一定规则合理分配负载。

而实现负载均衡的有:SpringCloud LoadBalancer

2.1实现负载均衡

        我们使用@LoadBalanced注解,修改的代码有:BeanConfig类以及StudentService类

BeanConfig类: 

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

StudentService类:

@Service
public class StudentService {@AutowiredStudentMapper studentMapper;@AutowiredRestTemplate restTemplate;public StudentInfo getId(int id){StudentInfo studentInfo = studentMapper.getId(id);//一定和注册时的名字相同!String url = "http://Teacher-service/Teacher/"+studentInfo.getClassroom();TeacherInfo teacherInfo = restTemplate.getForObject(url, TeacherInfo.class);studentInfo.setTeacherInfo(teacherInfo);return studentInfo;}
}

启动测试:

测试结果:

2.2负载均衡策略

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

  1. 轮询策略:一种简单的负载均衡算法,其核心思想是依次按顺序将请求分配给每个服务实例,当所有实例都被轮询过一遍后,再次从第一个实例开始。
  2. 随机策略:将每个请求随机分配给服务实例,每个实例被选中的概率是相等的。

轮询的缺点:如果服务实例的性能不均衡,轮询算法无法根据实际负载情况进行调整,可能导致某些实例负载过高。

随机的缺点:其随机性质,无法保证每个实例接收到的请求数量是均匀的,可能导致一些实例负载较高或较低。

SpringCloud LoadBalancer默认使用 轮询策略

随机策略

如果想实现随机策略,使用自定义策略:创建一个新的Config层的LoadBalancerConfig类:

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;public class CustomLoadBalancerConfiguration {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}
该类需要满足:   不用  @Configuration 注释 ,在组件扫描范围内
修改BeanConfig类:
@LoadBalancerClient(name = "Teacher-service", configuration = RandomLoadBalancer.class)
@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}
@LoadBalancerClient 注解:
  • name: 负载均衡对哪个服务生效
  • configuration:使用哪个负载均衡器

注:如果没有为 product-service 指定自定义的负载均衡配置类 (LoadBalancerConfig.class),则 RestTemplate 默认会使用 Ribbon 提供的轮询(Round-Robin)策略来进行服务实例的选择和请求的负载均衡。

2.3LoadBalancer 原理

        或许有人问,为什么我加一个注解@LoadBalanced就可以实现负载均衡呢?

原因: 

  • Ribbon:Spring Cloud Ribbon 是一个基于 HTTP 和 TCP 客户端的负载均衡器。当你在 RestTemplate 上添加 @LoadBalanced 注解时,Spring Cloud Ribbon 会为 RestTemplate 创建一个动态代理,在发送请求前拦截请求,通过负载均衡算法选择合适的服务实例进行请求发送。
  • @LoadBalanced 注解会为 RestTemplate 添加一个拦截器(interceptor),这个拦截器会在请求发送前根据 Ribbon 的负载均衡策略选择一个服务实例。Ribbon 默认的负载均衡策略是轮询(Round-Robin),但你也可以通过配置修改为其他策略,如随机、加权等。
总结:对 RestTemplate 的请求进行拦截, 然后从Eureka根据服务id获取服务列表,随后利⽤负载均衡算法得到真实的服务地址信息,替换服务id。

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

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

相关文章

桌面小宠物发布一周,第一次以独立开发者的身份赚到了100块

收入数据(AppStore一周收入统计) AppStore付费工具榜第七 应用简介 桌面新宠(NewPet)&#xff0c;是我耗时半年开发的一款桌面宠物。我是被 QQ 宠物影响的那批人&#xff0c;上学时天天给 QQ 宠物喂食&#xff0c;很可惜它现在不在了。所以&#xff0c;我开发的初衷是想要在电…

Mysql-查询

1.基本查询 //查询所有内容 select * from 表名;//查询指定字段 select 字段1&#xff0c;字段2&#xff0c;字段3.....from 表名;//查询时给字段起别名 select 字段1 as 别名1 , 字段2 as 别名2 ... from 表名&#xff1b;//去重查询 select distinct 字段列表 from 表名; …

解决显存不足问题:深度学习中的 Batch Size 调整【模型训练】

解决显存不足问题&#xff1a;深度学习中的 Batch Size 调整 在深度学习训练中&#xff0c;显存不足是一个常见的问题&#xff0c;特别是在笔记本等显存有限的设备上。本文将解释什么是 Batch Size&#xff0c;为什么调整 Batch Size 可以缓解显存不足的问题&#xff0c;以及调…

杰发科技AC7840——SENT数据解析及软件Sent发送的实现

0. 测试环境 AC7840官方Demo板&#xff1b; 图莫斯0503 DSlogic U2Basic 使用引脚 输出脚&#xff1a;PB1 时钟&#xff1a;PB2&#xff0c;其他引脚可以不初始化&#xff0c;不接线 1. 数据解析 以下是SENT数据的格式&#xff08;1tick以3us为例&#xff09;&#…

数据库中的事务

一、理解事务 1、本质 事务由一组DML语句组成&#xff0c;这一组语句要么全部成功&#xff0c;要么全部失败。在逻辑上&#xff0c;事务就是一组sql语句&#xff0c;但在实际中&#xff0c;公共的数据库一定会高并发地接受各种事务的请求&#xff0c;所以一个事务要有4个属性…

国内访问Docker Hub慢问题解决方法

在国内访问Docker Hub时可能会遇到一些困难&#xff0c;但幸运的是&#xff0c;有多种解决方案可以帮助你顺利下载Docker镜像。以下是一些有效的解决方案&#xff1a; 配置Docker镜像源&#xff1a;你可以通过配置Docker的daemon.json文件来使用国内镜像源&#xff0c;比如DaoC…

SpringCloud极限速通版

1.SpringCloud概述 1.1 什么是微服务 1.1.1 单体架构 业务所有功能都打包在一个war包或jar包&#xff0c;这种方式就是单体架构&#xff0c;单体架构的应用就是单体应用。这种架构开发简单&#xff0c;部署简单&#xff0c;一个项目包含所有功能&#xff1b;省去了多个项目之…

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(七)-广播远程识别码(Broadcast Remote ID)

目录 引言 5.5 广播远程识别码&#xff08;Broadcast Remote ID&#xff09; 5.5.1 使用PC5的广播远程识别码 5.5.2 使用MBS的广播远程识别码 引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及…

Sui主网升级至V1.28.4版本

Sui主网现已升级至V1.28.4版本&#xff0c;同时Sui协议升级至51版本。其他升级要点如下所示&#xff1a; #18536 将所有可能的connect_lazy错误推迟到请求时间处理。 #18206 明确将每轮领导者人数设置为1&#xff0c;以支持Mysticeti提交。 #17868 引入新功能标志和协议配…

MyBatis:高级标签使用技巧的详细指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 MyBatis 是一个优秀的持久层框架&#xff0c;提供了简单和灵活的 SQL 映射功能。除了基础的查询、插入、更新和删除操作外&#xff0c;MyBatis 还提供了一些高级标签&#xff0c;帮…

SQL 简单查询

目录 一、投影查询 1、指定特定列查询 2、修改返回列名查询 3、计算值查询 二、选择查询 1、使用关系表达式 2、使用逻辑表达式 3、使用 BETWEEN关键字 4、使用 IN关键字 5、使用 LIKE关键字 6、使用 IS NULL/ NOT NULL关键字 7、符合条件查询 三、聚合函数查询 一…

Docker_一刀流_好用、好玩还方便_(持续更新)

Docker 简介一、镜像和容器的概念镜像&#xff08;Image&#xff09;容器&#xff08;Container&#xff09;镜像和容器的关系 宿主机二、Dockerfile2.1 什么是Dockerfile2.2 Dockerfile中的常见指令2.3Dockerfile实例2.4 详细扩展 三、镜像3.1 镜像的创建3.2对于镜像的一些常用…

知识表示 | 利用 Protégé 软件构建小型本体

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在利用 Protg 软件构建小型本体&#xff0c;探索本体建模的实际应用&#xff0c;特别是应用本体与上层本体之间的关系继承与映射。我们将重点理解应用本体如何继承上层本体的关系&#xff0c;以及如何通过推理机制揭示实…

一起搭WPF界面之MVVM架构的简单搭建

一起搭WPF界面之MVVM架构的简单搭建 1 前言2 创建项目2.1新建项目2.2WPF2.3创建完成 3 MVVM划分3.1 划分逻辑3.2文件夹创建3.3文件创建3.3.1 Views——可在主界面的基础上&#xff0c;划分多个用户控件模块3.3.2 ViewModels——创建数据结构存放的cs文件3.3.3 Models——创建处…

网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程

前言 1.入行网络安全这是一条坚持的道路&#xff0c;三分钟的热情可以放弃往下看了。2.多练多想&#xff0c;不要离开了教程什么都不会了&#xff0c;最好看完教程自己独立完成技术方面的开发。3.有时多百度&#xff0c;我们往往都遇不到好心的大神&#xff0c;谁会无聊天天给…

用神经网络求解微分方程

微分方程是物理科学的主角之一&#xff0c;在工程、生物、经济甚至社会科学中都有广泛的应用。粗略地说&#xff0c;它们告诉我们一个量如何随时间变化&#xff08;或其他参数&#xff0c;但通常我们对时间变化感兴趣&#xff09;。我们可以了解人口、股票价格&#xff0c;甚至…

艺术成分很高的完全自定义的UITabBar(很简单)

引言 在iOS应用开发中&#xff0c;UITabBar是一个非常场景且重要的UI组件。系统为我们提供的UITabBar虽然功能强大&#xff0c;但是在某些情况下&#xff0c;它的标准样式并不能满足我们特定的设计需求&#xff0c;它的灵活性也有一些局限。为了打造更具个性化好的用户友好的交…

显卡驱动程序下载失败的原因及对策

在数字时代&#xff0c;显卡作为电脑的心脏部件之一&#xff0c;其驱动程序的正常运行是保证图形处理性能的关键。然而&#xff0c;不少用户在尝试下载显卡驱动程序时遭遇失败&#xff0c;这不仅影响了日常使用体验&#xff0c;还可能埋下系统不稳定的风险。本文将深入探讨显卡…

Mamba中的Mamba:在标记化Mamba模型中的集中式Mamba跨扫描高光谱图像分类

摘要 https://arxiv.org/pdf/2405.12003 高光谱图像&#xff08;HSI&#xff09;分类在遥感&#xff08;RS&#xff09;领域至关重要&#xff0c;尤其是随着深度学习技术的不断进步。顺序模型&#xff0c;如循环神经网络&#xff08;RNNs&#xff09;和Transformer&#xff0…