当前位置: 首页 > news >正文

【SpringCloud】 实现负载均衡

文章目录

  • 🍃前言
  • 🍀问题现象观察
  • 🌴负载均衡
    • 🚩负载均衡的⼀些实现
      • 🎈服务端负载均衡
      • 🎈客户端负载均衡
    • 🚩使用 Spring Cloud LoadBalancer 实现负载均衡
    • 🚩负载均衡策略
  • ⭕总结

🍃前言

在 《Spring Cloud】 使用Eureka实现服务注册与服务发现》 中我们在获取服务时的代码如下:
在这里插入图片描述
我们每次获取的都是第一个服务,当只有一个服务时,这样是没有问题的,但是当存在多个服务时,就会出现问题。

接下来我们创建多个服务,看一下问题效果。

🍀问题现象观察

我们所启动服务是 OrderService 调用 ProductService 服务,所以我们这里在多开几个 ProductService 服务,然后再使用 OrderService 进行调用。

我们再启动2个product-service实例,操作步骤如下:

  1. 选中要启动的服务, 右键选择 Copy Configuration…

在这里插入图片描述

  1. 在弹出的框中, 选择 Modify options

在这里插入图片描述

  1. 选中Add VM options

在这里插入图片描述

  1. 添加服务启动的端口号:

在这里插入图片描述

如此一个服务就添加好了,按照此步骤,我们可以再多添加两个。

在这里插入图片描述

此时我们将这五个服务都启动起来,访问 127.0.0.1:1010 观察服务是否注册成功

在这里插入图片描述

然后我们再多次访问 http://127.0.0.1:9998/order/1

观察后端日志
在这里插入图片描述
我们发现多次访问的都是一个端口号的服务,其他端口号的服务并没有被使用。

这肯定不是我们想要的结果, 我们启动多个实例, 是希望可以分担其他机器的负荷, 那么如何实现呢?

这时候我们有两种方法

  1. 使用轮询操作,一个一个调用其他服务
  2. 随机调用

通过这两种方法,请求就可均衡的分配在不同的实例,这就是负载均衡

下面是简单的一个轮询操作

