欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

thrift-编解码流程

程序员文章站 2022-06-17 12:27:29
...

Thrift protocol 层需要进行 4 次编解码操作:

  • 客户端对请求进行编码,服务端对请求进行解码

  • 服务端对响应进行编码,客户端对响应进行解码

helloservice.thrift

namespace java com.meituan.service

include "model.thrift"

service HelloService {
        model.Response sayHello(1: model.Request req)
}

model.thrift

namespace java com.meituan.model

struct Request {
        1: required i32 age;
        2: required string name;
}

struct Response {
        1: required i16 code;
        2: required string msg;
}

使用 Thrift 0.9.3 生成 HelloService 服务类。

编码流程

编码流程就是将

com.meituan.service.HelloService.Client#sayHello
thrift-编解码流程
com.meituan.service.HelloService.Client#send_sayHello
thrift-编解码流程
org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args)

thrift-编解码流程
org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)

thrift-编解码流程
com.meituan.service.HelloService.sayHello_args#write

thrift-编解码流程
com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write

thrift-编解码流程
com.meituan.model.Request#write

thrift-编解码流程
com.meituan.model.Request.RequestStandardScheme#write

thrift-编解码流程

  1. writeMessageBegin: org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)
  2. writeStructBegin–writeFieldBegin: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write
  3. writeStructBegin–>writeFieldBegin–>writeI32–>writeFieldEnd–>writeFieldBegin–>writeString–>writeFieldEnd–>writeFieldStop–>writeStructEnd: com.meituan.model.Request.RequestStandardScheme#write
  4. writeFieldEnd–writeFieldStop–writeStructEnd: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write
  5. writeMessageEnd: org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)

总结

  1. 除了 writeFieldEnd 外所有的 writeXXX 操作都是成对(writeXXXBegin/writeXXXEnd)出现的。
  2. 假设 sayHello 请求参数不是 struct,而是普通的数据类型,则 3 是不存在的。
  3. FieldStop 是在所有 Field 写完之后再写入的。
  4. 客户端调用的主体是 XXXService.Client/TServiceClient。

解码流程

org.apache.thrift.TBaseProcessor#process

thrift-编解码流程
org.apache.thrift.ProcessFunction#process
thrift-编解码流程
com.meituan.service.HelloService.sayHello_args#read

thrift-编解码流程
com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read

thrift-编解码流程
com.meituan.model.Request#read
thrift-编解码流程
com.meituan.model.Request.RequestStandardScheme#read

thrift-编解码流程

  1. readMessageBegin: org.apache.thrift.TBaseProcessor#process
  2. readStructBegin – readFieldBegin: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read
  3. readStructBegin–>readFieldBegin–>readI32–>readFieldEnd–>readFieldBegin–>readString–>readFieldEnd–>readStructEnd: com.meituan.model.Request.RequestStandardScheme#read
  4. readFieldEnd–>readStructEnd: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read
  5. readMessageEnd: org.apache.thrift.ProcessFunction#process

总结

  1. Thrift 生成的 Processor 以及 AsyncProcessor 和调用端半毛钱关系没有。
  2. 服务端调用的主体是 ProcessFunction/TBaseProcessor。
  3. TBaseProcessor 里的 iface 是真正的实现。
相关标签: thrift