吹得这么牛皮的RPC,到底是个什么鬼?该如何实现呢?
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
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,到底是个什么鬼?该如何实现呢?相关推荐
- 章磊回答: 姚期智提出的百万富翁难题被破解? 多方安全计算MPC到底是个什么鬼?
姚期智提出的"百万富翁"难题被破解? 多方安全计算MPC到底是个什么鬼? 作者 | 章磊 责编 | Aholiab 出品 | CSDN.ARPA 在越来越多对数据隐私的担忧声中,政 ...
- 【干货】CRM大牛告诉你,Salesforce到底是个什么鬼?
本期主题 | Salesforce到底是个什么鬼 分享嘉宾 | 裘思博 Celnet雨花石创始人&合伙人 文字整理 | 莜筱 入群请联系管理员 37℃ 微信号:erhuoyimei 裘思博 本 ...
- python logger handler_Python中的logger和handler到底是个什么鬼
最近的任务经常涉及到日志的记录,特意去又学了一遍logging的记录方法.跟java一样,python的日志记录也是比较繁琐的一件事,在写一条记录之前,要写好多东西.典型的日志记录的步骤是这样的: 创 ...
- 广义线性模型到底是个什么鬼?
以下文章内容摘自网络:说人话的统计学 原标题:广义线性模型到底是个什么鬼? ❉说人话的统计学❉ 从逻辑回归模型开始,我们连续讲了好多集有些相似又特点各异的几种统计模型.它们有个统一的旗号,叫做「广义线 ...
- 区块链到底是个什么鬼,一幅漫画让你秒懂
区块链到底是个什么鬼,一幅漫画让你秒懂 字体: 小 中 大 | 打印发布: 2018-1-12 10:58 作者: n 来源: 21世纪经济报道 查看: 930 次 区块链技 ...
- 计算机硬件的漏洞,震惊了硬件圈子的CPU漏洞,到底是个什么鬼?
原标题:震惊了硬件圈子的CPU漏洞,到底是个什么鬼? 这两天如果你关注一点硬件圈的话,可能会注意到这两天CPU爆出了两个重要漏洞(一开始大家以为只有一个).关于这俩漏洞,身边也有人问过橙子君这究竟是个 ...
- Vuex白话教程第一讲:Vuex到底是个什么鬼?
Vuex白话教程第一讲:Vuex到底是个什么鬼? Vuex白话教程第二讲:Vuex旗下的State和Getter Vuex白话教程第三讲:Vuex旗下的Mutation Vuex白话教程第四讲:Vue ...
- 枚举到底是个什么鬼类型?
前言 枚举是很多面向对象语言都会有的一种类型,它可以将表达同一类型的变量组合成一个集合,组成一个常量集 在Java中也有枚举类型,是用enum关键字来表示的 枚举常用来表示一个常量集,用来限定变量的取 ...
- 敏捷到底是个什么鬼?
" 如何用一两句话说清楚敏捷的本质是什么呢?" 温馨提示,如果眼睛太累或者在忙其他事,按照这个攻略可以听本文: 看文章很累,不如听吧!手把手教你如何听公众号文章 大家都知道,敏捷虽 ...
最新文章
- mysql返回惟一不同值_SQL/MySQL-选择不同/唯一但返回所有列?
- AngularJS学习日记(四)Service和Provider
- 事件驱动模式--Reactor
- 图像处理理论(一)——直方图、二值化、滤波基础
- 语言中的petchar运用_还在担心你家孩子发音、语言问题?12个表现、3个预防是重点...
- C#(WPF)为Grid添加实线边框。
- php操作mysql常用_PHP常用MySql操作
- NumberFormat
- DPDK Release 20.11
- 一键生成ai伪原创文章的方法
- jQuery事件与事件对象
- 平头哥广发英雄帖,公开首款CPU“玄铁”仿真代码
- 【汇编程序】实现输出2012-2100年之间所有闰年
- 单片机MCU学习方法总结
- quartusII 学习杂记
- java设置post超时时间_HttpClient 如何设置超时时间
- 英菲克I9_H8_当贝纯净桌面-YYF定制-线刷固件包
- JAVA性能优化,让程序更快更稳定
- 12、TWS API和IB中的订单管理
- 天梯赛 L1-079 天梯赛的善良(c语言)
热门文章
- 四格漫画《MUXing》——他们在干什么
- 如何从零开始建站,四个步骤了解一下
- 联盟广告平台架构及实践
- ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasks
- Java视频修改分辨率(附代码) | Java工具类
- 在html表格中进行计算,如何在word表格中实现计算功能?超级实用,值得细细品味...
- # Linux shell终端设置代理服务器的方法
- H5网页播放器EasyPlayer.js如何实现直播视频实时录像?
- NTP8910A(内置DSP、10W双声道立体声 I2S数字功放芯片)
- 丰子恺:不宠无惊 过一生