近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 RPC 在其中扮演着关键的作用。在平时的日常开发中我们都在隐式或显式的使用 RPC,一些刚入行的程序员会感觉 RPC 比较神秘,而一些有多年使用 RPC 经验的程序员虽然使用经验丰富,但有些对其原理也不甚了了。缺乏对原理层面的理解,往往也会造成开发中的一些误用。
本文分上下两篇《浅出篇》和《深入篇》,其目标就是想尝试深入浅出的分析下 RPC 本质,我总是这么认为理解了本质才能更好的应用。
一.RPC 是什么?
RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。
二.RPC 起源
RPC 这个概念术语在上世纪 80 年代由 Bruce Jay Nelson 提出。这里我们追溯下当初开发 RPC 的原动机是什么?在 Nelson 的论文 "Implementing Remote Procedure Calls" 中他提到了几点:
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 实现结构基本与此类似。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 而言显然没必要搞个中间语言出来,例如 Java 原生的 RMI,这样对于 java 程序员而言显得更直接简单,降低使用的学习成本。目前市面上提供的 RPC 框架已经可算是五花八门,百家争鸣了。需要根据实际使用场景谨慎选型,需要考虑的选型因素我觉得至少包括下面几点:
1.性能指标
2.是否需要跨语言平台
3.内网开放还是公网开放
4.开源 RPC 框架本身的质量、社区活跃度
五.总结
《浅出篇》大概就到这里结束了,《深入篇》会具体深入讲解一个 RPC 框架需要实现哪里基本功能,达到什么目标,并以在 java 平台上去具体实现一个 RPC 框架为例,分析其需要考虑的实现因素。
文章来源:http://blog.csdn.net/mindfloating/article/details/39473807
相关推荐
### 深入浅出MS06-040(看雪网络版) #### 前言 在网络安全领域,MS06-040是一个备受关注的安全漏洞,该漏洞影响了多个版本的Windows系统。它与远程过程调用(RPC)服务有关,允许远程攻击者通过发送特制数据包来执行...
《深入浅出Netty》是一本专注于介绍Netty框架的专著,旨在帮助读者全面理解并熟练运用这个高性能、异步事件驱动的网络应用框架。Netty是由Java编写的,广泛应用于各种网络通信场景,包括但不限于服务器开发、云计算...
【深入浅出Win32多线程程序设计】是一篇探讨现代操作系统中多线程编程技术的文章,尤其针对Win32平台。理解多线程及其同步、互斥机制是掌握现代操作系统核心概念的关键,这对于开发者来说至关重要。通过精通Win32多...
### 深入浅出Win32多线程程序设计 #### 一、引言 随着计算机技术的发展,操作系统从单任务向多任务过渡成为一种必然趋势。在DOS时代,程序员通过各种技巧来模拟“多任务”效果,但真正的多任务支持是在现代操作...
《深入浅出Spring Boot2》《图解Java多线程设计模式》 《深入理解Java虚拟机:JVM高级特性与最佳实践》 《深入理解计算机系统(原书第三版》《Netty权威指南 第2版》 《Netty 4核心原理与手写RPC框架实战》 ...
【文章内容概述】 这篇文章主要介绍了Axis开发,轴心是...总结,这篇文章深入浅出地介绍了Axis框架在Web服务开发中的应用,包括其核心组件、环境配置以及实际开发过程,旨在帮助开发者快速掌握基于Java的Web服务开发。
【标题】"dubbo博客资源文件"所对应的...总之,这篇博客深入浅出地介绍了Dubbo的核心概念和使用方法,并结合相关资源文件提供了一个实践性的学习路径,对于想要了解和掌握Dubbo的开发者来说,是非常有价值的参考资料。
总的来说,这篇文档深入浅出地介绍了德比软件在提升软件系统高可用性方面的实践和策略。从MTBF和MTTR的理论知识,到数据对接平台架构设计,再到服务级别协议的制定和监控报警体系的建立,都强调了系统设计和运营中...
总结来说,"使用jmeter做ws压力测试"涵盖了JMeter的使用方法,从配置请求到设定压力测试参数,再到结果分析和性能优化,是一篇深入浅出的教程。对于开发者和测试人员来说,理解并掌握这些知识点对于提升Web服务的...
总的来说,《网络游戏-用于再现网络操作的方法和系统》这一资料深入浅出地介绍了网络游戏开发中的关键技术,对于理解网络游戏背后的复杂运作机制具有重要参考价值。无论是游戏开发者还是对网络技术感兴趣的读者,都...
这些内容不是泛泛而谈,而是结合实际,深入浅出,旨在让读者能够真正理解和掌握。 例如,TCP协议是程序员在面试中经常被问到的知识点。在《图解网络》中,作者小林不仅仅解释了TCP三次握手和四次挥手的过程,还详细...
本篇文章将深入浅出地介绍如何通过一个简单的入门案例来理解和使用Dubbo。 首先,我们要理解Dubbo的核心概念。Dubbo主要提供了服务提供者(Provider)、服务消费者(Consumer)、注册中心(Registry)和监控中心...
《深入浅出简单RPC服务器实现》 在IT行业中,分布式计算和远程过程调用(RPC,Remote Procedure Call)是常见的技术手段,它们使得系统能够跨越网络边界,实现不同服务之间的高效协作。本篇文章将深入探讨如何构建...