SpringCloud--负载均衡

news2024/12/23 13:22:38

目录

前言

一.负载均衡的引入

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 {
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    RestTemplate restTemplate;
    @Autowired
    private DiscoveryClient discoveryClient;

    // 计时器
    private static AtomicInteger atomicInteger = new AtomicInteger(1);
    private static List<ServiceInstance> instances;

    @PostConstruct
    public 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
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

StudentService类:

@Service
public class StudentService {
    @Autowired
    StudentMapper studentMapper;
    @Autowired
    RestTemplate 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 {
    @Bean
    ReactorLoadBalancer<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
    @LoadBalanced
    public 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.coloradmin.cn/o/1940781.html

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

相关文章

spark 广播变量broadcast

broadcast使用如下图&#xff0c;可以看到创建broadcast是val barr1 sc.broadcast(arr1)&#xff0c;使用broadcast是barr1.value 创建broadcast是使用的broadcastManager。 BroadcastManager cachedValues变量是map结构&#xff0c;key是broadcastId&#xff0c;强引用&a…

初识C++|模板初阶

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 &#x1f349;1. 泛型编程 &#x1f349;2. 函数模板 &#x1f95d;2.1 函数模板概念 &#x1f95d;2.2 函数模板格式 &#x1f95d;2.3 函数模板的原理 &#x1f95…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

1997. 孤独的素数(结果有一点问题,希望能一起求解)

问题描述 在一个 &#x1d45b; 行 &#x1d45a;列的矩阵王国中&#xff0c;生活着一些整数&#xff0c;其中一些是素数&#xff0c;一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数&#xff0c;我们就认为这是一个孤独的素数。 比如&am…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

【零基础必看的前端教程】——JavaScript(四)类型转换

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…

spring-retry详解

spring-retry详解 1.引入依赖2.Retryable基础使用3.Recover使用4.Retryable参数详解5.需要注意 重试机制对于大部分场景来说都是必要的&#xff0c;比如同步调用三方接口&#xff0c;三方接口、信息拉取等网络原因突然不通&#xff0c;有了重试就可以多一些容错机制&#xff0c…

压缩包方式windows安装mysql

压缩包方式windows安装mysql 本文介绍通过压缩包方式在Windows本地安装mysql。 一、 具体步驟 步骤1&#xff0c;下载mysql压缩程序 这里好像上传不了压缩文件&#xff0c;先这样吧&#xff0c;后期补充。 步骤2&#xff0c;解压并手写添加 my.ini 文件 my.ini 文件内容如下…

Air780EP-AT开发-HTTP应用指南

简介 关联文档和使用工具&#xff1a; AT固件获取AT指令手册 概述 4G模块支持HTTP和HTTPS协议&#xff0c; HTTP应用的基本流程如下&#xff1a; 1、激活PDP&#xff08;参考&#xff1a;http://oldask.openluat.com/article/937&#xff09;2、初始化HTTP服务3、设置HTTP会话…

17_高级进程间通信 UNIX域套接字1

非命名的UNIX域套接字 第1个参数domain&#xff0c;表示协议族&#xff0c;只能为AF_LOCAL或者AF_UNIX&#xff1b; 第2个参数type&#xff0c;表示类型&#xff0c;只能为0。 第3个参数protocol&#xff0c;表示协议&#xff0c;可以是SOCK_STREAM或者SOCK_DGRAM。用SOCK_STR…

ontap simulator配置过程

一、下载模拟器 参考《Simulate_ONTAP_9-14-1_Installation_and_Setup_Guide.pdf》P4的指导&#xff0c;登录网站进行下载。 二、传入pve&#xff0c;并解压转换 # 解压 tar -xvf vsim-netapp-DOT9.14.1-cm_nodar.ova# 解压后的文件列表&#xff0c;其中ovf文件里定义了虚拟机…

Docker部署Elasticsearch8.6.0 Kibana8.6.0

为了匹配springboot3.0.x&#xff0c;安装Elasticsearch:8.5.3 拉取镜像&#xff0c;遇到问题&#xff01; [rootserver01 ~]# docker pull elasticsearch:8.5.3 8.5.3: Pulling from library/elasticsearch eaead16dc43b: Retrying in 1 second a405acf5b7d4: Retrying in 1…

结构体[C语言]

文章目录 结构体的概念结构体的用法定义结构体创建结构体变量访问结构体成员 结构体的应用 结构体的概念 结构体是一种用户自定义的数据类型&#xff0c;它允许我们将逻辑上相关的不同数据类型组合在一起。例如&#xff0c;如果我们想要表示一个学生的信息&#xff0c;我们可以…

texify - 识别数学/图像 PDF

文章目录 一、关于 texify例子训练 二、安装手动安装 三、使用1、使用技巧2、用于交互转换的应用程序3、转换图像4、Python 中导入并运行 四、限制五、基准测试运行自己的基准测试 六、其它商业用途感谢 一、关于 texify Texify是一种OCR模型&#xff0c;它将包含数学的图像或…

数据结构(Java):优先级队列(堆)堆的模拟实现PriorityQueue集合

目录 1、优先级队列 1.1 概念 1.2 PriorityQueue底层结构 2、 堆 2.1 堆的概念 2.2 堆的存储结构 3、优先级队列&#xff08;堆&#xff09;的模拟实现 3.1 堆的创建 3.1.1 向下调整算法建完整堆 3.2 堆的插入 3.2.1 向上调整算法 3.3 堆的删除 3.4 堆排序 4、Pri…

Java实现随机题库-全站最呆瓜思想,保证你能学会

目录 Blue留言 &#xff1a; 学本篇文章之前所需掌握技能 推荐视频&#xff1a; 代码逻辑思想 步骤&#xff1a; 1、引入依赖 2、做一个excel表格 3、java实现从excel表中取数据 第一步&#xff1a;根据excel上面的字段名&#xff08;如下图&#xff09;&#xff0…

Python应用开发——30天学习Streamlit Python包进行APP的构建(18):定制组件

Custom components定制组件 st.components.v1.declare_component 创建自定义组件,并在有 ScriptRunContext 的情况下进行注册。 如果没有 ScriptRunContext,则不会注册该组件。当自定义组件作为独立命令执行时(如用于测试),可能会出现这种情况。 要使用该函数,请从 s…

网络安全常用易混术语定义与解读(Top 20)

没有网络安全就没有国家安全&#xff0c;网络安全已成为每个人都重视的话题。随着技术的飞速发展&#xff0c;各种网络攻击手段层出不穷&#xff0c;保护个人和企业的信息安全显得尤为重要。然而&#xff0c;在这个复杂的领域中&#xff0c;许多专业术语往往让人感到困惑。为了…