一、Feign 的工作原理

Spring Cloud Feign 是一个声明式的 Web 服务客户端,它使得编写 Web 服务客户端变得非常容易。它是基于 Netflix Feign 开发的,是一个轻量级的 RESTful HTTP 客户端。

让我们来看一下 Feign 的工作原理:

  • 声明式 REST 客户端: Feign 提供了一种更简单的方法来定义和创建 REST 客户端。通过创建接口并用注解来配置请求,开发者可以非常容易地定义服务端点。


  • 集成 Ribbon 和 Hystrix: Feign 自然集成了 Ribbon(负载均衡器)和 Hystrix(断路器),这意味着在使用 Feign 时,您可以非常容易地实现服务的负载均衡和容错。


  • 注解支持: Feign 使用注解如 @FeignClient 来声明一个接口是一个 Feign 客户端,这个注解包含了服务的名称和配置信息。通过注解 @RequestMapping 或 @GetMapping 等,您可以定义请求的 URL、方法类型等。


  • 动态代理: 当您定义一个 Feign 客户端接口时,Feign 使用动态代理来生成实现。这个实现内部处理了 HTTP 请求的发送和结果的映射。


  • 请求和响应的处理: Feign 内部使用了 HttpClient 来发送 HTTP 请求,并且会自动处理请求和响应。您可以使用不同的编码器和解码器来处理请求和响应的数据格式。


  • 易于扩展: Feign 提供了多种插件,例如编码器、解码器、拦截器等,这些都可以用来自定义 Feign 的行为。


二、@FeignClient注解工作原理

@FeignClient 注解的工作原理是在运行时动态创建带注解接口的代理。该接口中的每个方法对应于对注释中指定的服务的 HTTP 请求。当调用该接口的方法时,Spring会拦截该调用并将其转换为HTTP请求,包括URL映射、请求和响应正文转换以及标头设置。然后,它将请求发送到目标服务,处理响应,并将其作为方法的返回值返回。

面试官:说说Spring Cloud Feign工作原理_Spring Cloud


三、@FeignClient源码解析

1. 获取客户端名称

源码中可以看到类FeignClientsRegistrar的方法registerFeignClients注册客户端

面试官:说说Spring Cloud Feign工作原理_Java_02

面试官:说说Spring Cloud Feign工作原理_后端_03

2. 获取configuration

接着就是将configuration中的配置类加载到BeanDefinitionRegistry中了

面试官:说说Spring Cloud Feign工作原理_Java_04

面试官:说说Spring Cloud Feign工作原理_Spring Cloud_05

3. 注册客户端

接着就是registerFeignClient 注册客户端了,首先会将注解属性添加到definition

面试官:说说Spring Cloud Feign工作原理_Spring Cloud_06

面试官:说说Spring Cloud Feign工作原理_Spring Cloud_07

最后Feign接口注册到了注册器中,名称为包名+接口名,Feign接口实际生成的Bean对象为FeignClientFactoryBean

面试官:说说Spring Cloud Feign工作原理_Java_08