RPC(Remote Procedure Call, 远程过程调用):是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。
RPC是一种技术思想而非一种规范或协议,常见RPC技术和框架有:
(1). 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
(2). 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
(3). 通信框架:MINA和Netty。
目前流行的开源RPC框架主要有阿里巴巴的Dubbo、Facebook的Thrift、Google的gRPC、Twitter的Finagle等。
RPC框架的重要组成:
(1). 客户端(Client):服务调用方。
(2). 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
(3). 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
(4). 服务端(Server):服务的真正提供者。
(5). Network Service:底层传输,可以是TCP或HTTP。
一次RPC调用流程如下:
(1). 服务消费者(Client客户端)通过本地调用的方式调用服务。
(2). 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体。
(3). 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端。
(4). 服务端存根(Server Stub)收到消息后进行解码(反序列化操作)。
(5). 服务端存根(Server Stub)根据解码结果调用本地的服务进行相关处理
(6). 服务端(Server)本地服务业务处理。
(7). 处理结果返回给服务端存根(Server Stub)。
(8). 服务端存根(Server Stub)序列化结果。
(9). 服务端存根(Server Stub)将结果通过网络发送至消费方。
(10). 客户端存根(Client Stub)接收到消息,并进行解码(反序列化)。
(11). 服务消费方得到最终结果。
RPC要解决的两个问题:
(1). 解决分布式系统中,服务之间的调用问题。
(2). 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。
RPC的核心并不在于使用什么协议。RPC的目的是让你在本地调用远程的方法,而对你来说这个调用是透明的,你并不知道这个调用的方法是部署哪里。通过RPC能解耦服务,这才是使用RPC的真正目的。RPC的原理主要用到了动态代理模式,至于HTTP协议,只是传输协议而已。在RPC中可选的网络传输方式有多种,可以选择TCP协议、UDP协议、HTTP 协议。
简单的说,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。RPC会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯),RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式),RPC在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。
RPC采用客户机/服务器模式:请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需用通过网络来表达调用的语义和传达调用的数据,执行过程如下图所示,无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用时需要使用RPC。
进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法。进程是计算机系统分配资源的最小单位。每个进程都有自己的一部分独立的系统资源,彼此是隔离的。为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信。这些进程可以运行在同一计算机上或网络连接的不同计算机上。进程间通信技术包括消息传递、同步、共享内存和远程过程调用。IPC是一种标准的Unix通信机制。有两种类型的进程间通信(IPC):
(1). 本地过程调用(LPC):用在多任务操作系统中,使得同时运行的任务能互相会话。这些任务共享内存空间使任务同步和互相发送信息。
(2). 远程过程调用(RPC):RPC类似于LPC,只是在网上工作。
RPC主要用于公司内部的服务调用,性能消耗低,传输效率高,实现复杂。HTTP主要用于对外的异构环境,浏览器接口调用,App接口调用,第三方接口调用等。
RPC使用场景(大型的网站,内部子系统较多、接口非常多的情况下适合使用RPC):
(1). 长链接:不必每次通信都要像HTTP一样去3次握手,减少了网络开销。
(2). 注册发布机制:RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
(3). 安全性:没有暴露资源操作。
(4). 微服务支持:就是最近流行的服务化架构、服务化治理,RPC框架是一个强力的支撑。
注:以上内容均来自网络整理,主要参考:
1. https://mp.weixin.qq.com/s/UYL8yD9lusl3ELPSiIDk_A
2. https://www.zhihu.com/question/25536695
3. https://www.jianshu.com/p/b0343bfd216e
4. https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html
以下是使用python3实现的简单的客户端、服务器简单测试代码:
test_server_1.py内容如下:
from xmlrpc.server import SimpleXMLRPCServer
class MyFuncs:
def add(self, a, b):
return a + b
if __name__ == "__main__":
s = SimpleXMLRPCServer(("localhost", 8000))
s.register_instance(MyFuncs())
print("server is online ...")
s.serve_forever()
test_client_1.py内容如下:
import xmlrpc.client
s = xmlrpc.client.ServerProxy("http://localhost:8000")
print("sum:", s.add(2, 3))
执行结果如下:
GitHub:https://github.com/fengbingchun/Python_Test