本文来说下rpc相关的知识与概念
远程过程调用似乎是一种有用的范式,用于在以高级语言编写的程序之间提供跨网络的通信。本文描述一个提供了远程调用工具的软件包,面对这样一个软件包时一个设计者拥有的选项,以及我们做出的选择。我们描述了我们的RPC机制的整体结构,用于绑定RPC客户端的工具,传输通信层协议,以及一些性能测量。包括用于实现高性能和最小化集群间负载的一些优化的描述。
远程过程调用(以下称RPC)的概念是非常简单的。它是基于这一观察:过程调用是一个众所周知且易于理解的机制,用于在单个计算机上运行的程序内的控制和数据的传输。因此提出扩展这种机制以提供跨网络的控制和数据的传输。但一个远程程序被调用时,该调用环境会被挂起,参数通过网络传输到该程序被调用的环境中(我们将之称为被调用者),并在那里执行相应的程序。当程序执行结束并产生结果时,结果再被传回调用环境中。此时调用环境中的执行恢复,仿佛是在单机上执行调用一样。当调用环境被挂起时,该机器上的其他进程可能仍然在执行——这取决于该环境的并行性和RPC的实现。
RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。
除 RPC 之外,常见的多系统数据交互方案还有分布式消息队列、HTTP 请求调用、数据库和分布式缓存等。其中 RPC 和 HTTP 调用是没有经过中间件的,它们是端到端系统的直接数据交互。
通俗点说
先说说 RPC 服务的基本架构吧。我们可以很清楚地看到,一个完整的 RPC 架构里面包含了四个核心的组件。
分别说说这几个组件:
RPC调用流程时序图
具体实现步骤:
RPC框架的目标就是把2-10步封装起来,把调用、编码/解码的过程封装起来,让用户像调用本地服务一样的调用远程服务。要做到对客户端(调用方)透明化服务, RPC框架需要考虑解决如下问题:
通讯问题 : 主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
寻址问题: A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。
序列化与反序列化 : 当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。
目前流行的开源 RPC 框架还是比较多的。下面重点介绍三种:
gRPC 是 Google 最近公布的开源软件,基于最新的 HTTP2.0 协议,并支持常见的众多编程语言。
我们知道 HTTP2.0 是基于二进制的 HTTP 协议升级版本,目前各大浏览器都在快马加鞭的加以支持。
这个 RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。
Thrift 是 Facebook 的一个开源项目,主要是一个跨语言的服务开发框架。它有一个代码生成器来对它所定义的 IDL 定义文件自动生成服务代码框架。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
用户只要在其之前进行二次开发就行,对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说的话需要学习特定领域语言这个特性,还是有一定成本的。
Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。 Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用。
同样的远程接口是基于 Java Interface,并且依托于 Spring 框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。
很长时间以来都没有怎么好好搞清楚RPC(即 Remote Procedure Call,远程过程调用)和 HTTP调用的区别,不都是写一个服务然后在客户端调用么?
先说一下他们最本质的区别,就是 RPC 主要是基于 TCP/IP 协议的,而 HTTP 服务主要是基于 HTTP 协议的。
我们都知道 HTTP 协议是在传输层协议 TCP 之上的,所以效率来看的话,RPC 当然是要更胜一筹啦!下面来具体说一说 RPC 服务和 HTTP 服务。
本文介绍了rpc相关的概念与知识,对后续dubbo的学习有极大的帮助,可以对dubbo有更加深入的理解与掌握。