目录

前言

动手实现RPC

商品服务工程

商品对象

商品查询API接口

rpc实现方法

商品API的具体实现

运行结果


前言

在实际后台服务开发中,比如订单服务(开发者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,查询得到商品对象信息。

商品对象

要注意的是,Product是可以被序列化的,Why?

很显然,订单系统调用商品系统的时候,需要商品系统返回一个商品,必然涉及到发生网络传输,这就涉及对象的序列化和反序列化了。

商品查询API接口

在订单系统工程中需要引入商品服务API依赖。

在上图代码中,最重要的就是rpc方法了!

rpc实现方法

第一,我们看到了Proxy.newProxyInstance,很显然在进行动态代理。也即是说,在订单服务调用商品服务的代码中,我们先是通过动态代理返回一个代理的IProductService类型对象,这意味着当代理对象调用queryById方法的时候,会自动调用invoke方法!

第二,我们看看invoke到底做了些什么?

它本质上就是进行Socket通信,那么它需要传递什么信息给到商品服务呢?

我们知道订单系统就是想调用商品服务的某个类的某个方法,然后把这个方法的返回结果传输给订单系统!

想一想,如何调用某个类的某个方法呢?

只要我们能确定这个类的全限定类名、确定方法名、确定方法的参数类型,给定方法需要的具体参数,通过反射就能实现。

商品服务调用后得到的结果,我们序列化写入Socket流中,在订单系统中反序列化得到对象即可。

第三,这里需要思考一个问题:在订单系统中我们只知道商品服务的API,并不知道这背后的API到底是如何实现的,所以我们需要有一个映射,就是商品服务的API到商品服务的实现的一个映射关系,其实这就是所谓的服务的注册!

商品API的具体实现

从这里,可以清晰的看到,商品服务读取了订单系统调用商品系统时发送的数据,利用反射机制,进行方法调用,并把调用结果写入Socket输出流。

运行结果

启动商品服务后,通过订单系统发起对商品服务的调用。

以前总认为RPC是遥不可及的,感觉是个很神奇的东西,实际上它的底层实现不就是这样的么~

作者:张丰哲
链接:https://www.jianshu.com/p/29d75a25eeaf

实现一个迷你版的RPC相关推荐

  1. 如何手写一个迷你版的RPC

    点击上方"Java后端技术栈"关注 持续推送技术干货 前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以 ...

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

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

  3. ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

    从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...

  4. 还没理解微前端?手把手教你实现一个迷你版

    大厂技术  高级前端  Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 最近看了几个微前端框架的源码(single-spa[1].qiankun[2].micro- ...

  5. python 制作自己的新闻_新闻-十行代码,用Python做一个迷你版的美图秀秀

    十行代码,用Python做一个迷你版的美图秀秀 2020-02-28 10:16:08 作者: 匿名 浏览量:65次 美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让 ...

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

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

  7. 【手写系列】写一个迷你版的Tomcat

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

  8. 从零开始写一个迷你版的Tomcat

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | www.jianshu.com/p/dce1ee01fb ...

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

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

最新文章

  1. string包含某个字符串_Tcl字符串操作基础2
  2. MySQL / 基本架构介绍
  3. 更改WebBrowser控件的用户代理
  4. Safari 14.0 的功臣 Webp?
  5. react优秀项目案例_关于进行2019年北京市高等学校“实培计划”项目——毕业设计(创业类)项目总结与优秀项目案例征集的通知...
  6. 【openMV】OpenMV4基础知识
  7. 肇东一中2021高考成绩查询,肇东一中2018高考喜报成绩
  8. java ajax文字搜素,JAVA-WEB AJAX 搜索条自动提示
  9. springMVC4(4)json与对象互转实例解析请求响应数据转换器
  10. AD域管理员账号下发
  11. 云忧cms搭建在宝塔nginx服务器,登录报错
  12. IP Scanner Pro for mac(局域网IP扫描)
  13. 小程序上传图片/上传视频
  14. 2018-2-13-win10-UWP--蜘蛛网效果
  15. 如何查看自己WiFi密码
  16. Unity3D代码混淆
  17. OBU ETC的汽车电子抛负载解决方案
  18. 将十个数进行从大到小的顺序进行排列_如何进行商品ABC分类管理
  19. python嵩天课后题答案第三章_python语言程序设计基础(嵩天)第三章课后习题部分个人练习...
  20. android+360+手表,360智能手表

热门文章

  1. win10或win7系统不小心误碰笔记本触摸板,打乱桌面图标排列顺序
  2. 【实用】游戏开发岗位常见笔试题知识点汇总
  3. 计算机如何制作U盘启动盘,U大侠U盘启动盘制作教程_教你如何制作U盘启动 - U大侠,装机专家...
  4. base64编码的三种方式、各方式性能比较
  5. 使用Qt开发Github中的开源项目
  6. 女软件工程师的逆袭之路 [问题点数:40分]
  7. 抖音参与福袋显示服务器异常,抖音直播福袋互动规则及FAQ
  8. 如何训练自己的演讲水平
  9. nohup和作用详解
  10. Verilog学习之路(6)— 组合电路的设计