SpringCloud --- Ribbon负载均衡

2023-11-03

一、负载均衡原理

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

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

 

 

二、源码跟踪

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

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

我们进行源码跟踪

 

2.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.2、LoadBalancerClient

继续跟入execute方法:

代码是这样的:

  • getLoadBalancer(serviceId):根据服务id获取ILoadBalancer,而ILoadBalancer会拿着服务id去eureka中获取服务列表并保存起来。

  • getServer(loadBalancer):利用内置的负载均衡算法,从服务列表中选择一个。本例中,可以看到获取了8082端口的服务

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

果然实现了负载均衡。

 

2.3、负载均衡策略IRule

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

我们继续跟入:

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

 

我们看看这个rule是谁:

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

 这就是轮询的意思。

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

 

2.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.1、负载均衡策略

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

不同规则的含义如下:

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

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

 

3.2、自定义负载均衡策略

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

  • 代码方式:在order-service中的OrderApplication类中,定义一个新的IRule:

@Bean
public IRule randomRule(){
    return new RandomRule();
}
  • 配置文件方式:在order-service的application.yml文件中,添加新的配置也可以修改规则

 

userservice: # 给某个微服务配置负载均衡规则,这里是userservice服务
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 负载均衡规则 

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

 

 

四、饥饿加载

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

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

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

SpringCloud --- Ribbon负载均衡 的相关文章

随机推荐

  • PCI配置空间简介

    转自 作为自己学习笔记PCI配置空间简介 腾讯云开发者社区 腾讯云 tencent com https cloud tencent com developer article 1199972 from 15425 一 PCI配置空间简介 P
  • Android : 读取assets目录下的json文件

    public class AssetsFileUtil 读取assets目录下的json文件 param context 上下文 param fileName 文件名称 return public static String getJson
  • 公司挖来一个阿里Java大神,生产环境故障调优很溜

    目录 线上系统是如何运行的 CPU 是如何并发运行多个线程的 线程太多会导致什么样的后果 经常听说的 CPU 使用率和负载到底是什么 如何通过 top 命令来查看 CPU 使用率和负载 今天给大家分享一个知识点 就是平时我们线上服务器部署的
  • HTTP请求中的传参方式form data、 request payload、query string parameters三者对比

    目录 一 GET请求 Query String Parameters 二 POST请求 2 1 FormData 2 2 Request Payload 补充 Post请求总结 HTTP请求中不同的请求方式和设置不同的Content Typ
  • Qt for Android:自定义安卓Application和Activity

    Demo 链接 https github com gongjianbo HelloQtAndroid git 1 前言 安卓的 Application 类相当于 Qt QApplication 维护应用程序全局状态 Application文
  • 马原刷题工具

    选择题库文件word后 就能开始刷题了 导入题库时会自动生成一个docx文件和json文件 想要重新导入就删除json文件 题库下载 点我下载 要安装的库 pywin32 python docx author Bre Athy contac
  • 代码随想录算法训练营第四十一天| 343. 整数拆分 96.不同的二叉搜索树

    今天两题都挺有难度 建议大家思考一下没思路 直接看题解 第一次做 硬想很难想出来 343 整数拆分 代码随想录 视频讲解 动态规划 本题关键在于理解递推公式 LeetCode 343 整数拆分 哔哩哔哩 bilibili public in
  • 详解Cocos2d-X中宏CC_DLL(转)

    在cocos2d x的源码中 经常可以看到宏CC DLL的使用 比如在类CCScene的定义中 class CC DLL CCScene public CCNode public CCScene virtual CCScene bool i
  • cass等距离等分线段的命令键_教你用CAD将线段等分,弧线也可定距等分!

    定距等分的命令是 MEASURE 快捷键是 me 定数等分的命令是 DIVIDE 快捷键是 div 注意了 命令不分大小写 如下图 是一根长为300mm 的线段 弧线也可以哦 选择 格式 点样式 如下图 先选择好点样式的图标 记得有个图标大
  • 操作系统多线程实现_操作系统中的线程实现

    操作系统多线程实现 Each process has an address space There is one thread of control in every traditional OS Sometimes it is viabl
  • Centos7 使用 chronyd 进行时钟同步

    背景 最近要做阿里云迁移 IDC 机房 整理下 Linux 运维基线 简单记录 以备后用 安装 默认已经安装 yum install y chrony 配置文件 cat etc chrony conf Use public servers
  • 如何看待职场的越级汇报问题

    越级汇报这个词 大家或许听过 在一些公司 甚至明令禁止越级汇报 这个词很容易跟打小报告等等牵扯在一起 越级汇报单纯从利弊来说 可能弊大于利 下属隔着自己直属领导向上越级反馈问题 说明对现有领导的不信任 这里面会体现出很多问题 作为管理需要花
  • 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    原文链接 http www jianshu com p 3667157d63bb 1 故障现象 客服同事反馈平台系统运行缓慢 网页卡顿严重 多次重启系统后问题依然存在 使用top命令查看服务器情况 发现CPU占用率过高 2 CPU占用过高问
  • 小程序压缩图片尺寸

    有api是压缩质量的 wx compressImage src originPath 图片路径 quality 90 压缩质量 success function res res tempFilePath 结果路径 压缩尺寸没有api 需要自
  • mysql的JDBC架包下载及简单测试连接

    一 下载JDBC连接所需要的jar包 选择Communityhttps www mysql com downloads 二 导入jar包 1 解压下载的安装包 2 eclispe项目导入jar包 方式一 Build Path gt Conf
  • 在Word中调整图片大小会自动改变怎么办?

    在Word中调整图片大小会自动改变怎么办 在Word中有多个图片 需要调整到大小一致 可是拉动 或者设置图片大小后 图片会自动改变 始终无法将所有图片调到大小一致 别担心 鼠标右键点击图片 选择大小和位置 取消勾选 锁定纵横比 相对原始图片
  • 最新版mysql-8.0.32-winx64安装及配置

    目录 一 下载 二 配置初始化文件my ini 请注意 这里的配置是什么含义呢 三 安装mysql 四 配置环境变量 编辑 五 cmd命令提示符 常用指令 总结 一 下载 Mysql官网下载https www mysql com cn do
  • JavaScript的闭包机制

    JavaScript的闭包是指函数可以访问其外部作用域中的变量 即使函数在外部作用域之外被调用 这是因为函数在创建时会创建一个闭包 它包含了函数的代码和函数创建时所处的作用域 当函数被调用时 它可以访问闭包中的变量 即使这些变量在函数被调用
  • 阈值分割

    C 阈值分割 1 阈值分割 5种类型的阈值分割如下 第一种 阈值二值化 蓝色线表示阈值 原理 像素值大于阈值时 为最大值 小于阈值则为0 第二种 阈值反二值化 原理 像素值大于阈值时 为0 否则为设定的最大值 第三种 截断 原理 像素值大于
  • SpringCloud --- Ribbon负载均衡

    一 负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件 来实现负载均衡功能的 那么我们发出的请求明明是http userservice user 1 怎么变成了http localhost 8081的呢 二 源码