添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢?

2023-11-04

SpringCloud01:认识微服务
任何架构都离不开服务的拆分,微服务的拆分和远程调用你会吗?
Eureka学习:搭建eureka-server、将user-service注册到eureka-server中

Ribbon负载均衡

上一节中,我们添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢?

1.负载均衡原理

SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。

在这里插入图片描述

那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢?

2.源码跟踪

为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。

显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。

我们进行源码跟踪:

1)LoadBalancerIntercepor

在这里插入图片描述

可以看到这里的intercept方法,拦截了用户的HttpRequest请求,然后做了几件事:

  • request.getURI():获取请求uri,本例中就是 http://user-service/user/8
  • originalUri.getHost():获取uri路径的主机名,其实就是服务id,user-service
  • this.loadBalancer.execute():处理服务id,和用户请求。

这里的this.loadBalancerLoadBalancerClient类型,我们继续跟入。

2)LoadBalancerClient

继续跟入execute方法:

在这里插入图片描述

代码是这样的:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。
  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

放行后,再次访问并跟踪,发现获取的是8081:

在这里插入图片描述

果然实现了负载均衡。

3)负载均衡策略IRule

在刚才的代码中,可以看到获取服务使通过一个getServer方法来做负载均衡:

在这里插入图片描述

我们继续跟入:

在这里插入图片描述

继续跟踪源码chooseServer方法,发现这么一段代码:

在这里插入图片描述

我们看看这个rule是谁:

在这里插入图片描述

这里的rule默认值是一个RoundRobinRule,看类的介绍:

在这里插入图片描述

这不就是轮询的意思嘛。

到这里,整个负载均衡的流程我们就清楚了。

4)总结

SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下:

在这里插入图片描述

基本流程如下:

  • 拦截我们的RestTemplate请求http://userservice/user/1
  • RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  • DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  • eureka返回列表,localhost:8081、localhost:8082
  • IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  • RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求

3.负载均衡策略

3.1.负载均衡策略

负载均衡的规则都定义在IRule接口中,而IRule有很多不同的实现类:

在这里插入图片描述

不同规则的含义如下:

内置负载均衡规则类 规则描述
RoundRobinRule 简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule 对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的..ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule 为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule 忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule 随机选择一个可用的服务器。
RetryRule 重试机制的选择逻辑

默认的实现就是ZoneAvoidanceRule,是一种轮询方案

3.2.自定义负载均衡策略

通过定义IRule实现可以修改负载均衡规则,有两种方式:

  1. 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则:
userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

注意,一般用默认的负载均衡规则,不做修改。

4.饥饿加载

Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。

而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载:

ribbon:
  eager-load:
    enabled: true
    clients: userservice
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢? 的相关文章

  • tasklet与workqueue的区别及底层实现区别

    softirq和tasklet都属于软中断 tasklet是softirq的特殊实现 workqueue是普通的工作队列 1 softirq 软中断支持SMP 同一个softirq可以在不同的CPU上同时运行 softirq必须是可重入的
  • Zabbix 如何动态执行监控采集脚本

    在使用Zabbix自定义脚本采集监控数据的时候 通常会遇到以下一些问题 服务器扩容之后 监控脚本如何部署到新的服务器上 监控脚本需要修改时 如何自动修改所有相同的监控脚本 如何备份监控采集脚本避免因服务器异常后丢失 新部署自定义监控 如何避
  • 能通过一张照片(2D)得到3D的模型吗?

    如下内容已经整理成 PDF 很好奇其实如果将人眼所看到的画面保存下来 拍照 人类是可以感知照片内的各个物体 是不是可以理解成这是一种2D到3D认知的转换 作者 知乎用户 链接 https www zhihu com question 529
  • win7蓝屏报错:STOP:0x0000007E

    报错环境 win 7 报错信息 STOP 0x0000007E 解决办法 0X0000007E代码的意思是电脑中病毒了或是电脑内存条出现了问题 电脑中病毒问题怎么处理 2 1如果是电脑中病毒 开机按电脑上的F8键 在电脑开机菜单栏找到 安全

