远程函数调用,Remote Procedute Calls,简称RPC。RPC需要解决的问题有:完成远程函数的映射,并且将数据转化为字节流,使用网络进行传输
RPC基本概念
IDL文件:IDL通过一种中立的方式来描述接口,使得不同平台上运行的对象和用不同语言编写的程序可以相互通信
生成代码:通过编译工具将IDL文件转换成语言对应的静态库
编解码:从内存中表示到字节序列的转化称之为编码,反之为解码,常称之为序列化和反序列化
通信协议:规范了数据在网络中传输的内容和格式,除了必要的响应请求数据外,通常还会包含额外的元数据
RPC的好处在于:
函数职责单一,有利于分工协作和运维开发
可扩展性强,可以独立扩充资源,资源使用率更优秀
故障隔离,单个服务故障不影响整体,服务的整体可用性更高
但是RPC也带来一定的挑战:
如果调用的函数所属的服务宕机应该如何处理
调用过程中网络异常,如何保证消息可达
请求量突增导致服务无法及时处理,如何应对
这些问题一般由RPC框架来解决
其中IDL可采用的文件数据格式有:
语言特定格式:许多编程语言都内建了将内存对象编码为字节序列的支持,比如Java的java.io.Serializable序列化格式。缺点是和语言深度绑定了
文本格式:JSON\XML\CSV等,具有人类可读性,但是描述不够严谨,而且缺乏模型约束,只能采用文档约束
二进制编码:具有跨语言和高性能等优点,比如说Thrift的BinaryProtocal等