[关闭]
@Yano 2018-12-01T10:34:53.000000Z 字数 3113 阅读 3056

Thrift RPC 框架分析

Java


前言

工作中用到Thrift,一直想深入研究一下。今天这篇博客以提问的方式,分析Thrift的源码。文章部分参考自:Thrift源码分析

本来计划的题目是:「Thrift RPC 源码分析」,可是写了两个小时才发现,我根本没有贴出多少源码……因为我是在公司项目源码中直接分析的,又不能直接贴在博客中,遂放弃 o_0

Thrift 有什么特点?

  1. 基于二进制的高性能的编解码框架
  2. 基于NIO的底层通信
  3. 相对简单的服务调用模型
  4. 使用IDL支持跨平台调用

Thrift 的整体架构?

官方文档 Apache Thrift - Concepts详细说明了Thrift的架构:

Thrift network stack

  1. +-------------------------------------------+
  2. | Server |
  3. | (single-threaded, event-driven etc) |
  4. +-------------------------------------------+
  5. | Processor |
  6. | (compiler generated) |
  7. +-------------------------------------------+
  8. | Protocol |
  9. | (JSON, compact etc) |
  10. +-------------------------------------------+
  11. | Transport |
  12. | (raw TCP, HTTP etc) |
  13. +-------------------------------------------+

Transport

The Transport layer provides a simple abstraction for reading/writing from/to the network. This enables Thrift to decouple the underlying transport from the rest of the system (serialization/deserialization, for instance).

Transport layer提供了一个从网络IO读写的简单抽象,可以使Thrift与底层解耦。

Transport接口有:

除了Transport接口,还有一个ServerTransport,用来在server端创建请求的连接。

Protocol

Protocol定义了传输数据的序列化、反序列化机制(JSON、XML、binary、compact binary等)。

Protocol的接口如下:

  1. writeMessageBegin(name, type, seq)
  2. writeMessageEnd()
  3. writeStructBegin(name)
  4. writeStructEnd()
  5. writeFieldBegin(name, type, id)
  6. writeFieldEnd()
  7. writeFieldStop()
  8. writeMapBegin(ktype, vtype, size)
  9. writeMapEnd()
  10. writeListBegin(etype, size)
  11. writeListEnd()
  12. writeSetBegin(etype, size)
  13. writeSetEnd()
  14. writeBool(bool)
  15. writeByte(byte)
  16. writeI16(i16)
  17. writeI32(i32)
  18. writeI64(i64)
  19. writeDouble(double)
  20. writeString(string)
  21. name, type, seq = readMessageBegin()
  22. readMessageEnd()
  23. name = readStructBegin()
  24. readStructEnd()
  25. name, type, id = readFieldBegin()
  26. readFieldEnd()
  27. k, v, size = readMapBegin()
  28. readMapEnd()
  29. etype, size = readListBegin()
  30. readListEnd()
  31. etype, size = readSetBegin()
  32. readSetEnd()
  33. bool = readBool()
  34. byte = readByte()
  35. i16 = readI16()
  36. i32 = readI32()
  37. i64 = readI64()
  38. double = readDouble()
  39. string = readString()

Processor

Processor封装了读取输入流、写入输出流的能力,其中输入流、输出流都是Protocol的对象。接口很简单:

  1. interface TProcessor {
  2. bool process(TProtocol in, TProtocol out) throws TException
  3. }

其中用户需要实现TProcessor接口。

Thrift 的源码实现?

TTransport

TTransport有很多实现,其中最重要的就是TFramedTransport。

客户端的实际使用:

  1. TSocket socket = new TSocket(host, port);
  2. socket.setTimeout(timeout);
  3. TTransport transport = new TFramedTransport(socket);
  4. TProtocol protocol = new TCompactProtocol(transport);
  5. transport.open();

TProtocol

Thrift主要支持的协议有:

其中Binary协议的序列化、反序列化,可以参考我的另一篇文章:Thrift 对象序列化、反序列化-字节数组分析

TServer

解释起来太麻烦,还是直接贴思维导图吧,更直观 0_o

TServerTransport

TServerTransport作为服务器的Acceptor抽象,来监听端口,创建客户端Socket连接。

其他 RPC 框架有哪些?

参考自:流行的rpc框架benchmark 2018新春版

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注