随机推荐

  • 经典网络LeNet-5介绍及代码测试(Caffe, MNIST, C++)

    LeNet 5 包含7个层 layer 如下图所示 输入层没有计算在内 输入图像大小为32 32 1 是针对灰度图进行训练和预测的 论文名字为 Gradient Based Learning Applied to Document Reco
  • 为什么街头篮球总提示服务器维护,我玩街头篮球,但这几天它总是说连接不上服务器怎么回事?...

    我玩街头篮球 但这几天它总是说连接不上服务器怎么回事 來源 互聯網 2010 04 26 07 19 32 評論 分類 遊戲 gt gt 網絡遊戲 gt gt 街頭籃球 問題描述 我下载了补丁 參考答案 无法连接服务器 情况屡见不鲜 不巧
  • 如何应急响应

    应急响应事件分类 大致可以分为三类 1 勒索病毒 勒索病毒危害不言而喻 一旦中了勒索病毒 几乎很难破解 只能通过重装系统 数据备份恢复或者缴纳相应被勒索的比特币支付进行病毒解除 仍有一种比较渺茫的方式进行病毒解除 那就是溯源到攻击者 通过法
  • Expanding Low-Density Latent Regions for Open-Set Object Detection

    Expanding Low Density Latent Regions for Open Set Object Detection CVPR2022 Code https github com csuhan opendet2 这篇文章认为
  • 【Spring八】Spring与Hibernate整合

    Hibernate所需元素 三要素 实体类 hbm xml hibernate cfg xml Spring所需元素 applicationContext xml hibernate在操作数据库时 使用sessionFactory open
  • 华为OD机试 - 绘图机器(Java)

    题目描述 绘图机器的绘图笔初始位置在原点 0 0 机器启动后按照以下规则来进行绘制直线 1 尝试沿着横线坐标正向绘制直线直到给定的终点E 2 期间可以通过指令在纵坐标轴方向进行偏移 offsetY为正数表示正向偏移 为负数表示负向偏移 给定
  • 第一章 指针仪表识别之仪表检测

    文章目录 一 基于Hough变换的仪表检测 附源码 二 基于SURF模板匹配仪表检测 附源码 三 基于YOLO深度学习的仪表检测 附源码 指针式仪表读数算法主要用于工业变电站环境 变电站环境复杂 仪表类型众多 仪表图像通过巡检机器人的可见光
  • jdk17.0.6的安装配置

    下载资源 官网下载 Java Archive Downloads Java SE 17 oracle com https www oracle com java technologies javase jdk17 archive downl
  • Cuda Streams的概述(一)-- Cuda介绍

    最近在做有关Cuda的一个项目 碰到匪夷所思的问题 在异步的时候发现并没有达到预期的效果 程序没有异步起来 然后在网上找了一个Nvida的有关Cuda Streams的一个ppt 然后照着里面的提示 使程序达到了异步的效果 首先 先回顾一下
  • linux VLAN配置(vconfig)

    1 安装vlan vconfig 和加载8021q模块 aptitude install vlan modprobe 8021q 或 yum install vconfig modprobe 8021q lsmod grep i 8021q
  • AndroidStudio编译构建报错 Task ‘wrapper‘ not found in project ‘:xxx‘

    在项目 app 中找不到的任务 包装器 Task wrapper not found in project xxx 的问题 原因 build gradle 文件没有包装器任务 解决步骤 将此代码添加到 build gradle task w
  • PO、VO、DAO、BO、DTO、POJO 能分清吗?

    一 PO persistant object 持久对象 可以看成是与数据库中的表相映射的java对象 使用Hibernate来生成PO是不错的选择 二 VO value object 值对象 通常用于业务层之间的数据传递 和PO一样也是仅仅
  • vue中的h函数与JSX语法

    vue不仅像react一样实现了jsx 而且还借助jsx发挥了javascript动态画的优势 了解学习jsx可以让你更灵活的开发需求 一 h函数 在聊vue中的JSX之前 需要简单介绍一下 h 函数 理解了 h 函数 会更好的理解JSX
  • 华为OD机试 - 士兵过河(Java)

    题目描述 一支N个士兵的军队正在趁夜色逃亡 途中遇到一条湍急的大河 敌军在T的时长后到达河面 没到过对岸的士兵都会被消灭 现在军队只找到了1只小船 这船最多能同时坐上2个士兵 当1个士兵划船过河 用时为 a i 0 lt i lt N 当2
  • mybatis更新和插入语句报错的原因和解决方法

    做一个小项目时 想实现添加和修改用户的功能 发现以下语句程序报错 INSERT INTO hrm user NAME PASS WORD STATUS DESC role createDATE createUSER VALUES 1 2 3
  • WorldEdit 指令大全 & 开发记录

    文章目录 服务端 客户端 运行配置 通用指令 好用刷子 圆球刷 Brush Sphere br sp 地板刷子 Brush Cyl br cyl 树木刷子 tree 服务端 客户端 运行配置 服务端 Spigot 1 14 4 插件版本 W
  • word页面上方有横线选不中删不掉

    依次点击 设计 页面边框 选择无
  • 批处理文件命名(简单有效且粗暴!)

    批处理文件命名 简单有效且粗暴 方法 方法一 方法二 方法 网上的方法层出不穷 但是真正有效的几乎没有 本文罗列外加自己领悟 给出了两个真实且有效的方法 方法一 直接下载粗暴且有效的工具 Totao commander 这是官网的简介 To
  • Apache -poi

    Busy Developers Guide to Features Want to use HSSF and XSSF read and write spreadsheets in a hurry This guide is for you
  • 添加了@LoadBalanced注解,即可实现负载均衡功能,这是什么原理呢?

    SpringCloud01 认识微服务 任何架构都离不开服务的拆分 微服务的拆分和远程调用你会吗 Eureka学习 搭建eureka server 将user service注册到eureka server中 Ribbon负载均衡 上一节中