Redian新闻
>
面试官:Feign第一次调用为什么会很慢?

面试官:Feign第一次调用为什么会很慢?

公众号新闻
来源:juejin.cn/post/7249624466150408250
  • 前言
  • Ribbon是如何进行负载的
  • RibbonClientConfiguration
  • ZoneAwareLoadBalancer
  • Ribbon负载均衡策略
  • Ribbon-eager-load(饥饿加载)模式
  • 开启Ribbon饥饿加载
  • 总结

前言

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

基于 Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus 实现的前后端分离博客,包含后台管理系统,支持文章、分类、标签管理、仪表盘等功能。

  • GitHub 地址:https://github.com/weiwosuoai/WeBlog
  • Gitee 地址:https://gitee.com/AllenJiang/WeBlog

Ribbon是如何进行负载的

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

Ribbon是如何进行负载的

RibbonClientConfiguration

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

ILoadBalancer 接口

ZoneAwareLoadBalancer

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

restOfInit 方法

enableAndInitLearnNewServersFeature 方法里面。

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

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

ServerListUpdater.start

Ribbon负载均衡策略

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

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

关于自定义负载均衡策略,不属于本文范畴。如感兴趣,参考:https://t.zsxq.com/0fPeLWdXo

基于 Spring Boot + MyBatis Plus + Vue 3.2 + Vite + Element Plus 实现的前后端分离博客,包含后台管理系统,支持文章、分类、标签管理、仪表盘等功能。

  • GitHub 地址:https://github.com/weiwosuoai/WeBlog
  • Gitee 地址:https://gitee.com/AllenJiang/WeBlog

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

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

System 服务调用 System2 服务

@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饥饿加载

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 服务进行加载,从而避免了第一次请求超时的情况。

开启Ribbon饥饿加载

总结

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

·················END·················

资料链接


清华学姐自学的Linux笔记,天花板级别!
新版鸟哥Linux私房菜资料
阿里大佬总结的《图解Java》火了,完整版PDF开放下载!
Alibaba官方上线!SpringBoot+SpringCloud全彩指南
国内最强的SpringBoot+Vue全栈项目天花板,不接受反驳!

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
面试官:如何设计出健壮的秒杀系统?Citadel面试官曝光的100+对冲基金面试题,留学生请低调领取!对线面试官:synchronized 到底能不能禁止指令重排序?DragGAN第一作者Xingang Pan,正式加入南洋理工,出任助理教授!摊牌了!五大行面试官:今年不精通Excel的留学生,通通不要!女面试官:我肚子疼,你能帮我接热水吗?男子这句话一出,当场被录用!GDB 调试器如何通过调用帧信息来确定函数调用关系 | Linux 中国面试官:如何使用Dockerfile去构建自定义的Docker镜像?问倒一堆面试官:Redis 缓存满了怎么办?简化本地Feign调用,老手教你这么玩面试官:只会接需求画原型的B端产品经理,在我这里一面都过不了!面试官:post为什么会发送两次请求?面试官:业务开发时,接口不能对外暴露怎么办?我有 3 种实现方案!维立克前面试官讲座:如何取得“顶级美高敲门砖”维立克面试高分?【7.1】面试官:“你为什么要做这个APP?”我沉默了......早报 | 分析称李宁短期内可能面临销售不利因素;恒隆出售香港一商业中心;Champion第二季度营收大跌16%面试官:如何使用 Dockerfile 去构建自定义的 Docker 镜像?问倒一大片。。。高善文最新分享:二次探底的底部不会很深,时间也不会很长,出现危机的概率小黑白双煞!!!!人体特异功能热搜爆炸!UBS面试官:这几类留学生恐无秋招资格Any Questions for Me?如何向面试官提问可以让面试加分衰老的天敌你的Spring Boot应用启动很慢?不妨试试这个神器!【小居科普】百忧解之波士顿租房为什么会有中介费?租房为什么会没有中介费?面试官:什么是 TCP 长连接、短连接?问倒一大片。。。面试官:消息队列中如何保证消息的顺序性?维立克前面试官告诉你--如何取得“顶级美高预面试”维立克面试高分?早报 | lululemon第一季度中国收入大涨79%;LV老板或于本月到访中国市场;维密中国第一季度扭亏为盈历史小说《黄裳元吉》第九十四章 清源談談「書法」(現代詩)SpringCloud 远程调用为啥要采用HTTP,而不是RPC?MBB面试官:抱歉,这类留学生我们不收!面试官:Feign 第一次调用为什么会很慢?大部分人都答不上来!GPT-4调用插件40次都没成功,果断放弃,无效调用、拒绝回答时有发生
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。