【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;

    @PostConstruct
    public void init(){
        //从Eureka中获取服务列表
        instances = discoveryClient.getInstances("product-service");
    }


    public OrderInfo selectOrderById(Integer orderId){
        OrderInfo orderInfo = orderMapper.selectOrderById(orderId);
        //计算轮流的实例idnex
        int index= count.getAndIncrement() % instances.size();
        //获取实例
        String uri = instances.get(index).getUri().toString();
        //拼接url
        String 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
    @Bean
    public 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
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

LoadBalancer原理

LoadBalancer的实现主要依赖于LoadBalancerInterceptor类。该类会拦截RestTemplate的请求,然后通过Eureka从服务注册中心根据服务ID获取服务列表。随后,利用负载均衡算法选取真实的服务地址信息,并替换原始的服务ID。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为仓颉开发语言“可能”明天正式面世(2024年6月20日写下)

众多迹象表明&#xff0c;鸽了几次的华为仓颉开发语言&#xff0c;有望在2024华为开发者大会上正式面世&#xff0c;你的期待热情是否还在&#xff1f; 1、“仓颉编程语言”公众号面世 最近&#xff0c;华为旗下的公众号“编程语言Lab”悄然改名为“仓颉编程语言”&#xff0c…

EasyCVR/EasyDSS无人机直播技术助力野生动物监测

近日有新闻报道&#xff0c;一名挖掘机师傅在清理河道时&#xff0c;意外挖出一只稀有的扬子鳄&#xff0c;挖机师傅小心翼翼地将其放在一边&#xff0c;扬子鳄也顺势游回一旁的河道中。 随着人类对自然环境的不断探索和开发&#xff0c;野生动物及其栖息地的保护显得愈发重要。…

SpringBoot对接微信公众平台(2)--- 接收普通消息Demo

SpringBoot对接微信公众平台&#xff08;2&#xff09;--- 接收普通消息 说明后端代码 说明 这里记录下自己学习SpringBoot对接微信公众平台的成长过程&#xff0c;以防止后面继续踩坑且方便以后直接使用。这里使用微信公众号的接口测试号来开发微信公众平台。这里承接自己的博…

图像超分辨率重建

一、什么是图像超分辨 图像超分辨是一种技术&#xff0c;旨在通过硬件或软件的方法提高原有图像的分辨率。这一过程涉及从一系列低分辨率的图像中获取一幅高分辨率的图像&#xff0c;实现了时间分辨率向空间分辨率的转换。超分辨率重建的核心思想是利用多帧图像序列的时间带宽来…

小程序使用经纬度通过腾讯位置服务、小程序jdk、逆地址解析(位置描述)获取到详细信息

小程序后台 注册账户 控制台新建应用 配额 配额 下载jdk 下载 逆地址解析&#xff08;位置描述&#xff09; const QQMapWX require(../../libs/qqmap-wx-jssdk.min.js);getPosition() {console.log(getPosition);const that thisconst qqmapsdk new QQMapWX({key: JRKBZ…

[Linux] Shell

chsh不是一种sh,而是一个命令行使用程序&#xff0c;用于更改默认shell CentOS是个开源软件&#xff0c;没有sh,sh是商业版的&#xff0c; 按ls /bin/*sh显示的sh实际上是个链接文件&#xff0c;连接的bash 在命令行输入新的sh名&#xff0c;会启动一个新的进程&#xff0c; 输…

IDEA2023中使用run Dashboard面板?实现批量运行微服务

1、直接点击Add service--->Run Configuration Type---->Spring Boot 2、这样就出现了run Dashboard面板&#xff0c;可同时运行多个工程模块&#xff0c;shift选中所有启动类组命名&#xff08;Group Configurations&#xff09; 3、启动所有的项目

[机器学习算法]支持向量机

支持向量机&#xff08;SVM&#xff09;是一种用于分类和回归分析的监督学习模型。SVM通过找到一个超平面来将数据点分开&#xff0c;从而实现分类。 1. 理解基本概念和理论&#xff1a; 超平面&#xff08;Hyperplane&#xff09;&#xff1a;在高维空间中&#xff0c;将数据…

Transformer与强化学习结合提升物联网智能决策

在数字化时代&#xff0c;物联网(IoT)的兴起已经彻底改变了我们与物理世界的互动方式。通过将日常家居用品到精密的工业机械等设备连接到互联网&#xff0c;IoT构建了一个庞大的互联生态系统&#xff0c;它所产生的数据量是前所未有的。这些数据为我们提供了丰富的信息资源&…

am62x芯片安全类型确认(HS-SE, HS-FS or GP)

文章目录 芯片安全类型设置启动方式获取串口信息下载脚本运行脚本示例sk-am62x板卡参考芯片安全类型 AM62x 芯片有三个安全级别。 • GP:通用版本 • HS-FS:高安全性 - 现场安全型 • HS-SE:高安全性 - 强制安全型 在SD卡启动文件中,可以查看到, 但板上的芯片,到底是那…

RPM命令和YUM命令

目录 一、RPM软件包 1.1、RPM概述 1.2、查询已安装的rpm软件信息 1.3、查询未安装的 RPM 软件包文件中信息 1.4、安装、升级、卸载 RPM 软件包 二、YUM常规命令 三、手动配置Apache&#xff08;http&#xff09;服务 3.1、前提条件 3.2、开始配置 3.3、开启验证服务 …

2024人工智能指数报告(二):技术性能

背景 从2017年开始&#xff0c;斯坦福大学人工智能研究所&#xff08;HAI&#xff09;每年都会发布一份人工智能的研究报告&#xff0c;人工智能指数报告&#xff08;AII&#xff09;&#xff0c;对上一年人工智能相关的数据进行跟踪、整理、提炼并进行可视化。这份指数报告被认…

产品经理方法论

1、用户体验 5 要素 1&#xff0c;表现层是你拿到一个产品以后&#xff0c;视觉表现&#xff0c;配色&#xff0c;布局&#xff0c;排版等等 2&#xff0c;框架层&#xff0c;是交互层面的东西&#xff0c;比如&#xff0c;操作情况&#xff0c;刷新&#xff0c;页面跳转&…

双通道-程控绝缘测试电阻箱的性能

双通道-程控绝缘测试电阻箱是高精度、高性能的电气测量设备&#xff0c;广泛应用于电力系统、电气设备、电子设备等领域。采用先进的数字式电阻测量技术&#xff0c;具有高精度、高稳定性的测量性能。其测量误差小于0.05%&#xff0c;能够满足各种精密测量的需求。 双通道-程控…

EarMaster Pro中文版安装包下载及安装教程

​众所周知软件功能和优势&#xff1a;插上麦克风&#xff0c;演唱&#xff0c;拍手, 或在电脑屏幕上演奏您的答案(您还能够选择在mid键盘上演奏答案)。很明显来自丹麦皇家歌曲学院的多媒体歌曲教育软件 EarMaster Pro以问答的交互形式&#xff0c;寓教于乐的视听方法&#xff…

VMware RedHat虚拟机磁盘扩容(添加磁盘和扩展磁盘)

前言 自己的电脑上配一个虚拟机还是很有必要的&#xff0c;用起来比双系统方便一点&#xff0c;之前搞了100g的ubuntu没用到&#xff0c;后面重装redhat觉得随便搞个20g就够用了&#xff0c;后面用到之后就遇到磁盘不够用的情况&#xff0c;只能说情况允许的话&#xff0c;磁盘…

【数据结构】第十八弹---C语言实现堆排序

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、堆排序 1.1、基本思想 1.2、初步代码实现 1.3、代码优化 1.4、代码测试 总结 1、堆排序 在博主数据结构第十二弹---堆的应用有详细讲解堆…

Hadoop 2.0 大家族(一)

目录 一、Hadoop 2.0大家族概述&#xff08;一&#xff09;分布式组件&#xff08;二&#xff09;部署概述 二、ZooKeeper&#xff08;一&#xff09;ZooKeeper简介&#xff08;二&#xff09;ZooKeeper 入门 一、Hadoop 2.0大家族概述 &#xff08;一&#xff09;分布式组件 …

Java中的While循环及其示例

Java中的While循环及其示例 在本教程中&#xff0c;您将借助示例在java中学习while循环。与for循环类似&#xff0c;while循环用于重复执行一组语句&#xff0c;直到指定的条件返回false。 while循环的语法 while(condition) {statement(s); //block of code } while循环的…

RAG优化技巧|7大挑战与解決方式|提高你的LLM能力

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为无处不在的技术&#xff0c;它们不仅改变了我们与机器交流的方式&#xff0c;还在各行各业中发挥着革命性的影响。 然而&#xff0c;尽管LLM RAG的能力已经让人惊叹&#xff0c;但我…