Skip to content
Go back

Feign 是如何工作的?它的核心注解有哪些?

Published:  at  02:47 AM

一、 Feign 是如何工作的?(工作原理)

Feign 的核心是**“声明式调用”,它的工作流程可以概括为:“扫描注册 -> 动态代理 -> 请求封装 -> 负载均衡 -> 发起调用”**。

具体流程如下:

  1. 开启与扫描(启动阶段)
    • 在 Spring Boot 启动类上添加 @EnableFeignClients 注解,开启 Feign 功能。
    • Spring 启动时,会根据该注解指定的包路径,扫描所有被 @FeignClient 修饰的接口。
  2. 注册 Bean 定义(BeanDefinition)
    • 扫描到接口后,Spring 会将这些接口注册为 BeanDefinition,并设置其 FactoryBean 为 FeignClientFactoryBean。
  3. 生成动态代理(运行时)
    • 当通过 @Autowired 注入该接口时,FeignClientFactoryBean 会利用 JDK 动态代理 为接口生成一个代理对象。
    • 当你调用接口中的方法时,实际上调用的是 ReflectiveFeign.FeignInvocationHandler。
  4. 解析与封装请求(核心机制)
    • 代理对象根据接口方法上的 Spring MVC 注解(如 @GetMapping、@PathVariable 等),通过 Contract 解析器解析出 HTTP 请求的元数据(URL、请求方法、请求头、参数等)。
    • 利用 Encoder 将参数编码,最终生成一个 RequestTemplate 对象。
  5. 负载均衡与发起请求
    • 如果配置了服务名(name 属性),Feign 会将请求交给负载均衡器(如 Spring Cloud LoadBalancer 或 Ribbon)。
    • 负载均衡器从服务注册中心(如 Nacos、Eureka)获取实例列表,通过算法选出一个具体的 IP 和端口。
    • 将 RequestTemplate 替换为真实的 URL,交给底层的 HTTP 客户端(如 HttpURLConnection、Apache HttpClient 或 OkHttp)发起真实的 HTTP 请求。
  6. 结果解码(Decoder)
    • 获取到 HTTP 响应后,通过 Decoder 将响应体(通常是 JSON)反序列化为接口方法的返回值类型(Java 对象)。

二、 Feign 的核心注解有哪些?

在 Spring Cloud OpenFeign 中,核心注解分为Feign 原生注解和Spring MVC 注解(OpenFeign 扩展支持)。

1. 核心全局与类级别注解

2. 方法级别注解(Spring MVC 扩展)

由于 OpenFeign 整合了 Spring MVC,所以可以直接使用:

3. 参数级别注解(Spring MVC 扩展)

4. Feign 原生注解(了解即可,Spring Cloud 环境下不常用)

如果不想用 Spring MVC 注解,可以使用 Feign 原生的注解体系:

总结

核心底层组件:Contract(契约解析器)。它决定了 Feign 能够识别什么样的注解。在 Spring Cloud 环境下,默认使用的是 SpringMvcContract,这就是为什么我们可以直接使用 Spring MVC 注解的原因。

Feign 默认整合了负载均衡(早期是 Ribbon,现在是 Spring Cloud LoadBalancer),这使得它不仅仅是一个 HTTP 客户端,更是微服务调用的利器。


Suggest Changes

Previous Post
如何在 Feign 客户端中配置超时时间和重试机制?
Next Post
Ribbon 如何实现客户端负载均衡