RPC概述
PRC即远程函数调用(Remote Procedure Calls),是一种通过网络从远程计算机程序上请求请求服务,而不需要了解底层网络技术的协议。实现让RPC的客户端认为自己是在调用本地对象。
常用的RPC框架
- Thrift:thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
- gRPC:一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。
- Dubbo:Dubbo是一个分布式服务框架,以及SOA治理方案。其功能主要包括:高性能NIO通讯及多协议集成,服务动态寻址与路由,软负载均衡与容错,依赖分析与降级等。Dubbo是阿里巴巴内部的SOA服务化治理方案的核心框架,Dubbo自2011年开源后,已被许多非阿里系公司使用。
- Spring Cloud:Spring Cloud由众多子项目组成,如Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Consul 等,提供了搭建分布式系统及微服务常用的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等,满足了构建微服务所需的所有解决方案。Spring Cloud基于Spring Boot, 使得开发部署极其简单。
一次RPC的完整过程
- IDL(Interface description language)文件
- IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信
- 生成代码
- 通过编译工具把IDL文件转换成语言对应的静态库
- 编解码
- 从内存中表示到字节序列的转换称为编码,反之称为解码,也叫序列化和反序列化
- 通信协议
- 规范了数据在网络中的传输内容和格式。除了必须的请求、响应数据外,通常还包含额外的元数据
- 网络传输
- 通常基于成熟的网络库走TCP/UDP传输
PRC的好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可靠性更高
分层设计
Apache Thrift的分层设计
编解码层
- 服务端与客户端依赖同一份IDL文件,生成对应语言的代码
- 数据格式
- 语言特定的格式,许多编程语言都有序列化的支持
- 文本格式,JSON、XML、CSV等,具有人类可读性
- 二进制编码,具备跨语言和高性能等优点,如Thrift的BinaryProtocol,Protobuf等
- 二进制编码
- 可以使用TLV编码,Tag-Lenght-Value,其中Value也可以是个TLV结构,也就是TLV可以嵌套使用。
- 选型
- 兼容性。支持自动增加新的字段,而不影响老的服务,这将提高系统的灵活度
- 通用性。支持跨平台,跨语言。
- 性能。从空间和时间两个维度来考虑,也就是编码后数据大小和编码耗费时长
协议层
-
协议构造。
- LENGTH:数据包大小,不包含自身
- HEADER MAGIC:标识版本信息,协议解析时候快速校验
- SEQUENCE NUMBER:表示数据包的seqID,可用于多路复用,单连接内递增
- HEADER SIZE:头部长度,从第14个字节开始计算一直到PAYLOAD前
- PROTOCOL ID:编解码方式,有Binary和Compact两种
- TRANSFORM ID:压缩方式,如zlib和snappy
- NFO ID:传递一些定制的meta信息
- PAYLOAD:消息体
-
协议解析
网络通信层
- 网络库
- 提供易用API。封装底层Socket API,连接管理和事物分发
- 功能。协议支持:TCP、UDP和UDS等,以及退出、异常处理等
- 性能。应用层buffer减少copy,高性能定时器、对象池等