一、什么时Feign?
Feign是SpringCloud组件中一个轻量级RESTFul的HTTP客户端。
Feign内置了Ribbon实现客户端请求的负载均衡。但是Feign是不支持Spring MVC注解的,所以便有了OpenFeign,OpenFeign在Feign的基础上支持Spring MVC注解比如 @RequestMapping等。
OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,通过动态代理生成实现类,实现类做负载均衡并调用其他服务。
二、SpringBoot 集成 OpenFeign
2.1、依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
2.2、编写接口FeignClient代码
@FeignClient(value = "youlai-admin", fallback = UserFeignFallbackClient.class)
public interface UserFeignClient {
@GetMapping("/api/v1/users/username/{username}")
Result<AuthUserDTO> getUserByUsername(@PathVariable String username);
}
2.3、配置
# Feign 配置
feign:
httpclient:
enabled: true
okhttp:
enabled: false
sentinel: # 开启feign对sentinel的支持
enabled: false
2.4、启动Feign
@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 的底层实现原理
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
- 执行请求返回响应