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

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录

一、前言

二、源码分析

三、负载均衡策略


一、前言

如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可访问的网络地址吗?


 

我们在浏览器中访问一下这个地址,果然不可用。

那么它又是怎么访问到 userserver 数据的?别忘了我们的服务都是注册在 Eureka 上的,那肯定是拿着服务名去找 Eureka 要人了对不对?找到服务之后把具体的主机名替换掉就OK了。

实际上,我们可能有多个 userserver 同时注册在 Eureka 上,这时候 orderserver 要去 Eureka 上拉取服务的时候,拉取到的就不只是一个 userserver 服务了,它应该是一个服务列表,那么最终执行的时候肯定是只交给一个服务去做,到底要交给谁呢?没错,这就是我们本篇要说的 —— Ribbon,用它来实现多服务的负载均衡。

二、源码分析

上一篇文章中,提到了 @LoadBalanced 注解,我们说用它可以开启负载均衡。这个注解其实就是一个标记,标记 RestTemplate 发起的请求要被 Ribbon 拦截并处理。

那个这个拦截动作具体是谁来做的呢?Ctrl + Shift + N,搜索 LoadBalancerInterceptor,点击第一个。

我们可以打断点 debug,可以看到 request.getURI() 这一步是在获取请求路径,也就是我们上面说的那个不可用的 url。

F8 快捷键下一步,originalUri.getHost() 应该就是在获取主机名,获取到的 host 正是 userserver。

拿到了主机名,就该去找 Eureka 拉取服务了,继续往下走,发现它把该服务名称交给了 loadBalancer.execute 去执行,F7 跟进该方法。

服务列表拿到之后就准备负载均衡了,F7 进入方法内部,我们发现它调用了 chooseServer 方法,翻译一下:选择服务。从刚才拉取到的服务列表中选择一个出来?

继续 F7 进入 chooseServer 方法,可以看到它又去调用父类的 chooseServer 方法了。

跟进方法往下走,返回一个 rule.choose?翻译一下:选择规则。说明我们从服务列表中选择一个服务的时候也是有规则的。

光标放到 rule 上,Ctrl 加鼠标左键跟进,它原来是一个 IRule 类型的。

 

那么这个 IRule 接口有哪些具体的 Rule 呢?光标放在 IRule 上,Ctrl + H,弹出它的实现类。翻译一下:有随机规则、轮询规则等等。

拿到了真实的访问地址,并且选择了一种负载均衡策略,就可以对之前不可访问的 url 进行替换了。

整体流程:

orderserver 发起 http 请求 → 请求被 LoadBalancerInterceptor 负载均衡拦截器拦截 → RibbonLoadBalancerClient 拿到服务名,并将其作为参数传给 DynamicServerListLoadBalancer → DynamicServerListLoadBalancer 就会去 Eureka 中拉取服务列表 → 随后 DynamicServerListLoadBalancer 又会去请求 IRule 接口做负载均衡,根据规则挑一个服务出来,并返回 → RibbonLoadBalancerClient 拿到了真实的服务地址就会对之前不可访问的 url 地址进行替换,最终请求到目标服务。

三、负载均衡策略

如下图,每一个子接口都是一种规则:

默认是的负载均衡策略是 ZoneAvoidanceRule,它父类的父类是轮询的,所以本质上讲 ZoneAvoidanceRule 也是一个轮询策略,但是它是以 Zone 对服务器进行划分的,这个 Zone 可以理解为一个机房,所以在选择服务的时候,它会优先选择跟自己在同一个机房里面的服务,然后进行轮询。

那么如何修改负载均衡规则呢?有两种方式。

① 代码方式,在 orderserver 的启动类中定义一个新的 IRule(作用于全局)

@Bean
public IRule randomRule() {return new RandomRule();
}

② 配置文件方式,在 orderserver 的 yml 文件中添加新的配置(只针对某个微服务而言)

Ribbon 的默认加载机制是懒加载,所谓懒加载就是不用的时候不加载,什么时候要用了才去加载,所以服务在第一次被访问的时候速度较慢,由于 Ribbon 给我们提供了缓存,所以之后的访问速度还是很快的。

相对于懒加载的是饥饿加载,顾名思义,饥饿加载就是在项目一启动的时候就开始加载,所以它的每一次访问速度都很快。那么如何修改 Ribbon 的加载方式呢?我们可以通过配置文件的方式进行修改。

相关文章:

基于 Eureka 的 Ribbon 负载均衡实现原理【SpringCloud 源码分析】

目录 一、前言 二、源码分析 三、负载均衡策略 一、前言 如下图,我们在 orderserver 中通过 restTemplate 向 usersever 发起 http 请求,在服务拉取的时候,主机名 localhost 是用服务名 userserver 代替的,那么该 url 是一个可…...

如何用CHAT解释文章含义?

问CHAT:解释“ 本身乐善好施,令名远近共钦,待等二十左右,定有高亲可攀;而且四德俱备,帮夫之缘亦有。主持家事不紊,上下亦无闲言。但四十交进,家内谨防口舌,须安家堂&…...

创作4周年

🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言机…...

