【手写系列】纯手写实现一个高可用的RPC
前言
在实际后台服务开发中,比如订单服务(开发者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是遥不可及的,感觉是个很神奇的东西,实际上它的底层实现不就是这样的么~
晚安!
手写系列相关爆文
【手写系列】写出我的第一个框架:迷你版Spring MVC
【手写系列】透彻理解Spring事务设计思想之手写实现
【手写系列】透彻理解MyBatis设计思想之手写实现
【手写系列】理解数据库连接池底层原理之手写实现
【手写系列】对HashMap的思考及手写实现
【手写系列】纯手写实现JDK动态代理
【手写系列】写一个迷你版的Tomcat
【手写系列】纯手写实现一个高可用的RPC相关推荐
- 如何设计一个高可用的运营系统
转载自 如何设计一个高可用的运营系统 这是一篇来自粉丝的投稿,作者[林湾村龙猫]近一年在做关于运营活动方面的设计.本文是他的关于运营活动的总结,Hollis做了一点点修改. 概述 一个产品业务的发 ...
- Spring Cloud Eureka(三)实现一个高可用的注册中心
Spring Cloud Eureka(三)实现一个高可用的注册中心 实现一个高可用的注册中心 在微服务结构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须为服务的各个组件进行 ...
- 汇总-13台虚拟机搭建一个高可用负载均衡集群架构
要求 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下. 设计你认为合理的架构,用visio把架构图画出来 搭建lnmp.tomcat+jdk环境 三个站点分别为:dis ...
- 2 小时快速搭建一个高可用的 IM 系统
知道的越多,不知道的就越多,业余的像一棵小草! 编辑:业余草 来源:https://www.xttblog.com/?p=4994 本文快速搭建的 IM 系统也是使用 Go 语言来快速实现的,这里先和 ...
- xen是服务器虚拟化,xen虚拟化实战系列(十二)之xen虚拟机高可用之在线迁移
xen虚拟化实战系列文章列表 xen虚拟化实战系列(十三)之xen虚拟机集中管理之convirt 1. 方案背景概述 本文是有对我们一个xen虚拟化生产环境将要改造的一个方案而来,在项目上线初期,没有 ...
- JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性
一.什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的.停工时间,就是不能向用户提供服务的时间.高可用,就是系统具有高度可用性,尽量减少停工时间.如何用最简单的方法来搭建 ...
- 搭建一个高可用的镜像仓库,这是我见过最详细、最简单的教程
作者 | 小碗汤 来源 | 我的小碗汤 今天分享一篇搭建一个高可用镜像仓库的教程.详细中夹杂着简单~. Harbor 部署架构图 harbor 使用 helm 部署在 k8s 集群中,通过 ingre ...
- 如何设计一个高可用系统?要考虑哪些地方?
来自:JavaGuide 一篇短小的文章,面试经常遇到的这个问题.本文主要包括下面这些内容: 高可用的定义 哪些情况可能会导致系统不可用? 有些提高系统可用性的方法?只是简单的提一嘴,更具体内容在后续 ...
- 如何设计一个高可用、高并发秒杀系统
作者:vincentsu,腾讯 PCG 后台开发工程师 如今的互联网已经在海量服务领域有了很成熟的理论,因此自己也很庆幸,能够从 0 到 1 完整践行海量服务.微视春节项目中的集卡瓜分活动,是一个典型 ...
最新文章
- 八种简易健康减肥瘦身法
- 报名 | 挑战极限,参加2天清华数据Hackathon,赢得4万元奖金
- 人工智能专业国内排名前30的高校,与你想的一样吗?
- SQL server 2005服务器备份文件的强制还原后引起的孤立用户问题解决方法
- 自己动手写一个nodejs的日志生成器
- linux文件夹权限问题
- java足球游戏毕业设计,java毕业设计_springboot框架的校园足球管理平台
- Camera摄像头工作原理
- 【linux】ssh 远程执行命令
- 【软件项目管理】软件项目的主要成本是人的劳动的消耗
- 如何在 MacBook Pro 上调整显示设置?
- Spring源码之bean的实例化createBeanInstance方法解读
- masm32 安装过程(记录)
- 屏幕录像大师如何把LXE文件转换为EXE文件
- 华为OSN3500与路由器混合组网
- 服务器突然断电文件系统损坏,电脑突然断电造成系统文件损坏该如何修复?(高级篇)...
- 从何处来,往何处去——关于数学起源和目的思考
- 添加腾讯007防水墙
- 微信小程序-网易云音乐
- 理光Ricoh Pro 907EX 一体机驱动
热门文章
- java 最近将工作中用到的工具总结——日期工具
- OSGI 面向Java的动态模型系统
- Speex回声消除原理深度解析
- 如何在Web页面上直接打开、编辑、创建Office文档 (转载)
- 有道编程的界面做的也太粗燥了吧!
- 【C++】not accessible because 'Rectangle' uses 'private' to inherit from 'Shape'
- matlab同时给多个变量赋值(deal)
- ffmpeg加入libass
- 错误:wasm streaming compile failed: CompileError: AsyncCompile: Wasm decoding failed
- js中Blob对象一般用法