【RPC】01 —— 什么是RPC
1. 什么是RPC?
RPC(remote procedure call,远程过程调用),它帮助我们屏蔽了远程调用和本地调用的区别,隐藏了底层网络通信的复杂性,从而达到像调用项目内的方法一样调用远程方法。利用 RPC 我们不仅可以很方便地将应用架构从“单体”演进成“微服务化”,而且还能解决实际开发过程中的效率低下、系统耦合等问题,这样可以使得我们的系统架构整体清晰、健壮,应用可运维度增强。RPC 不仅可以用来解决通信问题,它还被用在了很多其他场景,比如: MQ、分布式缓存等
常见的RPC框架
- Dubbo:是阿里集团开源的一个极为出名的 RPC 框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是极其鲜明的特色。
- gRPC:是 Google 公布的开源软件,基于***的 HTTP 2.0 协议,并支持常见的众多编程语言。RPC 框架是基于 HTTP 协议实现的,底层使用到了 Netty 框架的支持。
- Thrift:是 Facebook 的开源 RPC 框架,主要是一个跨语言的服务开发框架。用户只要在其之上进行二次开发就行,应用对于底层的 RPC 通讯等都是透明的。不过这个对于用户来说需要学习特定领域语言这个特性,还是有一定成本的。
2. 一次RPC调用
RPC 是一个远程调用一般采用TCP来传输。调用方将请求参数转换成二进制(序列化),按约定好的协议(包括:协议标识,数据大小,请求类型,序列化类型,消息体等)经过TCP传输给服务的提供方。服务的提供方从TCP管道里接受二进制数据,再根据协议格式,将二进制数据分割出不同的请求,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象(反序列化)。
服务提供方再根据反序列化出来的请求对象找到对应的实现类,完成真正的方法调用,然后把执行结果序列化后,回写到对应的 TCP 通道里面。调用方获取到应答的数据包后,再反序列化成应答对象,这样调用方就完成了一次 RPC 调用
3. RPC核心组成
一个 RPC 的核心功能主要有 5 个部分组成,分别是:客户端、客户端 Stub、网络传输模块、服务端 Stub、服务端等。
- 客户端(Client):服务调用方。
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
- 服务端(Server):服务的真正提供者。
- Network Service:底层传输,可以是 TCP 或 HTTP。