`
BradyZhu
  • 浏览: 247781 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入浅出 RPC - 浅出篇

 
阅读更多

本文来自本人独立博客,为获得更佳阅读体验,请点击这里

----------------------------------------------------------------------------------------------------


近几年的项目中,服务化和微服务化渐渐成为中大型分布式系统架构的主流方式,而 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 框架为例,分析其需要考虑的实现因素。

分享到:
评论

相关推荐

    flink-rpc-core-1.14.3-API文档-中文版.zip

    赠送jar包:flink-rpc-core-1.14.3.jar; 赠送原API文档:flink-rpc-core-1.14.3-javadoc.jar; 赠送源代码:flink-rpc-core-1.14.3-sources.jar; 赠送Maven依赖信息文件:flink-rpc-core-1.14.3.pom; 包含翻译后...

    rpc-grpc-impl-1.3.8-API文档-中文版.zip

    赠送jar包:rpc-grpc-impl-1.3.8.jar; 赠送原API文档:rpc-grpc-impl-1.3.8-javadoc.jar; 赠送源代码:rpc-grpc-impl-1.3.8-sources.jar; 赠送Maven依赖信息文件:rpc-grpc-impl-1.3.8.pom; 包含翻译后的API文档...

    华北工控工业机箱RPC-205用户手册.pdf

    华北工控工业机箱RPC-205用户手册pdf,华北工控工业机箱RPC-205用户手册:2U高19英寸工业机箱,可上标准机架,符合EIA RS-310C标准. 前面板带有锁操作窗,使操作更加安全. 可清洗防尘网,拆卸方便.

    18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC1

    18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC18--RPC

    json-rpc-for-java

    继《JavaScript高级应用与实践》之后推出的json-rpc-for-java开源代码,是仅仅100行的javascript代码和不到10个java文件实现的超级轻量级的通过 javaScript快速调用java对象并返回任意对象的轻量级框架,并且支持...

    深入浅出gRPC-李林峰.zip

    深入浅出gRPC 李林峰

    dubbo-rpc-webservice-2.8.4

    dubbo-rpc-webservice-2.8.4 dubbo-rpc-webservice-2.8.4

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    jsonrpc-1.0.jar

    jsonrpc-1.0.jar包,JSON-RPC-Java是一个开源Ajax框架,能够让javascript直接调用后台的Java程序

    rpc-grpc-impl-1.3.8-API文档-中英对照版.zip

    赠送jar包:rpc-grpc-impl-1.3.8.jar 赠送原API文档:rpc-grpc-impl-1.3.8-javadoc.jar 赠送源代码:rpc-grpc-impl-1.3.8-sources.jar 包含翻译后的API文档:rpc-grpc-impl-1.3.8-javadoc-API文档-中文(简体)-...

    RPC-client异步收发核心细节

    异步回调和同步回调相比,除了序列化组件和连接池组件,会多...异步回调能提高系统整体的吞吐量,具体使用哪种方式实现RPC-client,可以结合业务场景来选取(对时延敏感的可以选用同步,对吞吐量敏感的可以选用异步)。

    JSON-RPC-Java实例

    JSON-RPC-Java是一个用Java来实现动态JSON-RPC的框架. 利用它内置的一个轻级量JSON-RPC JavaScripIt客户端,可以让你透明地在JavaScript中调用Java代码。JSON-RPC-Java可运行在Servlet容器中如Tomcat也可以运行在...

    flink-rpc-core-1.14.3-API文档-中英对照版.zip

    赠送jar包:flink-rpc-core-1.14.3.jar; 赠送原API文档:flink-rpc-core-1.14.3-javadoc.jar; 赠送源代码:flink-rpc-core-1.14.3-sources.jar; 赠送Maven依赖信息文件:flink-rpc-core-1.14.3.pom; 包含翻译后...

    json-rpc-java-talk-20050225.pdf

    json-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdfjson-rpc-java-talk-20050225.pdf

    libjson-rpc-cpp.tar.gz

    libjson-rpc-cpp.tar.gz属于json开发例程。里面有简单例子可用。

    java 手写rpc框架 rpc-server and rpc-client

    java 手写rpc框架 rpc-server and rpc-client

    JsonRpc-Cpp

    JsonRpc-Cpp - JSON-RPC implementation. * Copyright (C) 2008-2011 Sebastien Vincent * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser ...

    libjson-rpc-cpp.rar

    正常情况下json-rpc-cpp实在linux下编译的,本代码通过修改相关的平台文件可在VS2013下可编译。

    jprotobuf-rpc-http.zip

    jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。现可支持直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译...

Global site tag (gtag.js) - Google Analytics