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 是真正的實現。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章