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
- writeMessageBegin: org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)
- writeStructBegin–writeFieldBegin: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write
- writeStructBegin–>writeFieldBegin–>writeI32–>writeFieldEnd–>writeFieldBegin–>writeString–>writeFieldEnd–>writeFieldStop–>writeStructEnd: com.meituan.model.Request.RequestStandardScheme#write
- writeFieldEnd–writeFieldStop–writeStructEnd: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#write
- writeMessageEnd: org.apache.thrift.TServiceClient#sendBase(String methodName, TBase<?,?> args, byte type)
总结
- 除了 writeFieldEnd 外所有的 writeXXX 操作都是成对(writeXXXBegin/writeXXXEnd)出现的。
- 假设 sayHello 请求参数不是 struct,而是普通的数据类型,则 3 是不存在的。
- FieldStop 是在所有 Field 写完之后再写入的。
- 客户端调用的主体是 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
- readMessageBegin: org.apache.thrift.TBaseProcessor#process
- readStructBegin – readFieldBegin: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read
- readStructBegin–>readFieldBegin–>readI32–>readFieldEnd–>readFieldBegin–>readString–>readFieldEnd–>readStructEnd: com.meituan.model.Request.RequestStandardScheme#read
- readFieldEnd–>readStructEnd: com.meituan.service.HelloService.sayHello_args.sayHello_argsStandardScheme#read
- readMessageEnd: org.apache.thrift.ProcessFunction#process
总结
- Thrift 生成的 Processor 以及 AsyncProcessor 和调用端半毛钱关系没有。
- 服务端调用的主体是 ProcessFunction/TBaseProcessor。
- TBaseProcessor 里的 iface 是真正的实现。
上一篇: 增量更新jar/war包
下一篇: Java 计算党费