RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别
1. 基本概念
PRC
远程过程调用 Remote Procedure Call
,其就是一个节点请求另外一个节点提供的服务。当两个物理分离的子系统需要建立逻辑上的关联时,RPC
是牵线搭桥的常见技术手段之一。除 RPC
之外,常见的多系统数据交互方案还有分布式消息队列、HTTP
请求调用、数据库和分布式缓存等。
本地过程调用:
如果要将本地的对象进行相关操作,可以定义一个方法,然后将相关对象传入,然后对其对象进行更新,然后由函数返回更新后的函数对象。远程过程调用:
在上述过程中,如果其定义的函数是在另外一个服务器端,并且执行的函数体也是在另外一台远程服务器上,那么这个过程就称之为远程过程调用。
2. 调用过程
其调用过程如下所示:
- 首先客户端需要告诉服务器端,需要调用的函数,然后这里的函数和进程
ID
存在一个映射,客户端远程调用的时候,需要查询一下函数,找到对应的ID
,然后执行对应函数的代码。 - 客户端需要把本地参数传递给远程函数,在本地调用的过程中,会通过把参数转换为字节码,然后再传递给服务端,最后服务端再转换为自身可以读取的格式,这是一个序列化和反序列的过程。
- 转换完成数据以后,在进行传输的过程一般是使用
HTTP
,Socket
协议进行传输。
除去 RPC
调用以外,还有 RESTful API
进行调用。RESTful API
调用其示例图如下图所示:
在上图中,一个服务 A 如果访问另外一个服务器下的 B,这个过程采用的就是 RESTful API
进行数据的传输。并且两个过程的数据会进行序列化和反序列化炒作。
两种方式进行对比而言,
RPC
通信代价比较低,因为RPC
是直接基于TCP
进行调用的,并且传输的数据都是基于TCP
进行的,所以效率更高,更优。但是由于是基于TCP
的所以实现起来更为的复杂,更为的难以维护。- 而
RESTful API
由于是直接基于HTTP
的所以实现更为简单,维护更为容易。 RPC
快,效率高,但是不够通用,就好比地方方言,HTTP
通用是普通话,但是效率不够高,传输的字节内容冗余多。REST
相对更规范,更标准,更通用,简单易用,维护性和扩展性都比较好。RPC+Protobuf
采用的是TCP
做传输协议,REST
直接使用HTTP
做应用层协议,这种区别导致REST
在调用性能上会比RPC+Protobuf
低。
Go
语言中常用的 API
风格是 RPC
和 REST
,常用的媒体类型是 JSON
、XML
和 Protobuf
。在 Go API
开发中常用的组合是 gRPC+Protobuf
和 REST+JSON
。
其实业界普遍采用的做法是,内部系统之间调用用 RPC
,对外用 REST
,因为内部系统之间可能调用很频繁,需要 RPC
的高性能支撑。对外用 REST
更易理解,更通用些。当然以现有的服务器性能,如果两个系统间调用不是特别频繁,对性能要求不是非常高,REST
的性能完全可以满足。
HTTP
调用其实也是一种特殊的 RPC
。
HTTP1.0
协议时,HTTP
调用还只能是短链接调用,一个请求来回之后连接就会关闭。HTTP1.1
在 HTTP1.0
协议的基础上进行了改进,引入了 KeepAlive
特性可以保持 HTTP
连接长时间不断开,以便在同一个连接之上进行多次连续的请求,进一步拉近了 HTTP
和 RPC
之间的距离。
当 HTTP
协议进化到 2.0 之后,Google
开源了一个建立在 HTTP2.0
协议之上的通信框架直接取名为 gRPC
,也就是 Google RPC
。
3. 解决问题
总之,RPC
解决掉了在分布式系统之中,服务之间调用的问题。让服务在远程调用的时候,能够像本地调用一样非常方便,并且让调用者感知不到远程调用的具体逻辑。
RPC
只是对底层通信和交互协议的一个封装,便于上层使用。
4. 调用流程
一般来说调用过程如下所示:
- 调用者,以本地调用方式发起调用。
Client stub
客户端收到调用以后,将会把被调用的方法名,参数进行打包编码成为特定的格式,包装成为能够被网络传输的消息体。Client stub
将消息体通过网络发送给服务端。Server stub
将会收到通过网络接收到的消息后按照相应的格式进行拆分,获取方法名称和及其调用传入的参数。- 被调用者
Server
本地调用执行后将会把结果返回给Server stub
。 Server stub
将会将返回值打包编码成为消息,然后通过网络发送给客户端。Client stub
收到消息以后,将会进行拆分,然后返回给CLient
。Client
最终获得本地RPC
调用结果。
RPC 传输控制
对于消息数据的传输,主要有 HTTP
传输和 TCP
传输,一般来说 RPC
使用 TCP
进行传输,因为 TCP
其要优于 HTTP
传输。
传输过程如下图所示:
传输的时候一般通过 Socket
接口进行传输,也有使用 HTTP
作为底层的传输的结果,但是使用 HTTP
传输的比较少。
其过程如下:
Server
发起创建套接字请求。- 创建套接字后绑定相关端口
- 监听链接
- 进入接收连接状态中。
Client
端创建套接字Client
端和Server
端刚刚建立完成的Socket
进行连接的建立。Server
端进行读取,Client
进行数据写。Client
端进行数据读取,- 双方交换完数据以后,关闭连接。
Server
端代码示例:
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("localhost", 8080))
sock.listen(1) # 监听客户端连接
while True:conn, addr = sock.accept() # 接收一个客户端连接print(conn.recv(1024))conn.sendall(b"world") # 将响应发送到发送缓冲 send bufferconn.close()
输出结果
b'hello'
Client
端代码示例:
import socketsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 8080))
sock.sendall(b"hello") # 将消息输出到发送缓冲 send buffer
print(sock.recv(1024))
sock.close()
输出结果
b'world'
问题:客户端疯狂发送请求,但是服务器不读不处理,会发生什么?
- 如果接收和发送队列没有设置大小,服务器处理能力弱,
tcp
会动态调整直至耗尽整个内存; - 设置了大小,
socket
缓冲区满,那么socket
会出现阻塞,不接受发送端的消息; - 如果发送的请求
size
大于发送和接收队列之和,那么会一直阻塞下去;
5. 远程调用时序图
- 本地
RPCTest
类,将会调用ServiceProducer
在服务端注册并启动Server
。 Server
将会调用register
和start
进行初始化应用。RPCTest
将会通过Client
调用本地方法。Client
将会调用远程服务器方法ServiceProducer
并传入本地阐述,将消息发送给Server
端。Server
端放过反射,压入ServerTask
。ServerTask
将会远程执行方法。- 最后调用栈,调用完成以后,将结果返回给
Server
。 Server
通过网络传输信息到Client
。Client
把结果最终返回给RPCTest
。
RPC 笔记(01)— RPC概念、调用流程、RPC 与 Restful API 区别相关推荐
- HTML/CSS学习笔记01【概念介绍、基本标签】
w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...
- 数据挖掘学习笔记01——数据挖掘的基本流程
数据挖掘 前言 数据挖掘01--什么是数据挖掘,能解决什么问题 数据挖掘02--Python的数据结构和基本用法 数据挖掘03--工欲善其事必先利其器 扩展包与Python环境 数据挖掘04--数据学 ...
- 笔记︱利用python + flask制作一个简易本地restful API
原版官网:http://flask-restful.readthedocs.io/en/latest/ 中文官网:http://www.pythondoc.com/Flask-RESTful/quic ...
- RPC与其实现方式概念笔记
一,消息队列服务一般用于设计多系统之间的信息传输,一般这种传输不需要对方对数据做出回应.它最常见的方式是构建异步的生产者-消费者模式.我们在系统开发中,有些业务并不需要及时返回结果,我们可以把这些操作 ...
- photon Unity RPC 调用流程
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...
- Java基础之《netty(30)—RPC调用流程分析》
一.RPC基本介绍 1.RPC(Remote Procedure Call)-远程过程调用,是一个计算机通信协议.该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序无需额外的为这个交互作 ...
- RPC 框架梳理——RPC使用方的调用流程梳理
背景 myrpc是基于protobuf开发的远程调用框架,对于rpc服务,在proto文件中的定义如下: 经过protoc编译后,会生成两个类:UserServiceRpc 和 UserServ ...
- RPC系列:基本概念
RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. RPC 是一种技术思想而非一种规范或协议,常见 RPC ...
- 理解RPC和LPC的概念
一直以来对于RPC的概念就是远程调用,缺乏深入的理解,现有利用业余时间做一些了解. RPC是"远程过程调用(Remote Procedure Call)"的缩写,最早开始是出现在S ...
最新文章
- Window.Show()和Window.ShowDialog()区别
- SQL Server中CROSS APPLY和OUTER APPLY的应用详解
- spring 通过编程来获取属性文件
- java startswith忽略大小写_Java String startsWith()方法与示例
- -Git Linux vi/vim 命令 按键 MD
- DSP F28335的SCI模块
- C语言-动态内存管理
- matlab sort对矩阵某一维进行排序并记录之前索引
- 行内元素,块级元素,各自特点及其相互转化
- element ui select设置不显示不存在的项_appium—等待时间设置方法
- 中表名字必须大写吗_pi network改名字的重要性—非常之重要!!
- Vmware Ubuntu 开机蓝屏
- Spring AOP前置通知和后置通知
- window7DOS常用命令
- 【黑苹果 Hackintosh】Delll成就5468(Vostro 5468)黑苹果
- 面向对象基础实战——飞机大战
- xdb 服务_localhost 8080 XDB服务器需要用户名和密码的问题
- 如何使用Arduino和R305制作指纹考勤系统
- AWS ARN 学习
- python实现微信自动投票_Python——开发一个自动化微信投票器【附代码实例方法】...
热门文章
- linux修改mysql密码sa_如何修改SA口令,数据库SA密码怎么改?
- ANSYS2020R2 Workbench汉化及高分屏适配
- IP SOC与Camera ISP
- 活动识别API服务开发
- Python分析离散心率信号(中)
- 新兴内存技术准备突围
- 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️
- [JAVA EE] JPA 技术实践:完成增、删、改、查操作
- C++ new 的使用
- This Gradle plugin requires a newer IDE able to request IDE model level 3.For Android Studio this