远程过程调用RPC简介

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。

远程过程调用RPC简介_第1张图片

进程间通信(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

你可能感兴趣的:(Python)