这是我参与更文挑战的第5天,活动详情查看: 更文挑战
总文档 :文章目录
Github : github.com/black-ant
一 . 前言
文章目的 :
- Feign 主要流程源码分析
- Feign 的要点分析
- Feign 的设计思路及扩散思考
二 . 源码梳理
以一个最基础的 OpenFeign 的案例为例 , 我们在使用时通常会有如下操作 :
1 | java复制代码// Step 1: 开启 Feign 客户端 |
光看这三个步骤 , 大概可以得出几个问题 :
- EnableFeignClients 的作用 ?
- @FeignClient 的扫描
2.1 通过 @EnableFeignClients 开启 FeignClients
主要的配置集中在 FeignClientsRegistrar 中 , 主要包括以下内容 :
首先看一下 FeignClientsRegistrar 的调用流程:
- Step 1 : Bean 加载时调用 registerBeanDefinitions 完成 BeanDefinition 的注册
- Step 2 : registerDefaultConfiguration 注册 config
- Step 3 : 扫描 FeignClient , 并且进行注册
- Step 4 : 注册扫描的所有的 FeignClient
Step 1 : Bean 加载时调用 registerBeanDefinitions 完成 BeanDefinition 的注册
1 | java复制代码public void registerBeanDefinitions(AnnotationMetadata metadata, |
Step 2 : registerDefaultConfiguration 注册 config
1 | java复制代码// 1. 获取注解上面的属性 -> PS:001 |
PS:001 defaultAttrs 参数
Step 3 : 扫描 FeignClient
整体大纲就是 :
- 从 EnableFeignClients 获取属性 attrs
- 通过属性 attrs 获取 基础扫描路径 basePackages
- 扫描 basePackages 下面的所有标注 @Component 的类
- 获取其中的 @FeignClient
- 对注解标注的类进行 registry
1 | java复制代码// 注解类的使用主要是 FeignClientsRegistrar |
以上是主流程 ,但是我们还是可以看一下其中的一点小细节:
1 | java复制代码// PS : 其中省略了部分代码 , 想看完整版的可以看源码 |
Step 3 : 扫描 FeignClient
1 | java复制代码 |
PS : 这个对象在创建Bean过程中会被调用 ,我们后面再说!!!
2.2 FeignAutoConfiguration 的配置
Feign 其实是支持 OKHttp 方式调用的 ,该方法在 FeignAutoConfiguration 中进行配置 , 该配置类中提供了2个连接框架 : HttpClientFeignConfiguration / OkHttpFeignConfiguration
1 | java复制代码// HttpClientFeignConfiguration 的配置项 |
那么问题来了 : 如何切换到 OKHttp 呢?
PS : 网上有一种方法 ,通过配置 okhttp3.OkHttpClient 的方法 , 但是经过个人测试 , 可能由于版本不同会出现问题
1 | java复制代码// 如果细看源码 , 会发现存在2个 OkHttpFeignConfiguration |
总结
Feign 的配置篇基本上就说完了 , 后面会说明一个 FeignBean 的创建和一个 Invoke 流程
附录
PS:0003 attributes 中包含哪些属性?
1 | java复制代码C- FeignClient |
常见的 FeignClient 配置
1 | java复制代码// 覆盖默认配置 |
Application 配置篇
1 | java复制代码feign: |
本文转载自: 掘金