了解RPC框架|青训营

86 阅读3分钟

一.RPC框架的定义

​ RPC框架主要沿着两条路线发展,一个是目标为了跨语言,服务端可以用不同的语言实现,客户端也可以用不同的语言实现,不同的语言实现的客户端和服务器端可以互相调用。很显然,要支持不同的语言,需要基于那种语言实现相同协议的框架,并且协议设计应该也是跨语言的,其中比较典型的是 GRPC,基于同一个IDL,可以生成不同语言的代码,并且语言的支持也非常的多。RPC即远程过程调用协议,客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。

1.本地函数调用

下列代码中主函数部分首先将 a 和 b 的值压栈,通过函数指针找到 calculate 函数,进入函数取出栈中的值 2 和 3,将其赋予 x 和 y,计算 x *y ,并将结果存在 z中。将z 的值压栈,然后从 calculate 返回,从栈中取出 z 返回值,并赋值给 result。

func main(){
   var a=2
   var b=3 
   result := calculate(a, b)
   fmt.Printin(result)
   return
}

func calculate(x, y int) {
    z := X*y
    return z
}
2.远程函数调用

我们在淘宝网购物的过程中,支付服务怎么知道我们要调用付款这个函数,而不是退款或者充值呢?在本地调用中,函数体是直接通过函数指针来指定的,我们调用哪个方法,编译器就自动帮我们调用它相应的函数指针。但是在远程调用中,函数指针是不行的,因为两进程的地址空间是完全不一样的。所以函数都有自己的一个ID,在做 RPC的时候要附上这个 ID,还得有ID 和函数的对照关系表,通过 ID找到对应的函数并执行。

3.RPC概念模型

​ 根据 Nelson在1984年 发表的论文《Implementing Remote Procedure Calls》,其中提到 RPC 的过程由 5个模型组成: User、User-Stub、RPC-Runtime、Server-Stub、Server。它们之间的关系如图所示。

RPCmodel.png

二.RPC执行的完整过程

远程调用过程需要服务双方通过约定规范,具体调用一共有以下五步。首先双方需要可以相互依赖的IDL 文件,IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序,通过编译器工具把IDL 文件转换成语言对应的静态库,从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化,规范了数据在网络中的传输内容和格式。必须包含请求/响应数据外,通常还会含有额外的元数据,最后基于网络库走TCP/UDP协议。

rpcmodel2.png

三.RPC的优缺点

1.优点

单一职责,有利于分工协作和运维开发。可扩展性强,资源使用率更优。故障隔离,服务的整体可靠性更高。

2.缺点

服务易宕机,对方难以处理。在调用的时候会发生网络异常,消息未必可达。请求量突然剧增服务无法及时处理。