一、什么时Feign?

Feign是SpringCloud组件中一个轻量级RESTFul的HTTP客户端。

Feign内置了Ribbon实现客户端请求的负载均衡。但是Feign是不支持Spring MVC注解的,所以便有了OpenFeign,OpenFeign在Feign的基础上支持Spring MVC注解比如 @RequestMapping等。

OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理生成实现类,实现类做负载均衡并调用其他服务。

二、SpringBoot 集成 OpenFeign

2.1、依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>
  5. <dependency>
  6. <groupId>io.github.openfeign</groupId>
  7. <artifactId>feign-okhttp</artifactId>
  8. </dependency>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  12. </dependency>

2.2、编写接口FeignClient代码

  1. @FeignClient(value = "youlai-admin", fallback = UserFeignFallbackClient.class)
  2. public interface UserFeignClient {
  3. @GetMapping("/api/v1/users/username/{username}")
  4. Result<AuthUserDTO> getUserByUsername(@PathVariable String username);
  5. }

2.3、配置

  1. # Feign 配置
  2. feign:
  3. httpclient:
  4. enabled: true
  5. okhttp:
  6. enabled: false
  7. sentinel: # 开启feign对sentinel的支持
  8. enabled: false

2.4、启动Feign

  1. @EnableFeignClients

三、Feign 的使用技巧

3.1、Feign 配置熔断器

3.2、Feign 请求响应压缩配置

3.3、Feign 日志配置

3.4、Feign 配置负载均衡

3.5、Feign 配置 SSL 访问

3.6、Feign 自定义解码器

3.7、Feign 上传文件

四、Feign 的底层实现原理

image.png

4.1、Feign 注册流程解析

  • 在Spring 应用启动 执行refresh 方法时
  • 执行 BeanFactory 后置处理器 ConfigurationClassPostProcessor ,对 BeanDefinition 进行处理
  • BeanDefinition 注册器 FeignClientsRegistrar 对 有注解 @FeignClient 类 进行构造了一个BeanDefinitionBuilder对象,构建成一个BeanDefinitionHolder注册到Spring 中
  • BeanDefinitionHolder 中持有的 Bean 是 FeignClientFactoryBean
  • 在实例化 bean 时,会调用FeignClientFactoryBean.getObject() 方法,实例化 Feign 代理类(JDK 代理)注册到容器中
    • 在实例化的过程中会创建 Http请求客户端

4.2、Feign 执行过程

  • 执行对应的 FeignClient 客户端请求
  • 执行代理类处理方法 FeignInvocationHandler
  • 执行对应的方法 SynchronousMethodHandler
  • 对请求参数封装成 RequestTemplate
  • 执行对应的请求拦截器 RequestInterceptor
  • RequestTemplate 创建 实际请求的 Request
  • 执行请求返回响应

参考