RPC是什么

什么是RPC

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。
RPC 是一种设计,就是为了解决不同服务之间的调用问题,完整的 RPC 实现一般会包含有传输协议序列化协议这两个。

实际中RPC的运用

我们在做一个访问量不大的项目的时候,一台服务器部署上一个应用+数据库也就够了。

那么访问量稍微大一点之后呢,为了解决用户反馈的卡,反应慢的情况,我们就上集群。架设nginx,部署多个服务,由nginx负责把请求转发到其他服务上,这样就解决了用户说的卡慢问题。

过了一段时间之后呢,我们发现数据库已经扛不住了,应用服务完好,数据库有时候宕机.。那这个时候呢,我们就上数据库读写分离,再架设几台数据库服务器,做主从,做分库分表。然后数据库也不宕机了,服务又恢复了流畅.

又过了一段时间,公司事业增增日上,服务访问量越来越高,且大部分都是查询,吸取之前宕机且为了办证数据库的健壮性,我们这个时候又加上了缓存,把用户高频次访问的数据放到缓存里。

后来,项目功能越来越多,整个项目也愈发庞大,修改一个类就需要全盘上传,切换nginx重启,这样的发布流程越来越长,越来越繁杂。然后我们开始把模块拆分,用户信息分个项目,订单系统分一个项目。这样就达到了,用户模块代码修改的时候,只需要更新用户信息服务就好了。但是还是需要切换顶层的nginx。把要重启的服务的流量切到可用服务上。这个时候我们就想到了RPC。

所有的服务在启动的时候注册到一个注册机里面,然后顶层处理在接收到nginx的请求时,去注册机找一个可用的服务,并调用接口。这样子呢,在不加新功能的时候,顶层处理服务我们就不需要动了?那修改了用户信息项目的时候,我们只需要一个个更新用户信息项目的服务群就好了。

为什么要使用RPC

就是无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同的系统间的通讯,甚至不同的组织间的通讯。由于计算能力需要横向扩展,需要在多台机器组成的集群上部署应用,RPC的协议有很多,比如最早的CORBA,Java RMI,Web Service的RPC风格,Hessian,Thrift,甚至Rest API。

RPC就是要像调用本地的函数一样去调远程函数。

在远程调用时,我们需要执行的函数体是在远程的机器上的,也就是说,函数体是在另一个进程中执行的。这就带来了几个新问题:

  1. Call ID映射
    如何告诉远程机器我们要调用Add方法,而不是其他方法?在本地调用中,函数体是直接通过函数指针来指定的。但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有自己的一个ID。这个ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,必须附上这个ID。然后我们还需要在客户端和服务端分别维护一个 {函数 <–> Call ID} 的对应表。两者的表不一定需要完全相同,但相同的函数对应的Call ID必须相同。当客户端需要进行远程调用时,它就查一下这个表,找出相应的Call ID,然后把它传给服务端,服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  2. 序列化和反序列化
    客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。甚至有时候客户端和服务端使用的都不是同一种语言(比如服务端用C++,客户端用Java或者Python)。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。这个过程叫序列化和反序列化。同理,从服务端返回的值也需要序列化反序列化的过程。
  3. 网络传输
    远程调用往往用在网络上,客户端和服务端是通过网络连接的。所有的数据都需要通过网络传输,因此就需要有一个网络传输层。网络传输层需要把Call ID和序列化后的参数字节流传给服务端,然后再把序列化后的调用结果传回客户端。只要能完成这两者的,都可以作为传输层使用。因此,它所使用的协议其实是不限的,能完成传输就行。尽管大部分RPC框架都使用TCP协议,但其实UDP也可以,而gRPC干脆就用了HTTP2。Java的Netty也属于这层的东西。

链接: 通俗的语言解释一下什么是 RPC 框架?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值