引言
工作日常使用到了feign,几年前曾看过源码,由于当时没有阅读过spring ioc等部分的源码,对于feign这部分理解很多地方都不太清楚。在此五一期间,再阅读一遍,此系列为记录阅读过程,仅仅提供阅读思路,如果错误理解,请及时指出。
目标
- 搞明白Feign实现原理
- 找到其设置的扩展点,用于将来进行扩展
RPC (Remote Procedure Call )
RPC 全称是 Remote Procedure Call ,即远程过程调用,其对应的是我们的本地调用。RPC 的目的是:让我们调用远程方法像调用本地方法一样。依稀记得很多年前还学习过 Java RMI(Java Remote Method Invocation), 随着Java Web以及微服务的兴起,已经销声匿迹,作为远程调用宠儿。Dubbo与Feign是比较常见的RPC技术,话不多说,今天先简单介绍Feign的基本知识,开始Feign源码的阅读之旅。
什么是Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。
Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便。
SpringCloud中如何使用Feign
通过以下4步就可以实现Feign的调用实现,实际在使用过程中可能会遇到各种其他的情况,大部分开发人员对Feign的认识也止步于此,还有一部分开发人员凭借经验来解决问题(曾经的自己)。
- 引入依赖
<!-- openfeign 远程调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 启动类启用Feign
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class AuthApplication {
public static void main(String[] args) {
SpringApplication.run(AuthApplication.class, args);
}
}
- 书写FeignClient接口
@FeignClient(value = "test-center", fallback = SecurityFeignFallback.class)
public interface TestFeign {
@RequestMapping(value = "/jwt/test", method = RequestMethod.POST)
ResponseResult<String> test(@RequestBody SystemInfo systemInfo);
}
- 注入调用
@Autowired
private TestFeign testFeign;
public String test() {
SystemInfo systemInfo = new SystemInfo();
testFeign.test(systemInfo);
return "ok";
}
Feign设计架构
以下是Feign整体的设计架构,可以看出主要采用的有动态代理技术以及加解码
为什么要阅读源码
- 求知欲,开发人员基本素养。
- 熟悉非直接研发代码,了解整个调用链路,方便问题的排查与开发的扩展,丰富解决方案,拓展思路。
- 向开源代码学习,在日常研发时,规范或者优雅的进行研发,这里并非只有代码,注释等同样值得学习。
问题
在阅读源码之前先提出几个很容易遇到的问题,可以想一下答案:
- FeignClient已经声明,引入时为何报错,无法注入
- 如何加入Request Header
- 如何实现上传文件(单个或者多个文件)
- 如何将默认的Jackson替换为Fastjson
简单提出以上4个问题,如果有可以补充的留言区哦。以上是源码解析第一章,接下来将进入正题环节。
展望
- Feign代码入口寻找(Feign源码解析(一))