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

本文探讨了Feign在首次调用时速度较慢的原因,主要涉及Ribbon的负载均衡和初始化过程。通过分析Ribbon的LoadBalancer、ServerListUpdater和各种负载策略,揭示了由于服务列表的获取和客户端创建导致的延迟。提出并解释了Ribbon-eager-load(饥饿加载)模式,即在项目启动时预先加载服务,以避免首次调用的延迟问题,提高了服务间调用的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

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

 

Ribbon是如何进行负载的

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

图片

RibbonClientConfiguration

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

### Feign底层原理解析 Feign 是一个声明式的 Web 服务客户端,主要用于简化 HTTP API 的调用过程。它通过定义接口的方式描述服务间通信的细节,从而减少手动构建 HTTP 请求的工作量。 #### 声明式接口的核心机制 Feign 使用 Java 接口来描述服务之间的交互协议[^2]。这些接口通常包含方法签名以及相关的注解(如 `@RequestLine` 或 Spring Cloud 提供的 `@GetMapping`),用于指定 URL 路径、请求方法和参数绑定等内容。在应用程序启动阶段,Feign 根据这些接口动态生成代理对象,并将其注入到依赖项中以便后续使用。 #### 动态代理与 MethodHandler 当开发调用了某个由 Feign 定义的服务端点时,实际上是在操作该接口的一个代理实现类实例。此过程中涉及的关键技术之一就是 **Java 反射** 和自定义的 **MethodHandler** 处理器[^3]: 1. **Dispatch 映射表**: 在初始化期间,Feign 将每个方法与其对应的处理逻辑关联起来形成 dispatch 表; 2. **Invoke 方法执行流程**: 当触发某次远程调用时,框架内部会依据当前被执行的方法名查找匹配的 MethodHandler 实例; 3. 构建并发出真正的 HTTP 请求前,还会经历一系列预处理步骤比如设置 headers, body 参数转换等等最终交给负载均衡组件决定具体连接哪个上游服务器节点完成整个数据交换周期。 #### 支持多种编组/反编组形式 除了基本的功能外,Fegin也提供了灵活的数据格式适配能力允许我们采用不同的方式进行消息体编码解码工作其中包括但不限于JSON/XML等形式的支持.[^4] ```java // Example of defining a Feign client with JSON serialization/deserialization. @FeignClient(name="example-service", url="http://localhost:8080") public interface ExampleService { @PostMapping("/data") ResponseData sendData(@RequestBody RequestData data); } ``` 以上代码片段展示了如何利用 Feign 创建针对 RESTful APIs 的轻量化访问入口同时自动完成了从 POJO 到 Json 字符串再回到另一个方向上的相互转变动作. ### 总结 综上所述可以看出尽管表面上看去简单易懂但实际上背后隐藏着相当复杂精妙的设计理念和技术手段共同作用才成就了如今如此强大好用特性的开源工具库产品即Fiegn本身.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值