【RPC #0】关于RPC的一些事
关于RPC的一些事
定义先给出来
In distributed computing, a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared computer network), which is written as if it were a normal (local) procedure call, without the programmer explicitly writing the details for the remote interaction. That is, the programmer writes essentially the same code whether the subroutine is local to the executing program, or remote.
维基百科给的:在分布式计算中,远程过程调用(RPC)是指计算机程序在不同的地址空间(通常是在共享计算机网络上的另一台计算机上)执行过程(子程序),其编写方式与普通(本地)过程调用相同,程序员无需明确编写远程交互的细节。 也就是说,无论子程序是在执行程序的本地还是远程,程序员编写的代码基本相同。
也就是说,我们能调用在同一个网络下的另外一台机器中提供的代码,或者说服务
一些问题
为什么要调用远程服务?
为什么不直接在本地封装一个需要使用的方法,而是跑到另外一台机器上去调用?(或者说去另外一台机器上去写这么一个方法)
这里主要涉及到了系统之间的功能划分
假设我们在本机运行的程序主要负责计算数据,过程中需要查询获取数据,那么这部分就不是本机的程序应该负责的,这时就需要去调用远程的机器上的查询服务来拿数据。
再延伸一下,实际上这种"计算服务"应该也会是以远程的方式提供,那么就变成了:客户端要计算---RPC--->服务端的计算服务---RPC--->另一台设备的数据库查询服务
没错,这样做可以降低单个系统的复杂度,也就是解耦(降低耦合度)
HTTP?
在上面的延伸讨论中,第一次使用RPC的过程有点“请求-响应”内味,这不就是HTTP吗?
广义上来讲,HTTP就是RPC,的一种实现方式
RPC(Remote Procedure Call,远程过程调用)是一种思想或设计模式。
作为一种设计模式,RPC包含以下几个重要组件:
- 客户端: 发起远程调用的部分。客户端调用本地的“代理”函数,这个函数会将调用请求打包并通过网络发送给远程服务器。
- 服务器: 提供实际远程过程或服务的部分。服务器接收请求、解包请求数据、调用本地方法,并将结果返回给客户端。
- 代理(或存根/桩): 这是一个中间层,客户端和服务器都拥有它。客户端代理负责将本地调用转换为远程请求,服务器代理负责将远程请求转换为本地调用。这种代理模式使得调用过程对客户端透明。
- 通信协议: 定义了客户端和服务器之间如何传输请求和响应。可以使用多种协议实现,如TCP、UDP、HTTP等。
- 序列化/反序列化: 因为数据需要通过网络传输,RPC框架通常会对请求和响应的数据进行序列化和反序列化。例如,gRPC使用Protocol Buffers进行序列化,JSON-RPC使用JSON格式。
狭义上来讲,RPC多指代一些框架,比如gRPC等
面试官如果问:HTTP和RPC的区别,那么他们可能更多的是想听你说gRPC之类的框架和HTTP协议在运行时候的差异
你刚刚说了序列化对吧?
是的,远程调用难免会涉及到数据包的一个封装操作
所谓的封装,也就是把程序在计算机内存中产生的一些数据结构给转换成可以进行传输的一些数据形式
传输使用的数据形式一般是纯文本,或者byte数组
传到远程机器上之后,我们要将这些数据恢复到内存中进行使用
那这个过程学名就是序列化/反序列化
常见的序列化方式比如:JSON、XML这些(文本序列化)
但是在高效的系统中,一般不用上述方式,可能会用一些更有效的,例如protobuf
RPC的性能影响因素
这个问题太进阶了,只能简单提一下(因为展开有很多学问,而我没有学问)
主要的两点:序列化过程和网络IO