深入浅出 RPC - 浅出篇
发布日期:2021-06-28 22:17:35 浏览次数:2 分类:技术文章

本文共 1760 字,大约阅读时间需要 5 分钟。

近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统的主流方式,而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了。缺乏对原理层面的理解,往往也会造成开发中的一些误用。

本文分上下两篇《浅出篇》和《深入篇》,其目标就是想尝试深入浅出的分析下 RPC 本质,我总是这么认为理解了本质才能更好的应用。

RPC 是什么?

RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

RPC 起源

RPC 这个概念术语在上世纪 80 年代由  提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文  中他提到了几点:

1. 简单:RPC 概念的语义十分清晰和简单,这样建立分布式计算就更容易。
2. 高效:过程调用看起来十分简单而且高效。
3. 通用:在单机计算中过程往往是不同算法部分间最重要的通信机制。 

通俗一点说,就是一般程序员对于本地的过程调用很熟悉,那么我们把 RPC 作成和本地调用完全类似,那么就更容易被接受,使用起来毫无障碍。Nelson 的论文发表于 30 年前,其观点今天看来确实高瞻远瞩,今天我们使用的 RPC 框架基本就是按这个目标来实现的。

RPC 结构

Nelson 的论文中指出实现 RPC 的程序包括 5 个部分:

1. User
2. User-stub
3. RPCRuntime
4. Server-stub
5. Server

这 5 个部分的关系如下图所示

这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。

RPC 实现

Nelson 论文中给出的这个实现结构也成为后来大家参考的标准范本。大约 10 年前,我最早接触分布式计算时使用的  实现结构基本与此类似。CORBAR 为了解决异构平台的 RPC,使用了 IDL(Interface Definition Language)来定义远程接口,并将其映射到特定的平台语言中。后来大部分的跨语言平台 RPC 基本都采用了此类方式,比如我们熟悉的 Web Service(SOAP),近年开源的 Thrift 等。他们大部分都通过 IDL 定义,并提供工具来映射生成不同语言平台的 user-stub 和 server-stub,并通过框架库来提供 RPCRuntime 的支持。不过貌似每个不同的 RPC 框架都定义了各自不同的 IDL 格式,导致程序员的学习成本进一步上升(苦逼啊),Web Service 尝试建立业界标准,无赖标准规范复杂而效率偏低,否则 Thrift 等更高效的 RPC 框架就没必要出现了。

IDL 是为了跨平台语言实现 RPC 不得已的选择,要解决更广泛的问题自然导致了更复杂的方案。而对于同一平台内的 RPC 而言显然没必要搞个中间语言出来,例如  原生的 RMI,这样对于 java 程序员而言显得更直接简单,降低使用的学习成本。目前市面上提供的 RPC 框架已经可算是五花八门,百家争鸣了。需要根据实际使用场景谨慎选型,需要考虑的选型因素我觉得至少包括下面几点:

1. 性能指标
2. 是否需要跨语言平台
3. 内网开放还是公网开放
4. 开源 RPC 框架本身的质量、社区活跃度

总结

《浅出篇》大概就到这里结束了,《深入篇》会具体深入讲解一个 RPC 框架需要实现哪里基本功能,达到什么目标,并以在 java 平台上去具体实现一个 RPC 框架为例,分析其需要考虑的实现因素。

转载地址:https://blog.csdn.net/yhhwatl/article/details/51855275 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:post和get的区别
下一篇:random伪随机数的生成

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年04月06日 07时50分31秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

安卓主板开发!Android之内存泄漏调试学习与总结,社招面试心得 2019-04-29
安卓前端开发框架!完美讲解内存缓存LruCache实现原理,吐血整理 2019-04-29
安卓前端开发框架!轻松获得一线大厂面试offer,附答案 2019-04-29
安卓前端开发!Android性能优化之APK优化,赶快收藏备战金九银十! 2019-04-29
安卓定制系统开发!这是一份面向Android开发者的复习指南,系列篇 2019-04-29
安卓客户端开发!如何试出一个Android开发者真正的水平?分享PDF高清版 2019-04-29
安卓平板app开发!实战讲述Flutter跨平台框架应用,附大厂真题面经 2019-04-29
安卓开发包!大佬手把手教你如何仿写出大厂的APP,含BATJM大厂 2019-04-29
字节Android高工面试:BAT等大厂必问技术面试题,成功定级腾讯T3-2 2019-04-29
学习安卓开发!Android初级开发是如何一步步成为高级开发?全网独家首发! 2019-04-29
安卓app二次开发!阿里P7Android社招面试的经历,大厂直通车! 2019-04-29
安卓app开发方案!Android项目开发如何设计整体架构?已开源 2019-04-29
安卓app开发难不难!字节跳动Android实习面试凉凉经,薪资翻倍 2019-04-29
安卓app开发语言!深入浅出Android性能调优,最强技术实现 2019-04-29
7年老Android一次操蛋的面试经历,灵魂拷问 2019-04-29
7年老Android一次操蛋的面试经历,讲的明明白白! 2019-04-29
9次Android面试经验总结,手慢无 2019-04-29
Activity的6大难点,你会几个?年薪50W 2019-04-29
Activity的6大难点,你会几个?重难点整理 2019-04-29
Android-App的设计架构经验谈,技术详细介绍 2019-04-29