RPC原理及其调用过程

article/2025/9/26 16:54:38

RPC原理及其调用过程

远程过程调用,简称为RPC,是一个计算机通信协议,它允许运行于一台计算机的程序调用另一台计算机的子程序,而无需额外地为这个交互作用编程。

RPC与传统的HTTP对比

优点:

  1. 传输效率高(二进制传输)

  2. 发起调用的一方无需知道RPC的具体实现,如同调用本地函数般调用

缺点:

  1. 通用性不如HTTP好(HTTP是标准协议)

总结:RPC适合内部服务间的通信调用;HTTP适合面向用户与服务间的通信调用

 

RPC调用过程如下:

 

  1. 调用者(客户端Client)以本地调用的方式发起调用;
  2. Client stub(客户端存根)收到调用后,负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体;
  3. Client stub将消息体通过网络发送给服务端;
  4. Server stub(服务端存根)收到通过网络接收到消息后按照相应格式进行拆包解码,获取方法名和参数;
  5. Server stub根据方法名和参数进行本地调用;
  6. 被调用者(Server)本地调用执行后将结果返回给server stub;
  7. Server stub将返回值打包编码成消息,并通过网络发送给客户端;
  8. Client stub收到消息后,进行拆包解码,返回给Client;
  9. Client得到本次RPC调用的最终结果。

 

对于RPC调用流程的实现,抛开调用方与被调用方,其核心主要是:消息协议传输控制的实现 

(1). RPC消息协议:客户端调用的参数和服务端的返回值这些在网络上传输的数据以何种方式打包编码和拆包解码

 RPC的消息协议在设计时主要要考虑,消息转换及传输的效率,为解决消息转换及传输的效率,可以以二进制的方式传输消息,使用原始的二进制传输可以省去中间转换的环节并减少传输的数据量。

在Python中可以使用struct模块对二进制进行编码和解码:

struct.pact将其它类型转换为二进制,通常用于消息长度的转换:

import struct# 将整数2转换成适用网络传输的无符号的4个字节整数
>>> struct.pack('!I', 2)
'\x00\x00\x00\x02'

 struct.unpack将二进制类型转换为其它类型:

byte_data = '\x00\x00\x00\x02'
# 将2对应的二进制 转换为十进制整数 返回结果是个元组
>>> struct.unpack('!I',byte_data)
(2,)

 

 (2). RPC传输控制

 对于消息数据的传输,主要有HTTP传输和TCP传输,鉴于TCP传输的可靠性,RPC的传输一般使用TCP作为传输协议

在TCP传输中客户端与服务端通过socket进行通信,通信流程:

 

RPC使用TCP进行传输控制的实现

 1 import socket
 2 
 3 class Channel(object):
 4     """
 5     与客户端建立网络连接
 6     """
 7 
 8     def __init__(self, host, port):
 9         self.host = host  # 服务器地址
10         self.port = port  # 服务器端口
11 
12     def get_connection(self):
13         """
14         获取一个tcp连接
15         """
16         sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
17         sock.connect((self.host, self.port))
18         return sock
19 
20 
21 class Server(object):
22     def __init__(self, host, port, handlers):
23         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
24         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
25         self.host = host
26         self.port = port
27         self.sock.bind((host, port))
28         self.handlers = handlers
29 
30     def serve(self):
31         """
32         开启服务器运行,提供RPC服务
33         """
34         # 开启服务监听,等待客户端连接
35         self.sock.listen(128)
36         print("开始监听")
37         while True:
38             # 接收客户端的连接请求
39             conn, addr = self.sock.accept()
40             print("建立连接{}".format(str(addr)))
41 
42             # 创建ServerStub对象,完成客户端具体的RPC调用
43             stub = ServerStub(conn, self.handlers)
44             try:
45                 while True:
46                     stub.process()
47             except EOFError:
48                 # 表示客户端关闭了连接
49                 print("客户端关闭连接")
50             # 关闭服务端连接
51             conn.close()

 

通过Socket使得RPC客户端与服务器进行通信

 1 TCP服务端
 2 sock = socket.socket()  # 创建一个套接字
 3 sock.bind()  # 绑定端口
 4 sock.listen()  # 监听连接
 5 sock.accept()  # 接受新连接
 6 sock.close()  # 关闭服务器套接字
 7 
 8 
 9 TCP客户端
10 sock = socket.socket()  # 创建一个套接字
11 sock.connect()  # 连接远程服务器
12 sock.recv() #
13 sock.send()  #
14 sock.sendall()  # 完全写
15 sock.close()  # 关闭

 

RPC服务的实现:为了能让RPC服务器同时处理多个客户端的请求,提升性能,可以采用多线程、多进程方式实现,下面分别介绍这两种方式实现的RPC服务

多线程RPC服务:

 1 class ThreadServer(object):
 2     """
 3    多线程RPC服务器
 4     """
 5 
 6     def __init__(self, host, port, handlers):
 7         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 9         self.host = host
10         self.port = port
11         self.sock.bind((host, port))
12         self.handlers = handlers
13 
14     def serve(self):
15         """
16         开始服务
17         """
18         self.sock.listen(128)
19         print("开始监听")
20         while True:
21             conn, addr = self.sock.accept()
22             print("建立链接{}".format(str(addr)))
23             t = threading.Thread(target=self.handle, args=(conn,))
24             t.start()
25 
26     def handle(self, client):
27         stub = ServerStub(client, self.handlers)
28         try:
29             while True:
30                 stub.process()
31         except EOFError:
32             print("客户端关闭连接")
33 
34         client.close()

多进程RPC服务:

 1 class MultiProcessServer(object):
 2     """
 3    多进程服务器
 4     """
 5 
 6     def __init__(self, host, port, handlers):
 7         self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 8         self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 9         self.host = host
