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

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

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

相关文章

react学习——02虚拟dom创建的两种方式

1、使用jsx创建虚拟DOM const vdom <h1 id"title" className"red"><span>helloReact</span></h1> /*此处一定不要写引号*/<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8&quo…

【八股系列】点击一个按钮,浏览器会做些什么事情【呈现效果时流程】?(js)

文章目录 1. 事件的启程&#xff1a;捕获与目标识别2. 核心环节&#xff1a;事件处理与JavaScript的魔法2.1. 识别事件源&#xff1a;2.2. 查找事件监听器&#xff1a;2.3. 执行JavaScript代码&#xff1a; 3. 视觉重塑&#xff1a;UI的更新之旅4. 事件的回响&#xff1a;冒泡与…

pip下载越来越慢,需要怎么提速了?

pip下载慢通常是因为默认的Python包索引服务器在国外&#xff0c;国内访问受到网络限制。 为了解决这个问题&#xff0c;可以尝试以下几种方法来提高pip下载速度&#xff1a; 更换镜像源&#xff1a; 中国科技大学、清华大学等国内高校提供了Python包索引的镜像&#xff0c;你…

数据丢失?别怕,EasyRecovery来帮忙!

&#x1f31f; 数据丢失&#xff1f;别怕&#xff0c;EasyRecovery来帮忙&#xff01; 嘿&#xff0c;亲爱的的朋友们&#xff01;&#x1f44b;今天我要和大家分享一款超棒的数据恢复软件——EasyRecovery&#xff01;&#x1f389;你是否曾经遇到过不小心删除了重要文件、照片…

深入理解微服务架构 - Spring Cloud

目录 一 Spring Cloud概述 什么是Spring Cloud? 为什么选择Spring Cloud? 二 Spring Cloud的核心组件 Spring Cloud Config 概述 工作原理 示例代码 Spring Cloud Netflix Eureka 概述 工作原理 示例代码 Spring Cloud Ribbon 概述 工作原理 示例代码 Sprin…

支持向量机介绍

一、引言 1.支持向量机&#xff08;SVM&#xff09;的概念和背景 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种起源于统计学习理论的分类和回归算法。20世纪60年代&#xff0c;Vapnik等人提出了支持向量机理论&#xff0c;该理论基…

zip文件上传到linux服务器文件大小发生变化

在传一个文件到服务器的时候&#xff0c;第一次传完看见大小不一样&#xff08;服务器中du命令查看大小796596MB&#xff09;就重传了一下&#xff0c;还是大小不一样&#xff0c;就查了下。 查了下有以下原因&#xff1a; 文件系统的不同&#xff1a; 原因&#xff1a;不同的…

双色球预测算法(Java),——森林机器学习、时间序列

最近AI很火&#xff0c;老想着利用AI的什么算法&#xff0c;干点什么有意义的事情。其中之一便想到了双色球&#xff0c;然后让AI给我预测&#xff0c;结果基本都是简单使用随机算法列出了几个数字。 额&#xff0c;&#xff0c;&#xff0c;&#xff0c;咋说呢&#xff0c;双…

leetcode232用栈实现队列

本文主要讲解用栈实现队列的要点与细节&#xff0c;按照步骤思考更方便理解&#xff0c;同类型队列实现栈 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; vo…

windows 系统根据端口查找进程,杀死进程

在启动项目时&#xff0c;往往设置的端口被占用&#xff0c;这时需要杀死端口所占用的进程&#xff0c;然后再重启项目。 netstat -ano | findstr :8085 taskkill /F /PID 25184 杀死进程后&#xff0c;再执行命令 netstat -ano | findstr :8085 进行查看端口占用情况

STM32多功能交通灯系统:从原理到实现

一、功能说明 本交通灯系统采用先进的stm32f103c8t6微处理器为核心控制单元。系统设置东南西北四个方向各配置两位数码管&#xff0c;用以精准展示5至99秒的时间范围&#xff0c;并且允许用户根据实际需求进行灵活调整。 在信号灯配置方面&#xff0c;每个方向均配备左转、直…

SYD881X读取GATT VALUE的长度

SYD881X读取GATT VALUE的长度 现在具体遇到这样一个需要&#xff0c;机器生产后要更新profile&#xff0c;这个只能够通过升级4K来做&#xff0c;但是需要知道profile是否改变了&#xff0c;这个就要知道profile是否改变来决定是否要升级&#xff0c;这里的做法是增加一个函数&…

肩背筋膜炎怎么治疗最有效

肩背筋膜炎是一种常见的肌肉骨骼疾病&#xff0c;其症状主要包括&#xff1a;肩背区域疼痛&#xff1a;由于筋膜组织受到损伤&#xff0c;肩背部位会出现明显的疼痛&#xff0c;疼痛可能会放射到周围的其他部位&#xff0c;严重时会影响睡眠和休息。肌肉紧张和僵硬&#xff1a;…

嵌入式数据库_2.嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关&#xff0c;其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库&#xff0c;2013年3月推出5.0版&#xff0c;它采用内存数据结构&…

智能座舱中的HUD介绍

HUD&#xff08;Head Up Display&#xff0c;抬头显示系统&#xff09;是将车速、油耗、胎压等行车重要信息投影到前方挡风玻璃上的一套显示系统。HUD 最早应用在战斗机上&#xff0c;旨在降低飞行员低头查看仪表的频率&#xff0c;使得飞行员能在保证正常驾驶的同时&#xff0…

2002-2022年各省人口总抚养比数据(人口抽样调查)

2002-2022年各省人口总抚养比数据&#xff08;人口抽样调查&#xff09; 1、时间&#xff1a;2002-2022年 2、指标&#xff1a;总抚养比 3、来源&#xff1a;国家统计局、统计年鉴 4、范围&#xff1a;31省&#xff0c; 5、缺失情况&#xff1a;无缺失&#xff0c;其中201…

Git 和 TortoiseGit 安装和配置(图文详解)

使用git&#xff0c;需要在Windows上需要安装两个软件&#xff1a;1&#xff09;Git 2&#xff09;TortoiseGit 注意&#xff1a;tortoiseGit是在安装了Git的基础上运行的&#xff0c;所以需要先安装Git&#xff0c;后安装运行tortoiseGit。 因为&#xff0c;运行TortoiseGi…

10个方面分析Dubbo和SpringCloud有什么区别

Dubbo 和 Spring Cloud 都是微服务架构中非常流行的服务治理框架&#xff0c;但它们在多个方面存在区别&#xff1a; 1. 核心要素和开发成本&#xff1a;Spring Cloud 在开发过程中通过整合子项目可以顺利完成组件融合&#xff0c;而 Dubbo 需要通过实现各种 Filter 进行定制&…

李光明从程序员到架构师的逆袭之路(五)

来上海已经是第六天了&#xff0c;春天的气息在这座繁华都市中渐渐弥漫。我的同学张攀&#xff0c;一个勤奋且才华横溢的小伙子&#xff0c;昨天兴奋地告诉我们&#xff0c;他收到了浦东一家外包公司的offer&#xff0c;月薪高达8500块。你能想象他当时的喜悦吗&#xff1f;他的…

C/S结构应用程序与B/S结构应用程序的主要区别

1.B/S结构 1.1B/S概念&#xff1a; &#xff08;Brower/Server,浏览器/服务器&#xff09;模式又称B/S结构&#xff0c;是Web兴起后的一种网络结构模式。Web浏览器是客户端最主要的应用软件。 这种模式统一了客户端&#xff0c;将系统功能实现的核心部分集中到服务器上&#x…