点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

99套Java企业级实战项目

4000G架构师资料

作者:张丰哲
原文:https://www.jianshu.com/p/29d75a25eeaf

本文经原作者授权转载

# 前言

在实际后台服务开发中,比如订单服务(开发者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输出流。

运行结果

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

有热门推荐????

写给大忙人的Redis主从复制,花费五分钟让你面试不尴尬

Java中当对象不再使用时,不赋值为null会导致什么后果 ?

微信支付的软件架构也太特么牛逼了吧...

很全很牛逼,看完这篇Elasticsearch实战,我觉得我可以写个百度~

微信支付的软件架构也太特么牛逼了吧...

干货分享:扫码关注下面的公众号后台回复“99”领取99套实战项目+资料

想充电就关注序员闪充宝

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

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


http://www.taodudu.cc/news/show-4616462.html

相关文章:

  • 树莓派,居然还隐藏了这些秘密
  • JavaScript 一团乱,这是好事
  • React-Native+Mobx做一个迷你水果商城APP
  • js 迷你库
  • 不可错过的javascript迷你库
  • 手写一个基于NIO的迷你版Tomcat
  • 用React-Native+Mobx做一个迷你水果商城APP
  • 《JavaScript 正则表达式迷你书》知识点小抄本
  • DockOne微信分享(一二八):容器如何监控?
  • 微信小程序开发采坑记录1
  • 如何选择微信小程序开发框架?2018年更新
  • 使用 Elasticsearch 搭建自己的搜索系统,真心强大!
  • 为什么ios比android快,那些说ios比Android快的,进来看看!
  • 美国学生在使用计算机小短文,前段时间,一篇北大毕业美国留学生的短文!
  • 让信息跨过高山大海,送达人山人海,奈何光纤损耗太大
  • 服务器数字显示器,服务器数字KVM切换器
  • 亲密关系的方法论
  • 用计算机弹出thatgirl,抖音thatgirl谐音唱法音译 thatgirl歌词是什么意思中文翻译...
  • 用计算机语言写结婚祝福语,非常有用的结婚祝福语
  • JavaScript------JS相关难题,做对一半算你牛牪犇
  • 前端面试题库 面试题 JS难题,做对一半就是高手
  • 44道JS难题,做对一半就是高手
  • java初级基础
  • 爱比恨只多一笔
  • 【面试题】1384- 分享 44 道 JS 难题,做对一半就是高手
  • python不使用pandas保存csv|python追加写入scv方法
  • pandas用read_scv读取含英文双引号的文件
  • SCv3000和SCv3020存储安装概念
  • DELL SCv3020存储日常运维
  • linux scv

吹得这么牛皮的RPC,到底是个什么鬼?该如何实现呢?相关推荐

  1. 章磊回答: 姚期智提出的百万富翁难题被破解? 多方安全计算MPC到底是个什么鬼?

    姚期智提出的"百万富翁"难题被破解? 多方安全计算MPC到底是个什么鬼? 作者 | 章磊 责编 | Aholiab 出品 | CSDN.ARPA 在越来越多对数据隐私的担忧声中,政 ...

  2. 【干货】CRM大牛告诉你,Salesforce到底是个什么鬼?

    本期主题 | Salesforce到底是个什么鬼 分享嘉宾 | 裘思博 Celnet雨花石创始人&合伙人 文字整理 | 莜筱 入群请联系管理员 37℃ 微信号:erhuoyimei 裘思博 本 ...

  3. python logger handler_Python中的logger和handler到底是个什么鬼

    最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法.跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西.典型的日志记录的步骤是这样的: 创 ...

  4. 广义线性模型到底是个什么鬼?

    以下文章内容摘自网络:说人话的统计学 原标题:广义线性模型到底是个什么鬼? ❉说人话的统计学❉ 从逻辑回归模型开始,我们连续讲了好多集有些相似又特点各异的几种统计模型.它们有个统一的旗号,叫做「广义线 ...

  5. 区块链到底是个什么鬼,一幅漫画让你秒懂

    区块链到底是个什么鬼,一幅漫画让你秒懂 字体:  小  中  大  | 打印发布: 2018-1-12 10:58    作者: n    来源: 21世纪经济报道    查看: 930 次 区块链技 ...

  6. 计算机硬件的漏洞,震惊了硬件圈子的CPU漏洞,到底是个什么鬼?

    原标题:震惊了硬件圈子的CPU漏洞,到底是个什么鬼? 这两天如果你关注一点硬件圈的话,可能会注意到这两天CPU爆出了两个重要漏洞(一开始大家以为只有一个).关于这俩漏洞,身边也有人问过橙子君这究竟是个 ...

  7. Vuex白话教程第一讲:Vuex到底是个什么鬼?

    Vuex白话教程第一讲:Vuex到底是个什么鬼? Vuex白话教程第二讲:Vuex旗下的State和Getter Vuex白话教程第三讲:Vuex旗下的Mutation Vuex白话教程第四讲:Vue ...

  8. 枚举到底是个什么鬼类型?

    前言 枚举是很多面向对象语言都会有的一种类型,它可以将表达同一类型的变量组合成一个集合,组成一个常量集 在Java中也有枚举类型,是用enum关键字来表示的 枚举常用来表示一个常量集,用来限定变量的取 ...

  9. 敏捷到底是个什么鬼?

    " 如何用一两句话说清楚敏捷的本质是什么呢?" 温馨提示,如果眼睛太累或者在忙其他事,按照这个攻略可以听本文: 看文章很累,不如听吧!手把手教你如何听公众号文章 大家都知道,敏捷虽 ...

最新文章

  1. mysql返回惟一不同值_SQL/MySQL-选择不同/唯一但返回所有列?
  2. AngularJS学习日记(四)Service和Provider
  3. 事件驱动模式--Reactor
  4. 图像处理理论(一)——直方图、二值化、滤波基础
  5. 语言中的petchar运用_还在担心你家孩子发音、语言问题?12个表现、3个预防是重点...
  6. C#(WPF)为Grid添加实线边框。
  7. php操作mysql常用_PHP常用MySql操作
  8. NumberFormat
  9. DPDK Release 20.11
  10. 一键生成ai伪原创文章的方法
  11. jQuery事件与事件对象
  12. 平头哥广发英雄帖,公开首款CPU“玄铁”仿真代码
  13. 【汇编程序】实现输出2012-2100年之间所有闰年
  14. 单片机MCU学习方法总结
  15. quartusII 学习杂记
  16. java设置post超时时间_HttpClient 如何设置超时时间
  17. 英菲克I9_H8_当贝纯净桌面-YYF定制-线刷固件包
  18. JAVA性能优化,让程序更快更稳定
  19. 12、TWS API和IB中的订单管理
  20. 天梯赛 L1-079 天梯赛的善良(c语言)

热门文章

  1. 四格漫画《MUXing》——他们在干什么
  2. 如何从零开始建站,四个步骤了解一下
  3. 联盟广告平台架构及实践
  4. ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks
  5. Java视频修改分辨率(附代码) | Java工具类
  6. 在html表格中进行计算,如何在word表格中实现计算功能?超级实用,值得细细品味...
  7. # Linux shell终端设置代理服务器的方法
  8. H5网页播放器EasyPlayer.js如何实现直播视频实时录像?
  9. NTP8910A(内置DSP、10W双声道立体声 I2S数字功放芯片)
  10. 丰子恺:不宠无惊 过一生