thrift-编解码流程

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
在这里插入图片描述
com.meituan.service.HelloService.Client#send_sayHello
在这里插入图片描述
org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args)

在这里插入图片描述
org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)

在这里插入图片描述
com.meituan.service.HelloService.sayHello_args#write

在这里插入图片描述
com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write

在这里插入图片描述
com.meituan.model.Request#write

在这里插入图片描述
com.meituan.model.Request.RequestStandardScheme#write

在这里插入图片描述

  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

在这里插入图片描述
org.apache.thrift.ProcessFunction#process
在这里插入图片描述
com.meituan.service.HelloService.sayHello_args#read

在这里插入图片描述
com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read

在这里插入图片描述
com.meituan.model.Request#read
在这里插入图片描述
com.meituan.model.Request.RequestStandardScheme#read

在这里插入图片描述

  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 是真正的实现。
发布了778 篇原创文章 · 获赞 323 · 访问量 209万+

猜你喜欢

转载自blog.csdn.net/lgh1992314/article/details/105286535
今日推荐