面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

这篇具有很好参考价值的文章主要介绍了面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:Lxlxxx
链接:https://juejin.cn/post/7249624466150408250

前言

首先要了解Feign是如何进行远程调用的,这里面包括,注册中心、负载均衡、FeignClient之间的关系,微服务通过不论是eureka、nacos也好注册到服务端,Feign是靠Ribbon做负载的,而Ribbon需要拿到注册中心的服务列表,将服务进行负载缓存到本地,然后FeignClient客户端在进行调用,大概就是这么一个过程。

Ribbon是如何进行负载的

首先我们要清楚Ribbon是如何进行负载的,也就是如何获取nacos、eureka的服务列表,这个很关键。

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

RibbonClientConfiguration

RibbonClientConfiguration类中通过LoadBalancer,我们知道ribbon是靠LoadBalancer做负载的 无非就是ILoadBalancer接口的方法,依次是添加新的服务、在负载均衡里选择一个服务、markServerDown服务下线、获取服务列表、获取存活的服务器、获取所有服务器(包括健康和不健康的)

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

ZoneAwareLoadBalancer

loadBalancer默认的是ZoneAwareLoadBalancer负载均衡器,通过继承父类DynamicServerListLoadBalancer的restOfInit方法,里面比较重要的两个方法,enableAndInitLearnNewServersFeature和updateListOfServers方法

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

enableAndInitLearnNewServersFeature方法里面

LOGGER.info("Using serverListUpdater {}", serverListUpdater.getClass().getSimpleName());
serverListUpdater.start(updateAction);

让我们看ServerListUpdater.start方法的实现,通过自定义线程去拿,这就是获取服务列表;

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

Ribbon负载均衡策略

服务列表获取说了,当然负载均衡的策略这块也有必要讲一下,主要有七种;

  • RoundRobinRule(轮询策略,按照服务顺序依次循环调用)
  • WeightedResponseTimeRule(权重比策略,优先选择权重比高的服务,也就是服务响应时间比较短的,响应时间越长权重比越低)
  • RandomRule(随机策略,服务提供者列表随机选择一个服务)
  • BestAvailableRule(最小连接数策略,获取服务列表中连接数最小的服务实例)
  • RetryRule(重试策略,重试获取已经失效的服务,指定时间没有获取到返回NULL)
  • AvailabilityFilteringRule(可用性敏感策略,过滤非健康服务实例,选择lianji)
  • ZoneAvoidanceRule(区域敏感策略)

Ribbon-eager-load(饥饿加载)模式

Ribbon对于负载Client是在服务启动后,发生调用的时候才会去创建Client,所以在第一次发生http请求调用的时候,不光要算上http的请求时间,还要算上Client的创建时间,所以第一次调用的时候才会很慢,写个方法调用下;

System 服务调用System2服务

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客户端进行负载,然后进行调用,第一次调用的时间就是会长一些,第二次调用直接进行请求可以看到调用时间很快。

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

开启Ribbon饥饿加载

ribbon:
    nacos:
      enabled: true # 开启naocos轮询
    eager-load:
     enabled: true  # 开启Ribbon的饥饿加载模式(防止第一次请求超时的问题)
     clients: Lxlxxx-system2 # 指定需要开启的服务(需要开启Ribbon的饥饿加载模式)
     ReadTimeout: 10000
     ConnectTimeout: 10000
     MaxAutoRetries: 0
     MaxAutoRetriesNextServer: 1
     OkToRetryOnAllOperations: false

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

面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!

总结

其实这种饥饿加载模式,类似于“客户端负载预热”的一个操作,项目启动的时候进行加载,防止服务之间调用可以因为数据量、业务逻辑处理复杂性导致接口超时,如果你的服务之间调用业务处理比较复杂、且慢,不妨可以试试这种解决方式。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-663579.html

到了这里,关于面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第一次PR经历

         

    2024年02月13日
    浏览(30)
  • shell第一次作业

    1、判断当前磁盘剩余空间是否有20G,如果小于20G,则将报警邮件发送给管理员,每天检查次磁盘剩余空间。 2、判断web服务是否运行    1、查看进程的方式判断该程序是否运行,    2、通过查看端口的方式判断该程序是否运行,如果没有运行,则启动该服务并配置防火墙规

    2024年02月09日
    浏览(37)
  • 第一次博客作业

    这学期才开始接触Java,之前只学了C语言,所以一开始写题目的代码的时候对Java的众多函数和语法不是太熟悉,一开始就上手写代码有点不适应。 ​  关于类: 1、类似C中的struct,构造函数、内置方法(函数 )都比较相似 2、尽量避免代码的重复,把private和public的方法搞清晰。

    2024年02月08日
    浏览(44)
  • 新学期第一次课

    在信息化飞速发展的今天,大数据技术的应用日益广泛,其重要性也日益凸显。对于大数据学院的同学来说,掌握行业前沿技术是至关重要的。本篇文章将详细指导同学们如何加入QQ群、云班课,并学会使用思维导图和CSDN博客。 我们有两个QQ群,分别是2021计应1班行业前沿技

    2024年02月10日
    浏览(28)
  • jQuery第一次接触

    jQuery是一个轻量级js库 1.下载jquery库,网址Download jQuery | jQuery npm i jquery 2.还可以从cdn中载入jquery script src=\\\"https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js\\\" 3.j代表js,query代表查询,jQuery可以进行查询的js语言,主要用来查询html元素 4.基础语法$(selector).action(),其中selector代表要进行操

    2024年02月12日
    浏览(31)
  • 第一次作业

    作业内容:1,atd和crond的区别                   2,指定在2023/08/26 09:00将时间写入testmail.txt文件中                   3,指定在每天凌晨4:00将该时间点之前的系统日志信息备份到个目录下(/var/log/messages ),备份后日志文件名显示格式logfileYY-MM-DD HH-MM 1、运行方式不同

    2023年04月20日
    浏览(34)
  • docker第一次作业

    docker第一次作业 1.安装docker服务,配置镜像加速器  yum install -y yum-utils device-mapper-persistent-data lvm2 y um-config-manager --add-repo https: //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i \\\'s+download.docker.com+mirrors.aliyun.com/docker-ce+\\\'  /etc/yum.repos.d/docker-ce.repo yum makecache fast yum -y install docke

    2024年02月12日
    浏览(33)
  • 第一次样式异常之后正常

       解决方法 : 添加一个 :key=\\\"Math.random()\\\"  

    2023年04月15日
    浏览(17)
  • 电脑第一次使用屏幕键盘

    操作流程 1.在键盘上同时按Win+R打开运行; 2.输入 control 3.找到设置中心 4.点击屏幕键盘 效果 具体怎么使用 我不咋清除 简单 测试了一下 可以用鼠标点击屏幕键盘的按键 用键盘 按字母键和数字键 是和屏幕键盘不同步的 其他 tab、shift、后退、enter好像同步

    2024年02月14日
    浏览(46)
  • oop第一次博客作业

    前言 这学期刚刚接触面向对象程序设计,使用的是java语言。在此之前只接触过c语言。以我目前的学习进程来看二者的差别更多体现在面向对象的其中一个基本特性上,即封装性。在c语言中几乎所有内容都是公开的,java可以有效得规避这点。 学习的知识点 1.知道了类间关系

    2024年04月22日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包