RPC实战与核心原理(一)
什么是RPC?
RPC全称Remote Procedure Call,远程过程调用。远程肯定是指要跨机器而非本机,所以需要网络编程才能实现。rpc帮助我们冰壁网络编程细节,实现调用远程方法就跟调用本地一样的体验。 rpc的作用体现在这两方面:
- 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
- 隐藏底层网络通信的复杂性
RPC通信流程
RPC常用于业务系统之间的数据交互,需要保证其可靠性,所以RPC一般默认采用TCP
协议来传输。RPC和HTTP协议一样,是应用层协议,建立在TCP之上的。
网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象,所以需要把这些对象通过可逆的转换算法,转成二进制,这个过程一般叫做"序列化"。根据协议格式,服务提供方将二进制的消息体逆向还原成请求对象,这个过程就叫做"反序列化"。
服务提供方根据反序列化出来的请求对象找到对应的实现类,完成真正的方法调用,然后把执行结果序列化后,回写道对应的TCP
通道里面。调用方获取到应答的数据包后,再反序列化成应答对象,这样调用方就完成了一次RPC
调用。
由服务提供者给出业务接口生命,在调用方的程序里面,RPC框架根据调用的服务接口提前生成动态代理实现类,并通过依赖注入等技术注入到声明了该接口的相关业务逻辑里面。该dialing实现类回拦截所有的方法调用,在提供的方法处理逻辑里面完成一整套的远程调用, 并把远程调用结果返回给调用方,这样调用方在调用远程方法的时候就获得了像调用本地接口一样的体验。 到这里,一个简单版本的RPC框架就实现了。
常用的序列化
json
JSON是典型的Key-Value方式,没有数据类型,是一种文本型序列化框架,应用非常广泛,无论是前台Web用Ajax调用、磁盘存储文本类型的数据,还是基于HTTP
协议的RPC
框架通信,都会选择JSON格式。
但用JSON进行序列化会有两个问题:
- JSON惊醒序列化的额外空间开销比较大,对于大数据量服务意味着需要巨大的内存和磁盘开销;
- JSON没有数据类型,在强类型语言里需要通过反射同意剞劂,所以性能不会太好。
Protobuf
Protobuf是Google公司内部的混合语言数据标准,是一种轻便、搞笑的的结构化数据存储格式,可以用于结构化数据序列化,支持多种编程语言。Protobuf使用的时候需要定义IDL,然后使用不同语言的IDL编译器,生成序列化工具类。
它的优点是:
- 序列化后体积相比JSON小很多;
- IDL能清晰的表述语义,所以足以帮助并保证应用程序之间的类型不会丢失,无需类似XML解释器;
- 序列化反序列化速度很快,不需要通过反射获取数据类型;
- 消息格式升级和兼容性不错,可以做到向后兼容;
RPC框架在使用时需要注意哪些问题
如何选择序列化
选择序列化的要考虑的点首先是序列化与返学劣化的性能和效率,还有空间开销,也就是序列化之后的二进制数据的体积大小。序列化后的字节数据体积越小,网络传输的数据量就越小,传输数据的速度也就越快。
还有就是序列化协议的通用性和兼容性。