定义
Thrift:一种提供跨语言的”远程过程调用“服务。用户只需要使用 IDL(Interface Definition Language)描述好接口函数,各个语言的 Thrift 服务会将 IDL 描述的接口文件翻译成各个语言版本,提供跨语言的接口调用服务。
原理
流程图
thrift的原理就是通过IDL文件定义服务接口,根据IDL生产代码,通过序列化协议和通信协议传输数据,实现远程服务调用
- 使用IDL定义服务接口
- 根据IDL生成接口,包括服务端和客户端代码
- 编写服务端代码,指的是具体的功能代码,步骤二为接口调用代码,开发者根据生成的调用代码编写接口中定义的方法
- 编写客户端代码,开发者根据生成的接口代码编写客户端程序,调用远程服务接口
- 通信协议:thrift 支持多种通信协议,包括二进制、压缩、JSON协议等
- thrift支持多种序列化协议,包括二进制、JSON、XML等
thrift 的特点
好处
- 多语言:多种语言及所有平台。
- 多协议序列化协议:包括二进制协议、JSON、XML协议等,
- 多种网络传输协议:包括 TSocket、TFramedTransport 等
- 高效性: Thrift 支持二进制传输协议,Http只支持标准的文本协议,相对更加高效,数据传输速度更快。
- 便捷性:thrift支持多种语言JavaScript、java、c++、python 等代码生成,简化开发者的工作,而http需要开发者自己编写接口调用的代码。
- 强类型定义:减少类型转换的开销,提高代码的可读性和可维护性。
坏处
- 不支持动态协议,限制了thrift的灵活性
- 繁琐的序列化和反序列化,比较复杂,bug难以排查
- 强类型定义,编写时间长
- 相关问的文档、教程、示例、api 文档很少,初学者入门门槛较高
- RPC 框架没有提供加密、身份验证登安全机制,需要自己实现,数据的安全性、可信任性没有https高
综上,高并发的分布式系统适合用thrift更高效,维护性更高,例如美团外卖、商家、骑手各方的服务调用。https服务更适用于安全性更高的场景,例如,在线支付,密码认证等。
代码编译
根据 thrift 文件的定义,逐行转换为 js 代码(图为 cpp 的,原理相同)
服务注册/发现
通过代理服务进行注册/发现,代理服务除了保存各服务信息之外,还进行心跳检测,保证服务存活,开辟另外的进程进行校验能和主进程功能解耦,提高服务性能
哨兵服务:为了防止代理服务宕机导致的,启用了哨兵服务,当服务器宕机时,会去请求远端的哨兵服务进行服务发现
服务调用
时序图
架构分层
结构化解析
将编译好的js进行结构化解析,提供给用户调用
序列化原理
序列化后的二进制文件是经过约定协议的文件,分段解析协议,进行数据传输
FAQ
RPC与REST有什么区别
REST API 和 RPC 都是在 Server端 把一个个函数封装成接口暴露出去,以供 Client端 调用,不过 REST API 是基于HTTP协议的,REST致力于通过http协议中的POST/GET/PUT/DELETE等方法和一个可读性强的URL来提供一个http请求。而 RPC 则可以不基于 HTTP协议 因此,如果是后端两种语言互相调用,用 RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西),应该也更容易配置。如果是前端通过 AJAX 调用后端,那么用 REST API 的形式比较好(因为无论如何也避不开 HTTP 这道坎)。
RPC与Socket有什么区别?
RPC(远程过程调用)采用客户机/服务器模式实现两个进程之间相互通信。socket是RPC经常采用的通信手段之一,RPC是在Socket的基础上实现的,它比socket需要更多的网络和系统资源。除了Socket,RPC还有其他的通信方法,比如:http、操作系统自带的管道等技术来实现对于远程程序的调用。微软的Windows系统中,RPC就是采用命名管道进行通信。