10         self.port = port
11         self.sock.bind((host, port))
12         self.handlers = handlers
13 
14     def serve(self):
15         """
16         开始服务
17         """
18         self.sock.listen(128)
19         print("开始监听")
20         while True:
21             conn, addr = self.sock.accept()
22             print("建立链接{}".format(str(addr)))
23             t = Process(target=self.handle, args=(conn,))
24             t.start()
25 
26     def handle(self, client):
27         stub = ServerStub(client, self.handlers)
28         try:
29             while True:
30                 stub.process()
31         except EOFError:
32             print("客户端关闭连接")
33 
34         client.close()
posted @ 2019-01-14 11:01 Harvard_Fly 阅读( ...) 评论( ...) 编辑 收藏

http://chatgpt.dhexx.cn/article/FdIduZf0.shtml

相关文章

用简单的方式去描述RPC原理

接下来我们就讲RPC:远程过程调用。其实RPC仅仅是一个概念,RPC没有协议没有框架,平时我们说的RPC框架其实是简称,很多人被带偏了,以为RPC是一个协议或者是框架,所以你以后如果听到RPC框架,你要立…

RPC核心原理是什么?以及常用技术有哪些?

前面一篇文章有提到过RPC,那么RPC是什么呢? RPC(Remote Procedure Call),代表远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。使用RPC可以解…

RPC框架原理简介

什么是RPC框架? RPC,全称为Remote Procedure Call,即远程过程调用,是一种计算机通信协议。 比如现在有两台机器:A机器和B机器,并且分别部署了应用A和应用B。假设此时位于A机器上的A应用想要调用位于B机器上…

RPC通信原理

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、RPC是什么?二、RPC原理总…

RPC框架面试总结-RPC原理及实现

一、什么是RPC RPC是远程调用过程的简写,是一个协议,处于网络通信协议的第五层:会话层,其下就是TCP/IP协议,在建立在其基础上的通信会话协议。RPC定义了交互的模式,而应用程序使用这些模式,来访…

RPC原理与FastRPC实现

0. 起因 最近看文档,发现一些组件是通过FastRPC来进行沟通的,并且偶尔看到某些场景下在FastRPC上的时间消耗好像也蛮可观,恰好FastRPC是开源的,因此决定看看FastRPC具体的实现。 1. RPC简介 当初在学Java的时候,初遇…

RPC原理详解

转自:http://www.cnblogs.com/metoy/p/4321311.html RPC 功能目标 RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。 为实现该目标,RPC 框架需提供一种透…

RPC原理介绍

面向服务架构SOA 任何大型网站的发展都伴随着网站架构的演进。网站架构一般最初是单应用设计,然后逐渐经历面向对象设计和模块化设计的架构,最终发展到面向服务的服务化架构。在单应用设计架构体系当中,我们关注的是方法和实体;而…

RPC 原理与实现

文章目录 1. RPC 简介1.1 什么是RPCReference: LPC & IPC (本地过程调用) 1.2 为什么要用RPC1.2.1 系统架构的演进1.2.2 Web 服务的技术结构1.2.2 SOAP ( Simple Object Access Protocol)1.2.2 REST(Representational State Transfort&am…

RPC核心原理

了解RPC RPC全称Remote Procedure Call,即远程过程调用.其中远程需要跨机器,跨机器需要可靠的网络编程技术实现,无论是Java原生的网络编程模型还是Netty都会让代码中出现大量与业务无关的网络编程代码,RPC技术则是为了解决这个问题的.它帮助我们屏蔽网络编程的细节,实现调用远…

RPC原理(1)之深入RPC原理简介

一、RPC调用原理图 下面这张图是我们微服务一次Http调用请求图: 首先在请求的过程中我们知道是有三次握手,四次挥手的流程,具体流程如下: 1.浏览器请求服务器(订单服务),请求建立连接,首先客户端向服务器…

RPC原理简述

RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。 RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有: 应…

RPC核心原理详解

什么是RPC? RPC的全称是Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机,所以需要用到网络编程才能实现,但是不是只要通过网络通信访问到另一台机器的应用程序&#xff0c…

RPC原理

RPC就是远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。 原理 一个完整的RPC主要包括三部分: 服务注册中心(Registry),负责将本地服务发布成远程服务,管理远…

从零开始实现RPC框架 - RPC原理及实现

RPC概述 RPC(Remote Procedure Call)即远程过程调用,允许一台计算机调用另一台计算机上的程序得到结果,而代码中不需要做额外的编程,就像在本地调用一样。 现在互联网应用的量级越来越大,单台计算机的能力有限,需要借…

RPC介绍与原理

RPC介绍与原理 RPC介绍 RPC是什么 RPC(Remote Procedure Call)是一种进程间通信方式。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景。说起 RPC 大家并不陌生…

RPC理论原理

目录 集群和分布式RPC通信原理 集群和分布式 集群:每一台服务器独立运行一个工程的所有模块。 分布式:一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务…

一文搞懂RPC原理

了解RPC: RPC(Remote Procedure Call Protocol)——远程过程调用协议: 一般用于实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地资源一样,通过网络传输去访问远端系统资源。 描述&…

rpc简介及原理

1.RPC简介及原理介绍 RPC技术内部原理是通过两种技术的组合来实现的:本地方法调用 和 网络通信技术。 1.1 RPC简介 在上述本地过程调用的例子中,我们是在一台计算机上执行了计算机上的程序,完成调用。随着计算机技术的发展和需求场景的变化…

RPC原理解析

1.RPC原理解析 1.1 什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP/IP或UDP,为通信程序…