@Slf4j
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;@Resourceprivate DiscoveryClient discoveryClient;public OrderInfo selectAll(Integer userid) {OrderInfo orderInfo = orderMapper.selectAll(userid);//String url = "http://127.0.0.1:9999/product/" + orderInfo.getProductId();List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//服务可能有多个, 获取第⼀个System.out.println("instances" + instances.size());EurekaServiceInstance instance = (EurekaServiceInstance)instances.get(0);log.info(instance.getInstanceId());//拼接urlString url = instance.getUri()+"/product/"+ orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}

🌴负载均衡

负载均衡(Load Balance,简称 LB) , 是高并发, ⾼可⽤系统必不可少的关键组件

当服务流量增⼤时, 通常会采用增加机器的⽅式进⾏扩容, 负载均衡就是⽤来在多个机器或者其他资源中, 按照⼀定的规则合理分配负载.

⼀个团队最开始只有⼀个⼈, 后来随着⼯作量的增加, 公司⼜招聘了⼏个⼈. 负载均衡就是: 如何把⼯作量均衡的分配到这⼏个⼈⾝上, 以提⾼整个团队的效率

🚩负载均衡的⼀些实现

上面只是简单的提了了一下负载均衡的两种方法,但是真实的业务场景会更加复杂. ⽐如根据机器的配置进⾏负载分配, 配置⾼的分配的流量⾼, 配置低的分配流量低等.

服务多机部署时, 开发⼈员都需要考虑负载均衡的实现, 所以也出现了⼀些负载均衡器, 来帮助我们实现负载均衡.

  • 负载均衡分为服务端负载均衡和客户端负载均衡.

🎈服务端负载均衡

在服务端进⾏负载均衡的算法分配.⽐较有名的服务端负载均衡器是Nginx.

请求先到达Nginx负载均衡器, 然后通过负载均衡算法, 在多个服务器之间选择⼀个进⾏访问.

在这里插入图片描述

🎈客户端负载均衡

在客⼾端进⾏负载均衡的算法分配

把负载均衡的功能以库的⽅式集成到客⼾端,⽽不再是由⼀台指定的负载均衡设备集中提供。

⽐如Spring Cloud的Ribbon,请求发送到客⼾端,客⼾端从注册中⼼(⽐如Eureka)获取服务列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进⾏访问。

Ribbon是Spring Cloud早期的默认实现,由于不维护了,所以最新版本的Spring Cloud负载均衡集成的是Spring Cloud LoadBalancer(Spring Cloud官⽅维护)
在这里插入图片描述

🚩使用 Spring Cloud LoadBalancer 实现负载均衡

SpringCloud 从 2020.0.1 版本开始, 移除了Ribbon组件,使⽤Spring Cloud LoadBalancer 组件来代
替 Ribbon 实现客⼾端负载均衡

用Spring Cloud LoadBalancer 实现负载均衡分为以下两步

  1. 给 RestTemplate 这个Bean添加 @LoadBalanced 注解就可以

在这里插入图片描述

  1. 修改IP端⼝号为服务名称

在这里插入图片描述

这样两部操作后,再启动观察product-service的⽇志,就会发现请求被分配到这3个实例上了

🚩负载均衡策略

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

  1. 轮询(Round Robin):轮询策略是指服务器轮流处理⽤⼾的请求。这是⼀种实现最简单,也最常⽤的
    策略。⽣活中也有类似的场景,⽐如学校轮流值⽇,或者轮流打扫卫⽣。
  2. 随机选择(Random):随机选择策略是指随机选择⼀个后端服务器来处理新的请求

我们也可以自定义负载均衡的策略,这里博主就不进行演示了,需要的小伙伴可以去官网进行查看 官网点我

⭕总结

关于《【SpringCloud】 实现负载均衡》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++ 09】继承
  • Path系统环境变量和CLASSPATH环境变量
  • 存储课程学习笔记2_借助内核插入一个文件系统,用文件夹下测试文件系统(mount文件系统到目录下是入口)
  • yolov5-6.2 在 rk3399pro 上的移植
  • 力扣面试150 三角形最小路径和 DFS 记忆化搜索 DP 滚动数组优化DP
  • 一次性了解Neo4j图形数据库
  • 外贸人提高潜在客户EDM电子邮件营销参与度的一些建议
  • C++ 类型的转换
  • vivado 时间汇总报告
  • 一台手机一个ip地址吗?手机ip地址泄露了怎么办
  • 快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
  • Lianwei 安全周报|2024.09.09
  • 【springsecurity】使用PasswordEncoder加密用户密码
  • 基于单片机的简易录音笔设计
  • 九月五日(k8s配置)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • Angular2开发踩坑系列-生产环境编译
  • CEF与代理
  • Git同步原始仓库到Fork仓库中
  • MD5加密原理解析及OC版原理实现
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • mysql 数据库四种事务隔离级别
  • mysql外键的使用
  • Vue2.x学习三:事件处理生命周期钩子
  • 从输入URL到页面加载发生了什么
  • 服务器从安装到部署全过程(二)
  • 数据结构java版之冒泡排序及优化
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 小程序测试方案初探
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​ubuntu下安装kvm虚拟机
  • ​人工智能书单(数学基础篇)
  • #include到底该写在哪
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (33)STM32——485实验笔记
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (zhuan) 一些RL的文献(及笔记)
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (分类)KNN算法- 参数调优
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (未解决)macOS matplotlib 中文是方框
  • (转载)深入super,看Python如何解决钻石继承难题
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8.0 发布到 IIS
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .Net6 Api Swagger配置
  • .NET框架设计—常被忽视的C#设计技巧
  • :not(:first-child)和:not(:last-child)的用法
  • @EnableWebMvc介绍和使用详细demo
  • [000-01-030].Zookeeper学习大纲
  • [1]从概念到实践:电商智能助手在AI Agent技术驱动下的落地实战案例深度剖析(AI Agent技术打造个性化、智能化的用户助手)
  • [20180129]bash显示path环境变量.txt