美文网首页
Feign源码解析(一)

Feign源码解析(一)

作者: 依然范特希 | 来源:发表于2023-04-30 15:16 被阅读0次

    引言

      工作日常使用到了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源码的阅读之旅。


    RPC框架设计.png

    什么是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的认识也止步于此,还有一部分开发人员凭借经验来解决问题(曾经的自己)。

    1. 引入依赖
     <!-- openfeign 远程调用 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
    
    1. 启动类启用Feign
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class AuthApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(AuthApplication.class, args);
        }
    }
    
    1. 书写FeignClient接口
    @FeignClient(value = "test-center", fallback = SecurityFeignFallback.class)
    public interface TestFeign {
    
        @RequestMapping(value = "/jwt/test", method = RequestMethod.POST)
        ResponseResult<String> test(@RequestBody SystemInfo systemInfo);
    }
    
    1. 注入调用
    @Autowired
    private TestFeign  testFeign;
    
    public String test() {
       SystemInfo systemInfo = new SystemInfo();
       testFeign.test(systemInfo);
       return "ok";
    }
    

    Feign设计架构

      以下是Feign整体的设计架构,可以看出主要采用的有动态代理技术以及加解码


    Feign设计架构.png

    为什么要阅读源码

    1. 求知欲,开发人员基本素养。
    2. 熟悉非直接研发代码,了解整个调用链路,方便问题的排查与开发的扩展,丰富解决方案,拓展思路。
    3. 向开源代码学习,在日常研发时,规范或者优雅的进行研发,这里并非只有代码,注释等同样值得学习。

    问题

    在阅读源码之前先提出几个很容易遇到的问题,可以想一下答案:

    1. FeignClient已经声明,引入时为何报错,无法注入
    2. 如何加入Request Header
    3. 如何实现上传文件(单个或者多个文件)
    4. 如何将默认的Jackson替换为Fastjson
      简单提出以上4个问题,如果有可以补充的留言区哦。以上是源码解析第一章,接下来将进入正题环节。

    展望

    • Feign代码入口寻找(Feign源码解析(一))

    相关文章

      网友评论

          本文标题:Feign源码解析(一)

          本文链接:https://www.haomeiwen.com/subject/ptynjdtx.html