来源:juejin.cn/post/7289664651360550927
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
截止目前,累计输出 58w+ 字,讲解图 2330+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2100+小伙伴加入
引言
现在我们在微服务开发中,由于服务拆分,我们不可避免的会涉及一个服务需要调用另一个服务的RPC场景,对于这一场景的实现有很多方案:我们可以自己封装httpclient
,也可以使用RestTemplate
或者Dubbo,以及我本文要讲的Open-Feign
,这些都可以方便我们来完成远程调用。
一、案例
首先,我们简单的实现一个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.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.使用@EnableFeignClients
来启用Open-Feign
的能力,比如可以在app-service
启动项AppServiceStater
上标注这个注解:
@EnableFeignClients
@SpringBootApplication
public class AppServiceStater {
public static void main(String[] args) {
SpringApplication.run(ServiceProviderAppStater.class, args);
}
}
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接口进行认证,整个过程还是很丝滑的。
二、大的思想
看完上面的案例后,相信你应该很想知道整个Open-Feign
的实现是怎么样的,再了解细节之前,我们先站在上帝视角来看下这个大的思想:
1.构建过程
当项目启动的时候,Open-Feign
会扫描指定的标注了@FeifnClient
的注解,根据上面案例我们知道@FeignClient
是标注在接口之上的,扫描到这个接口后,Open-Feign
会通过JDK动态代理的方式为这个接口生成代理对象;而接口中的每一个方法都是对应了一个远程的API接口,如何在调用指定的方法就可以调到远程的指定接口呢?
这是Open-Feign
在解析接口时,接口中的每个方法会被解析成MethodMetadata
信息,然后再转换成MethodHandler,最终解析完所有的方法会构成一个Map<Method,MethodHandler>
对象,而这个对象会作为InvocationHandler
的一个属性而存在,我们都知道InvocationHandler
是JDK动态代理的一个核心组件,所有被代理的对象方法调用都会走到InvocationHandler
的invoke方法逻辑,下图展示了整个动态代理构建的过程:
2. 调用执行过程
当已经构建好了所有的@FeignClient
标注接口的代理对象时,我们调用指定的方法时,会从Map<Method,MethodHandler>
对象对象中根据Method来获取指定的MethodHandler
对象,然后执行其invoke方法进行真正的RPC逻辑。
三、总结
本章我们仅仅描述了Open-Feign
的使用案例,以及整个JDK动态代理的实现,是在一个很高的层面来看整个Open-Feign
的实现原理。后面我们解析整个RPC请求的构建、执行和响应返回的整个详细逻辑,而这一切正是包含在MethodHandler
对象的invoke方法之中,期待后续我们一起探索。
👉 欢迎加入小哈的星球,你将获得: 专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17..., 点击查看项目介绍;
《从零手撸:前后端分离博客项目(全栈开发)》 2期已完结,演示链接:http://116.62.199.48/;
截止目前,累计输出 58w+ 字,讲解图 2330+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,Spring Cloud Alibaba 等等,戳我加入学习,解锁全部项目,已有2100+小伙伴加入
1. 我的私密学习小圈子~
2. 效率爆表:30款 IDEA 插件,让你的代码飞起来!
3. 别再操作命令行了,试试这款适合现代工作流程的 Git 分支管理工具
4. 在 SpringBoot 中设计一个订单号生成系统
最近面试BAT,整理一份面试资料《Java面试BATJ通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 Java 领取,更多内容陆续奉上。
PS:因公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。
点“在看”支持小哈呀,谢谢啦