专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  实战|记一次MySQL亿级数据的平滑迁移 ·  16 小时前  
芋道源码  ·  阿里也出手了!Spring Cloud ... ·  4 天前  
芋道源码  ·  实用指南:解决 SpringBoot ... ·  6 天前  
芋道源码  ·  Java找工作太逆天了。。 ·  1 周前  
51好读  ›  专栏  ›  芋道源码

Open-Feign 你真的会用了吗?

芋道源码  · 公众号  · Java  · 2024-10-19 17:12

正文

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:juejin.cn/post/
7289664651360550927


引言

现在我们在微服务开发中,由于服务拆分,我们不可避免的会涉及一个服务需要调用另一个服务的RPC场景,对于这一场景的实现有很多方案:我们可以自己封装httpclient,也可以使用RestTemplate或者Dubbo,以及我本文要讲的Open-Feign,这些都可以方便我们来完成远程调用。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

一、案例

首先,我们简单的实现一个Open-Feign的使用案例:

现在假设我们有这么一个场景:

我们有两个服务:认证权限服务auth-service,还有一个应用服务app-service,应用服务登入的时候需要调用认证权限服务来进行账号认证和权限校验

auth-service中有一个认证接口:

@RestController
@RequestMapping("/api)
public class AuthController {

    @GetMapping("
/auth")
    public Boolean auth(@RequestBody AuthRequest authRequest){
    // 认证逻辑 ...
        return true;
    }
}

而由于我们在app-service中需要去调用auth-service的auth接口,所以我们可以使用open-feign来帮我们完成RPC的过程,我们可以这么来实现:

使用open-feign功能的几个步骤:

1.我们先需要引入maven依赖:

<dependency>
    <groupId>org.springframework.cloudgroupId>
    <artifactId>spring-cloud-starter-openfeignartifactId>
dependency>

2.使用@EnableFeignClients来启用Open-Feign的能力,比如可以在app-service启动项AppServiceStater上标注这个注解:

@EnableFeignClients
@SpringBootApplication
public class AppServiceStater {
    public static void main(String[] args) {
        SpringApplication.run(ServiceProviderAppStater.classargs);
    }
}

3.以接口的方式构建我们需要RPC操作的远程接口配置

比如在我们的场景下,我们需要操作认证服务auth-service/api/auth接口,那么我们可以如下操作:

@FeignClient(name = "auth-service",url = "http://127.0.0.1:8080")
public interface AuthServiceRemoteClient {

@GetMapping(value = "/api/auth")
Boolean auth(@RequestBody AuthRequest);
}

4.注入3中写的接口并调用方法

@RestController
public class NacosController {

    @Autowired
    AuthServiceRemoteClient authServiceRemoteClient;

    @GetMapping("/app/login")
    public Boolean login(@RequestBody LoginRequest loginRequest){
        // 转换为AuthRequest auth
        AuthRequest authRequest = Convert(loginRequest);
        return authServiceRemoteClient.auth(authRequest);
    }
}

完成以上几个步骤后,当我们请求app-service的login接口的时候,内部就会调用auth-service的auth接口进行认证,整个过程还是很丝滑的。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

二、大的思想

看完上面的案例后,相信你应该很想知道整个Open-Feign的实现是怎么样的,再了解细节之前,我们先站在上帝视角来看下这个大的思想:

1.构建过程

当项目启动的时候,Open-Feign会扫描指定的标注了@FeifnClient的注解,根据上面案例我们知道@FeignClient是标注在接口之上的,扫描到这个接口后,Open-Feign会通过JDK动态代理的方式为这个接口生成代理对象;而接口中的每一个方法都是对应了一个远程的API接口,如何在调用指定的方法就可以调到远程的指定接口呢?

这是Open-Feign在解析接口时,接口中的每个方法会被解析成MethodMetadata信息,然后再转换成MethodHandler,最终解析完所有的方法会构成一个Map对象,而这个对象会作为InvocationHandler的一个属性而存在,我们都知道InvocationHandler是JDK动态代理的一个核心组件,所有被代理的对象方法调用都会走到InvocationHandler的invoke方法逻辑,下图展示了整个动态代理构建的过程:

2. 调用执行过程

当已经构建好了所有的@FeignClient标注接口的代理对象时,我们调用指定的方法时,会从Map对象对象中根据Method来获取指定的MethodHandler对象,然后执行其invoke方法进行真正的RPC逻辑。

三、总结

本章我们仅仅描述了Open-Feign的使用案例,以及整个JDK动态代理的实现,是在一个很高的层面来看整个Open-Feign的实现原理。后面我们解析整个RPC请求的构建、执行和响应返回的整个详细逻辑,而这一切正是包含在MethodHandler对象的invoke方法之中,期待后续我们一起探索。


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)