Feign 第一次调用为什么会很慢?
feign调用的大致过程?
Feign进行远程调用的,这里面包括,注册中心、负载均衡、FeignClient之间的关系,微服务通过不论是eureka、nacos也好注册到服务端,Feign是靠Ribbon做负载的,而Ribbon需要拿到注册中心的服务列表,将服务进行负载缓存到本地,然后FeignClient客户端在进行调用。
对应的流程图如下:
Ribbon是如何进行负载的,也就是如何获取nacos、eureka的服务列表,这个很关键。

这里的核心就是Ribbon的注册配置核心类的接口,也是靠LoadBalancer做负载的 无非就是ILoadBalancer接口的方法。
我们看下ILoadBalancer接口的方法。

以上的负载均偶默认的ZoneAwareLoadBalancer 通过继承父类DynamicServerListLoadBalancer的restOfInit方法,里面比较重要的两个方法,enableAndInitLearnNewServersFeature和updateListOfServers方法。
enableAndInitLearnNewServersFeature方法里面
LOGGER.info("Using serverListUpdater {}", serverListUpdater.getClass().getSimpleName());
serverListUpdater.start(updateAction);
ServerListUpdater.start方法的实现,通过自定义线程去拿,这就是获取服务列表;

什么是Ribbon负载均衡策略?
服务列表获取说了,当然负载均衡的策略这块也有必要讲一下,主要有七种;
A:RoundRobinRule(轮询策略,按照服务顺序依次循环调用)
B:WeightedResponseTimeRule(权重比策略,优先选择权重比高的服务,也就是服务响应时间比C:较短的,响应时间越长权重比越低)
D:RandomRule(随机策略,服务提供者列表随机选择一个服务)
E:BestAvailableRule(最小连接数策略,获取服务列表中连接数最小的服务实例)
F:RetryRule(重试策略,重试获取已经失效的服务,指定时间没有获取到返回NULL)
G:AvailabilityFilteringRule(可用性敏感策略,过滤非健康服务实例,选择lianji)
H:ZoneAvoidanceRule(区域敏感策略)
Ribbon-eager-load(饥饿加载)模式
Ribbon对于负载Client是在服务启动后,发生调用的时候才会去创建Client,所以在第一次发生http请求调用的时候,不光要算上http的请求时间,还要算上Client的创建时间,所以第一次调用的时候才会很慢,写个方法调用下;
@GetMapping("/requestSystem2Api")
public String requestSystem2Api(){long startTime = System.currentTimeMillis();R<String> stringR = iTestServiceClient.testRequestMethod();if (null !=stringR){log.info("接口返回:"+stringR.getMsg());}long needTime = System.currentTimeMillis() - startTime;log.info("接口调用需要的时间:"+needTime);return "";
}
从调用日志可以看出,第一次调用System2服务,Ribbon的DynamicServerListLoadBalancer会将feign客户端进行负载,然后进行调用,第一次调用的时间就是会长一些,第二次调用直接进行请求可以看到调用时间很快。

如何解决?
开启Ribbon饥饿加载

在项目启动的时候,可以从日志看到,已经把Lxlxxx-system2服务进行加载,从而避免了第一次请求超时的情况;

最后
其实这种饥饿加载模式,类似于“客户端负载预热”的一个操作,项目启动的时候进行加载,防止服务之间调用可以因为数据量、业务逻辑处理复杂性导致接口超时,如果你的服务之间调用业务处理比较复杂、且慢,不妨可以试试这种解决方式。
需要咨询更多的问题 欢迎识别下方二维码开启我们的故事吧。

