node thrift

1,091 阅读4分钟

定义

Thrift:一种提供跨语言的”远程过程调用“服务。用户只需要使用 IDL(Interface Definition Language)描述好接口函数,各个语言的 Thrift 服务会将 IDL 描述的接口文件翻译成各个语言版本,提供跨语言的接口调用服务。

原理

流程图

image.png thrift的原理就是通过IDL文件定义服务接口,根据IDL生产代码,通过序列化协议和通信协议传输数据,实现远程服务调用

  1. 使用IDL定义服务接口
  2. 根据IDL生成接口,包括服务端和客户端代码
  3. 编写服务端代码,指的是具体的功能代码,步骤二为接口调用代码,开发者根据生成的调用代码编写接口中定义的方法
  4. 编写客户端代码,开发者根据生成的接口代码编写客户端程序,调用远程服务接口
  5. 通信协议:thrift 支持多种通信协议,包括二进制、压缩、JSON协议等
  6. thrift支持多种序列化协议,包括二进制、JSON、XML等

thrift 的特点

好处

  1. 多语言:多种语言及所有平台。
  2. 多协议序列化协议:包括二进制协议、JSON、XML协议等,
  3. 多种网络传输协议:包括 TSocket、TFramedTransport 等
  4. 高效性: Thrift 支持二进制传输协议,Http只支持标准的文本协议,相对更加高效,数据传输速度更快。
  5. 便捷性:thrift支持多种语言JavaScript、java、c++、python 等代码生成,简化开发者的工作,而http需要开发者自己编写接口调用的代码。
  6. 强类型定义:减少类型转换的开销,提高代码的可读性和可维护性。

坏处

  1. 不支持动态协议,限制了thrift的灵活性
  2. 繁琐的序列化和反序列化,比较复杂,bug难以排查
  3. 强类型定义,编写时间长
  4. 相关问的文档、教程、示例、api 文档很少,初学者入门门槛较高
  5. RPC 框架没有提供加密、身份验证登安全机制,需要自己实现,数据的安全性、可信任性没有https高

综上,高并发的分布式系统适合用thrift更高效,维护性更高,例如美团外卖、商家、骑手各方的服务调用。https服务更适用于安全性更高的场景,例如,在线支付,密码认证等。

代码编译

根据 thrift 文件的定义,逐行转换为 js 代码(图为 cpp 的,原理相同) image.png

服务注册/发现

通过代理服务进行注册/发现,代理服务除了保存各服务信息之外,还进行心跳检测,保证服务存活,开辟另外的进程进行校验能和主进程功能解耦,提高服务性能

哨兵服务:为了防止代理服务宕机导致的,启用了哨兵服务,当服务器宕机时,会去请求远端的哨兵服务进行服务发现

服务调用

时序图

image.png

架构分层 image.png 结构化解析

将编译好的js进行结构化解析,提供给用户调用

image.png 序列化原理

序列化后的二进制文件是经过约定协议的文件,分段解析协议,进行数据传输

image.png

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就是采用命名管道进行通信。