如何手写一个迷你版的RPC
点击上方“Java后端技术栈“关注
持续推送技术干货
前言
在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以接口的形式提供给A。通常都是B把API上传到Maven私服,然后B开始写API的实现,A只需要引入API依赖进行开发即可。
订单服务调用商品服务
上图简单的描述了RPC在实际场景中的应用,我们在开发中当然是利用现有的RPC框架来快速实现业务需求,比如百度开源了baidu-rpc,阿里的Dubbo早已声名在外,腾讯自己玩TAF。本篇博客将实现一个迷你版的RPC,探索下RPC底层实现的奥秘!
动手实现RPC
商品服务工程
商品服务工程
注意,我将商品服务的API以及实现分为Maven的2个模块来开发。这里,我们想给定一个商品ID,查询得到商品对象信息。
商品对象
商品API
Product
要注意的是,Product是可以被序列化的,Why?
很显然,订单系统调用商品系统的时候,需要商品系统返回一个商品,必然涉及到发生网络传输,这就涉及对象的序列化和反序列化了。
商品查询API接口
商品查询API
订单系统调用商品服务
订单服务调用商品服务
在订单系统工程中需要引入商品服务API依赖。
在上图代码中,最重要的就是rpc方法了!
rpc实现方法
rpc
第一,我们看到了Proxy.newProxyInstance,很显然在进行动态代理。也即是说,在订单服务调用商品服务的代码中,我们先是通过动态代理返回一个代理的IProductService类型对象,这意味着当代理对象调用queryById方法的时候,会自动调用invoke方法!
第二,我们看看invoke到底做了些什么?
它本质上就是进行Socket通信,那么它需要传递什么信息给到商品服务呢?
我们知道订单系统就是想调用商品服务的某个类的某个方法,然后把这个方法的返回结果传输给订单系统!
想一想,如何调用某个类的某个方法呢?
只要我们能确定这个类的全限定类名、确定方法名、确定方法的参数类型,给定方法需要的具体参数,通过反射就能实现。
商品服务调用后得到的结果,我们序列化写入Socket流中,在订单系统中反序列化得到对象即可。
第三,这里需要思考一个问题:在订单系统中我们只知道商品服务的API,并不知道这背后的API到底是如何实现的,所以我们需要有一个映射,就是商品服务的API到商品服务的实现的一个映射关系,其实这就是所谓的服务的注册!
商品API的具体实现
商品服务
商品服务API实现
商品服务
商品服务
从这里,可以清晰的看到,商品服务读取了订单系统调用商品系统时发送的数据,利用反射机制,进行方法调用,并把调用结果写入Socket输出流。
运行结果
运行结果
启动商品服务后,通过订单系统发起对商品服务的调用。
以前总认为RPC是遥不可及的,感觉是个很神奇的东西,实际上它的底层实现不就是这样的么~
https://www.jianshu.com/p/29d75a25eeaf
在这金三银四的季节,栈长为大家准备了四份面试宝典:
《java面试宝典5.0》
《Java(BAT)面试必备》
《350道Java面试题:整理自100+公司》
《资深java面试宝典-视频版》
大量电子书籍
分别适用于初中级,中高级,以及资深级工程师的面试复习。
内容包含java基础、javaweb、各个性能优化、JVM、锁、高并发、反射、Spring原理、微服务、Zookeeper、数据库、数据结构、限流熔断降级等等。
获取方式:点“在看”,V信扫描上面二维码:注明面试领取,更多精彩陆续奉上。
如何手写一个迷你版的RPC相关推荐
- 手写一个迷你版Spring MVC框架
前期准备 我这里要写的是一个迷你版的Spring MVC,我将在一个干净的web工程开始开发,不引入Spring,完全通过JDK来实现. 我们先来看一眼工程: 工程代码结构 第一:在annotatio ...
- 手写一个迷你版的 Tomcat 猫
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...
- 手写一个迷你版的 Tomcat 喵【转】
原文地址:https://blog.csdn.net/FYGu18/article/details/82921115 前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交 ...
- 极光im java_java手写一个迷你版的Tomcat代码分享
前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道.这是一只神奇的猫,今天让我来抽象你,实现你! Write MyTomcat Tomcat是非常流行的Web Ser ...
- 手写一个迷你版的 Tomcat 喵
前言 Write MyTomcat 2.1 MyRequest 2.2 MyResponse 2.3 MyServlet 2.4 ServletMapping 和 ServletMappingConf ...
- 手写一个简易版本的RPC
前言 在1024程序员节前夕,学习技术是对节日最好的庆祝. 手写一个简易版的RPC,可以把模糊抽象的概念具像化,属于落地层面了. 1. RPC基本原理 RPC原理 2. 四个版本的迭代 注:api表示 ...
- 实现一个迷你版的RPC
目录 前言 动手实现RPC 商品服务工程 商品对象 商品查询API接口 rpc实现方法 商品API的具体实现 运行结果 前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者 ...
- 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)
前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...
- 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!
零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...
最新文章
- spring boot2.x使用rabbitmq
- 1035. 插入与归并(25)
- 腾讯成联合国全球合作伙伴,TDSQL如何支撑史上最大规模全球会议
- NET Core入门笔记
- 上课点名app_【APP种草】网瘾少年的自我救赎之最强锁机软件
- Effective STL(第7条)
- sequelize模型关联_使用Sequelize来计算关联模型中的行数(其中id ='x')
- 圆角边框(HTML、CSS)
- 汇编程序设计入门(安装+debug调试实例)
- Atitit.实现继承的原理and方法java javascript .net c# php ...
- 如何下载乡镇区划行政边界线
- linux系统桌面放大镜,Ubuntu下怎样使用放大镜辅助功能
- python常用的颜色英文表达_面料颜色中英文翻译对照表
- java文本框背景_Java 添加文本框到PPT幻灯片过程解析
- Mysql数据库学习笔记[完结]
- httpmember.php,PHPMyWind 5.1 /member.php 远程密码修改漏洞
- 挑战程序设计竞赛——详解DFS及BFS
- 小米路由器4A千兆版 直刷 openwrt
- 【数据结构和算法】赫夫曼树 | 实战演练(二)
- JZOJ_7.19C组第一题 小麦亩产一千八
热门文章
- windows无法访问 计算机打印机,windows无法打开添加打印机的解决方法
- Ubuntu16.04安装Samba 细节
- CMU计算机科学硕士,美国卡内基梅隆大学CMU计算机专业CS硕士录取
- 永磁同步电机无速度传感器控制(一)——滑模观测器(二)【滑模观测器设计过程】
- web程序设计(前端)实验一——表格设计
- vue canvas 方法无效_vue实现手机app手写签名功能
- 深度报告(69页附下载)| 蜂窝车联网(C-V2X)技术与产业发展态势前沿报告2020-中国通信学会
- 从不充值的玩家 SQL查询
- keepalive_timeout
- 中专计算机应用专业介绍,计算机应用技术专业介绍_中职中专网