相关文章:
Feign 第一次调用为什么会很慢?
feign调用的大致过程? Feign进行远程调用的,这里面包括,注册中心、负载均衡、FeignClient之间的关系,微服务通过不论是eureka、nacos也好注册到服务端,Feign是靠Ribbon做负载的,而Ribbon需要拿到注册中心的…...
Spring Framework-简介
Spring Framework Java Spring是一个开源的Java应用框架,它的主要目的是简化企业级应用开发的复杂性。Spring框架为开发者提供了许多基础功能,使得开发者能够更专注于业务逻辑的实现,而不是底层的细节。 主要特点和功能: 控制反…...
Linux——PHP8.0编译安装和yum安装
文章目录 Linux——PHP8.0编译安装和yum安装PHP8.0编译安装PHP8.0yum安装 Linux——PHP8.0编译安装和yum安装 PHP8.0编译安装 此内容参考于:https://www.cnblogs.com/jhno1/p/14237034.html 安装依赖 # 安装编译依赖 [rootcsq ~]# yum -y install ncurses ncurses…...
【通义千问系列】Qwen-Agent 从入门到精通【持续更新中……】
目录 前言一、快速开始1-1、介绍1-2、安装1-3、开发你自己的Agent 二、Qwen-Agent的使用和开发过程2-1、Agent2-1-1、Agent使用2-1-2、Agent开发 2-2、Tool2-2-1、工具使用2-2-2、工具开发 2-3、LLM2-3-1、LLM使用2-3-2、LLM开发 三、基于Qwen-Agent的案例分析3-1、3-2、 总结 …...
1081:分苹果
1081:分苹果 时间限制: 1000 ms 内存限制: 65536 KB 提交数:65448 通过数: 54401 【题目描述】 把一堆苹果分给n个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个&#x…...
Linux—-vim基础使用
1、基本概念 Vim的工作模式有四种,普通模式,输入模式,命令模式,可视模式。 在终端中打开vim,只需要输入vim 文件,在普通模式下按i就会进入到输入模式,按下:进入命令模式,输入:q就可…...
《ESP8266通信指南》12-Lua 固件烧录
往期 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信(Arduino开发)-CSDN博客 《ESP8266通信指南》9-TCP通信(Arudino开发)-CSDN博客 《ESP8266通信指南》8-连接WIFI(Arduino开发…...
Covalent Network(CQT)通过 “新曙光” 计划实现重要里程碑,增强以太坊时光机,提供 30% 的年化质押收益率
Covalent Network(CQT)作为集成超过 280 条区块链,并服务于超过 2.8 亿个钱包的领先结构化数据基础设施层,宣布了其战略计划 “新曙光” 中的一个重要进展。随着网络升级并完成了准备工作的 75%,这将为即将部署的以太坊…...
JVM8参数设置相关
1、堆内存设置 JVM堆内存的设置大小应根据应用程序的具体需求和系统环境来确定。以下是一些常见的考虑因素和建议: 应用程序需求:如果应用程序需要处理大量数据或运行多个线程,那么可能需要更大的堆内存。反之,如果应用程序的需…...
送别PI-DataLink,行列视(RCV)完美替代
行列视(RCV)和 OSI PI 实时数据库自带的 PI-DataLink 报表工具,属于以实时数 据库为主要数据源的报表产品。 PI-DataLink 是专门针对 PI 实时数据库系统开发的一套 Excel 报表插件,功能强大,借助 Excel 自身的强大报表…...
【EasySpider】EasySpider+mysql执行配置异常
问题 使用易采集工具操作时候,遇到一个执行异常,后来发现没有选择数据类型 Loading stealth.min.js MySQL config file path: ./mysql_config.json 成功连接到数据库。 Successfully connected to the database. Traceback (most recent call last):…...
大数据Scala教程从入门到精通第一篇:Scala基本介绍
一:Scala基本介绍 1:Scala相当于Java的增强版和拓展 Scala 基于 JVM和 Java 完全兼容。同样具有跨平台、可移植性好、方便的垃圾回收等特性 Scala 比 Java 更加面向对象,可以说完全面对对象。 Scala 是一门函数式编程语言,Java就…...
2-手工sql注入(进阶篇) sqlilabs靶场5-10题
1. 阅读,学习本章前,可以先去看看基础篇:1-手工sql注入(基础篇)-CSDN博客 2. 本章通过对sqlilabs靶场的实战,关于sqlilabs靶场的搭建:Linux搭建靶场-CSDN博客 3. 本章会使用到sqlmap,关于sqlmap的命令&…...
C++并发:线程函数传参(二)
正文 传参中的陷阱 1. 向std::thread 构造函数传参:所有参数(含第1个参数可调用对象)均按值并以副本的形式保存在 std::thread 对象中的tuple里。这一点的实现类似于std::bind。如果要达到按引用传参的效果,可使用std::ref来传递…...
正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-12-蜂鸣器
前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…...
H5 css动画效果
你可以使用 CSS 动画来实现这个效果。下面是一个简单的示例代码,展示了如何使用 CSS 中的关键帧动画来放大然后缩小一张图片,并使动画循环播放: html <!DOCTYPE html> <html lang"en"><head><meta charset&qu…...
创作纪念日(一周年)
机缘 我进入CSDN成为创作者是去年2023年的五月份,当时是在学校报名了蓝桥杯单片机组的比赛,觉得单片机方面有许多精妙之处,并且自学初学单片机实在有许多奇巧的设计点,有许多编程与硬件实际运行需要磨合的地方,这些惊…...
Oracle 数据库全面升级为 23ai
从 11g 到 12c 再到 19c,今天,我们迎来了 23ai ! “ Oracle AI Vector Search allows documents, images, and relational data that are stored in mission-critical databases to be easily searched based on their conceptual content Ge…...
Android WebView打开网址黑屏
1.先说解决方案: // 允许执行JavaScriptbinding.webView.getSettings().setJavaScriptEnabled(true);// 启用硬件加速binding.webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);// 允许混合内容。即使是通过HTTPS加载的页面也可以显示通过HTTP加载的资源。bin…...
软件测试之 接口测试 Postman使用
接口测试 URL HTTP协议 HTTP 请求部分 HTTP响应部分 Postman使用 界面介绍 这里 注意 如果你无法访问 那么 captchaImage这个打错了,给的资料中是错误的地址 https://kdtx-test.itheima.net/api/captchaImage登录接口 科大天下 第一个接口的登录设置 https://kd…...
AI原生应用领域链式思考的实践经验分享
AI原生应用领域链式思考的实践经验分享 关键词:链式思考(Chain of Thought)、AI原生应用、大语言模型、提示工程、智能推理 摘要:本文结合实际开发经验,深入解析“链式思考(CoT)”在AI原生应用中…...
Arduino ESP平台MQTT固件空中升级(FUOTA)轻量库
1. 项目概述mqtt_fuota_duino是一个面向资源受限嵌入式物联网终端的轻量级固件空中升级(Firmware Update Over-The-Air, FUOTA)库,专为 Arduino 生态设计,深度适配 ESP8266 和 ESP32 平台。其核心使命并非替代标准 HTTP/HTTPS OTA…...
如何用OpenPLC Editor实现工业级控制?3大场景实战指南
如何用OpenPLC Editor实现工业级控制?3大场景实战指南 【免费下载链接】OpenPLC_Editor 项目地址: https://gitcode.com/gh_mirrors/ope/OpenPLC_Editor 你是否曾遇到过工业控制编程的困境?传统PLC开发成本高昂、学习曲线陡峭、兼容性差…...
别再死磕Open SQL了!用ABAP CDS View在SAP S/4HANA里榨干数据库性能
别再死磕Open SQL了!用ABAP CDS View在SAP S/4HANA里榨干数据库性能 每次看到那些运行了20分钟还没出结果的报表程序,我就忍不住想问问开发者:2023年了,为什么还在用Open SQL写这种性能灾难?上周我接手了一个供应商账龄…...
深入解析EasyExcel自定义列样式:基于AbstractVerticalCellStyleStrategy的灵活实现
1. 为什么需要自定义列样式? 在实际开发中,我们经常遇到这样的需求:导出的Excel表格需要根据不同列的内容类型设置不同的样式。比如文字列需要居中显示,数字列需要右对齐,金额列可能需要特殊格式和颜色标注。这种需求在…...
终极指南:Heynote版本更新与数据迁移全攻略
终极指南:Heynote版本更新与数据迁移全攻略 【免费下载链接】heynote A dedicated scratchpad for developers 项目地址: https://gitcode.com/gh_mirrors/he/heynote Heynote作为开发者专用的即时记事本工具,定期更新能带来更稳定的性能和更丰富…...
团队知识协作平台:构建高效智能的文档管理系统
团队知识协作平台:构建高效智能的文档管理系统 【免费下载链接】outline Outline 是一个基于 React 和 Node.js 打造的快速、协作式团队知识库。它可以让团队方便地存储和管理知识信息。你可以直接使用其托管版本,也可以自己运行或参与开发。源项目地址&…...
Qt状态机实战指南:从基础到高级应用
1. Qt状态机基础入门 第一次接触Qt状态机时,我完全被它的设计哲学惊艳到了。想象一下你家的智能电饭煲:待机、煮饭、保温就是三个典型状态,按下按钮就是触发状态转换的信号——这就是状态机最接地气的理解方式。Qt中的QStateMachine框架&…...
OpenClaw移动端适配:手机飞书调用Qwen3-VL:30B的优化技巧
OpenClaw移动端适配:手机飞书调用Qwen3-VL:30B的优化技巧 1. 移动端适配的痛点与挑战 上周我在星图平台部署了Qwen3-VL:30B模型,并通过OpenClaw接入了飞书。当我在办公室用电脑测试时一切正常,但周末带孩子去公园时想用手机处理工作&#x…...
iOSDeviceSupport:一站式解决Xcode设备调试兼容性问题
iOSDeviceSupport:一站式解决Xcode设备调试兼容性问题 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport 当你的iOS设备连接Xcode却提示"Could not locate device…...
