RPC 原理图
下面的两张原理图是一样的。从第一张原理图中可以看到 rpc 传输过程中使用的传输协议,从第二张原理图中 sockets
是在 Kernel
中,也就是在操作系统的内核中。
文章图片
文章图片
什么是RPC??
远程过程调用。一个服务器使用另一台服务器上的提供的服务或方法。
RPC 解决的什么问题??
让分布式或微服务系统中不同服务之间的调用像本地调用一样简单。
为什么要使用 RPC??
因为两个服务器不是同一个操作系统,也不在一个内存空间,所以不能直接调用,需要通过网络来传递数据。
RPC 怎么解决通信??
在客户端和服务器之间建立 TCP 连接,rpc 所有传输的数据都在 TCP 连接中传输。连接可以是按需连接,调用结束后就断开,也可以是和长连接,多个rpc 共享同一个连接。
因为客户端和服务器是通过网络进行传输的,所以需要一个传输层,把函数id和序列化后的参数传递给服务器,并把序列化后的调用结果传回客户端。所以 TCP(大部分框架使用)和UDP都可以,也可以使用 http2(grpc使用)
RPC 怎么解决寻址的问题??
客户端上的应用告诉 rpc 框架,服务器的主机/IP地址、端口号、方法名称,这样就可以完成调用。
网络协议是基于二进制的,内存中的参数的值需要序列化成二进制的形式。
服务器收到请求后,要对参数进行反序列化,把二进制变成内存中的参数,把参数恢复成内存中的表达方式,然后找到对应的方法(寻址的一部分),进行本地调用,得到返回值。
服务器将返回值(序列化后)发给客户端,客户端收到返回值后,进行反序列化,然后传递给它上面的应用。
java的序列化方式:json。
RPC 和 socket 的区别??
socket是两个主机不同进程之间进行通信的方式。
rpc 是建立在 socket 之上的。rpc 通过 socket 实现通信, 也可以不用 socket,而使用其他的通信方式,比如命名管道(windows系统中)。
RPC 和 HTTP 的联系和区别??
【RPC基础概念问答】http 协议是应用层的协议。http 是实现 rpc 的一种方式。可以使用 http 协议,也可以使用 TCP / UDP 协议。
推荐阅读
- comunicate|python gRPC (1)
- 架构|使用 gitlab 实现 proto 文件的 semantic version 管理(1) - 使用规范
- golang|golang的RPC调用Java方法
- gRPC|你不知道的gRPC反向代理
- golang|从go原生rpc库源码探察rpc机制
- go|go gRPC初体验(win10+普通网络)