点击上方“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相关推荐

  1. 手写一个迷你版Spring MVC框架

    前期准备 我这里要写的是一个迷你版的Spring MVC,我将在一个干净的web工程开始开发,不引入Spring,完全通过JDK来实现. 我们先来看一眼工程: 工程代码结构 第一:在annotatio ...

  2. 手写一个迷你版的 Tomcat 猫

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  3. 手写一个迷你版的 Tomcat 喵【转】

    原文地址:https://blog.csdn.net/FYGu18/article/details/82921115 前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交 ...

  4. 极光im java_java手写一个迷你版的Tomcat代码分享

    前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道.这是一只神奇的猫,今天让我来抽象你,实现你! Write MyTomcat Tomcat是非常流行的Web Ser ...

  5. 手写一个迷你版的 Tomcat 喵

    前言 Write MyTomcat 2.1 MyRequest 2.2 MyResponse 2.3 MyServlet 2.4 ServletMapping 和 ServletMappingConf ...

  6. 手写一个简易版本的RPC

    前言 在1024程序员节前夕,学习技术是对节日最好的庆祝. 手写一个简易版的RPC,可以把模糊抽象的概念具像化,属于落地层面了. 1. RPC基本原理 RPC原理 2. 四个版本的迭代 注:api表示 ...

  7. 实现一个迷你版的RPC

    目录 前言 动手实现RPC 商品服务工程 商品对象 商品查询API接口 rpc实现方法 商品API的具体实现 运行结果 前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者 ...

  8. 写一个迷你版Smarty模板引擎,对认识模板引擎原理非常好(附代码)

    前些时间在看创智博客韩顺平的Smarty模板引擎教程,再结合自己跟李炎恢第二季开发中CMS系统写的tpl模板引擎.今天就写一个迷你版的Smarty引擎,虽然说我并没有深入分析过Smarty的源码,但是 ...

  9. 肝一波 ~ 手写一个简易版的Mybatis,带你深入领略它的魅力!

    零.准备工作 <dependencies><dependency><groupId>mysql</groupId><artifactId>m ...

最新文章

  1. spring boot2.x使用rabbitmq
  2. 1035. 插入与归并(25)
  3. 腾讯成联合国全球合作伙伴,TDSQL如何支撑史上最大规模全球会议
  4. NET Core入门笔记
  5. 上课点名app_【APP种草】网瘾少年的自我救赎之最强锁机软件
  6. Effective STL(第7条)
  7. sequelize模型关联_使用Sequelize来计算关联模型中的行数(其中id ='x')
  8. 圆角边框(HTML、CSS)
  9. 汇编程序设计入门(安装+debug调试实例)
  10. Atitit.实现继承的原理and方法java javascript .net c# php ...
  11. 如何下载乡镇区划行政边界线
  12. linux系统桌面放大镜,Ubuntu下怎样使用放大镜辅助功能
  13. python常用的颜色英文表达_面料颜色中英文翻译对照表
  14. java文本框背景_Java 添加文本框到PPT幻灯片过程解析
  15. Mysql数据库学习笔记[完结]
  16. httpmember.php,PHPMyWind 5.1 /member.php 远程密码修改漏洞
  17. 挑战程序设计竞赛——详解DFS及BFS
  18. 小米路由器4A千兆版 直刷 openwrt
  19. 【数据结构和算法】赫夫曼树 | 实战演练(二)
  20. JZOJ_7.19C组第一题 小麦亩产一千八

热门文章

  1. windows无法访问 计算机打印机,windows无法打开添加打印机的解决方法
  2. Ubuntu16.04安装Samba 细节
  3. CMU计算机科学硕士,美国卡内基梅隆大学CMU计算机专业CS硕士录取
  4. 永磁同步电机无速度传感器控制(一)——滑模观测器(二)【滑模观测器设计过程】
  5. web程序设计(前端)实验一——表格设计
  6. vue canvas 方法无效_vue实现手机app手写签名功能
  7. 深度报告(69页附下载)| 蜂窝车联网(C-V2X)技术与产业发展态势前沿报告2020-中国通信学会
  8. 从不充值的玩家 SQL查询
  9. keepalive_timeout
  10. 中专计算机应用专业介绍,计算机应用技术专业介绍_中职中专网