《opencv实用探索·一》QT+opencv实现图片拼接和Mat转QImage

本文利用opencv实现了几个好用的功能,包含两个文件,如下: 源码放在文章末尾 imageProcessing类包含三个功能: 1、图像拼接 cv::Mat imageMosaic(cv::Mat mat1, cv::Mat mat2, MosaicMode mosaicMode);mat1和mat2为两个待拼接的…...

Apahce虚拟主机配置演示

在企业的真实环境中,一台WEB服务器发布单个网站会非常浪费资源,所以一台WEB服务器一般都会发布多个网站,少则3-5个,多个10-20个网站。在一台服务器上发布多网站,也称之为部署多个虚拟主机。 WEB虚拟机主机配置方法主要…...

加班做报表被嘲低效!快用大数据分析工具

做数据分析报表很耗时间,因为不仅要解决多业务系统数据质量标准不一问题,还需要进行大量的公式计算、报表设计与制作。但那是以前,在大数据分析工具强势崛起的当下,这些工作都能交给大数据分析工具来做了。以前是花90%的时间做报表…...

详解——菱形继承及菱形虚拟继承

目录 一,菱形继承 1.1单继承 1.2多继承 1.3菱形继承 1.4菱形继承的问题 1.5虚拟继承解决数据冗余和二义性的原理 二.继承的总结和反思 一,菱形继承 C三大特性——继承-CSDN博客 1.1单继承 单继承:一个子类只有一个直接父类时称这个继…...

路由的控制与转发原理

场景1:路由器收到数据包后,会根据数据包的目标IP地址,计算出目标网段,再确定终端设备的具体位置。这个过程中,还需要计算出接口,或数据包下一跳的地址。最终会生成一条路由,即路径,存…...

ios qt开发要点

目前关于ios qt的开发资料比较少,这里整理了几个比较重要的开发要点,基于MacOS14 Xcode15 Qt5.15 cmake iphone真机。 cmake报错,报错信息如下 CMake Error at /Users/user/Qt/5.15.5/ios/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:91 (m…...

免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…...

ChatGPT最强?文心一言与ChatGPT对比

对于同一个问题我们分别对文心一言3.5和ChatGPT3.5输出回答,结果如下图,可以看到文心一言的回答更好,文心一言是由百度开发的人工智能语言模型,它的中文理解能力主要是基于百度强大的搜索引擎和自然语言处理技术。文心一言更加注重…...

算法通关村第十二关|青铜|字符串转换整数

1.转换成小写字母 原题:力扣709. 字符串大写转小写有现成的API使用,但是我们也可以自己来实现。 使用或运算进行加操作能提高效率,因为 32 对应的二进制表示为 00100000 ,而大写字母的范围 [65, 90] 的二进制表示在 00100000 的…...

CSS实现空心的“尖角”

大家好,我是南宫,来分享一个昨天解决的问题。 我记得之前刷面试题的时候,CSS面试题里面赫然有一题是“如何用CSS实现三角形”,我觉得这个问题确实很经典,我上的前端培训班当初就讲过。 大概思路如下: 先…...

算法 全排列的应用

#include <iostream> #include <string>using namespace std;// 交换字符串中两个字符的位置 void swap(char& a, char& b) {char temp a;a b;b temp; }void fun(string str) {string a str.substr(0,4); int aa;sscanf(a.c_str(), "%d",…...

环境配置|GitHub——如何在github上搭建自己写的网站

下面简单地总结了从本地的网页文件到在github服务器上展示出来即可以通过网络端打开的过程&#xff1a; &#xff08;以下可能会出现一些难点&#xff0c;照着做就可以了&#xff0c;由于笔者是小白&#xff0c;也不清楚具体原理是什么&#xff0c;希望有一天成为大神的时候能轻…...

Windows系统中curl和wget命令下载说明

前言 当需要在命令行中发送 HTTP 请求时&#xff0c;常用的工具有 curl 和 wget。它们可以帮助你下载文件&#xff0c;发送 POST 或 GET 请求&#xff0c;以及检查网页内容等。 curl: curl 是一个功能强大的命令行工具&#xff0c;支持多种协议&#xff08;例如 HTTP、HTTPS、…...

山西电力市场日前价格预测【2023-11-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-24&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为685.26元/MWh&#xff0c;预计出现在18:00。最低日前电价为296.84元/MWh&#xff0c;预计…...

说说你对 shell 的理解以及常见的命令?

面试官&#xff1a;说说你对 shell 的理解&#xff1f;常见的命令&#xff1f; 一、是什么 Shell 是一个由c语言编写的应用程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言 它连接了用户和Linux内核&#xff0c;让用户能…...

数据结构之双向带头循环链表函数功能实现与详细解析

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 1.前言 2.带头双…...

SpringBoot_websocket实战

SpringBoot_websocket实战 前言1.websocket入门1.1 websocket最小化配置1.1.1 后端配置1.1.2 前端配置 1.2 websocket使用sockjs1.2.1 后端配置1.2.2 前端配置 1.3 websocket使用stomp协议1.3.1 后端配置1.3.2 前端配置 2.websocket进阶2.1 websocket与stomp有什么区别2.2 webs…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...