跟我学Thrift 5:深入理解Thrift生产的代码

如何才能深入理解Thrift原理,Everything is in code.

继续以上一篇文章中的购买汽车的service为例子,我们在看编译生产的代码之前,想一下如果我们是Thrift的设计者,会生产哪些代码:

1.首先是如何正确的read,write。即序列化和反序列化对象:细节包括read,write fieldId,fieldValue

2.处理好IsSet接口

其中Car和Consumer都是简单struct(没有包含子struct),我们来看一下自动生成的代码

Struct/POJO对象

比如Car,编译后的Car.java它包含如下几个内部类:

1.CarStandard(Tuple)Scheme(Factory): scheme用于read, write即序列化反序列化car对象,本质它还是调用对应Protocol里面的read,write方法. 

目前观察发现Tuple就是将Optional属性通过BitSet的方式来存储。即将required和optional

2.Scheme中的read,write会被Car对象的read,write方法调用

其它就是一些get/set(包含IsSet方法)等方法

复合Struct对象

比如Order对象,它包含car和consumer。编译后的代码包括:

1.和简单对象类似,包含Scheme对象,它内部处理car对象时,会调用car对象的read,write方法

2.Oder对象的read,write会调用schema的read,write

Service对象

CarService编译后,会产生

1.Iface:service的接口

2.createBuyCarOrder_args:内部同样有scheme子类,负责read,write,它会调用car,order等对象的read,write

3.Client:封装了客户端的调用,构造时传入TProtocol。它通过createBuyCarOrder_args来完成序列化和反序列化,它最终会调用对象的read,write方法。

4.AsyncClient:Client的异步实现

5.Processor: 服务端的调用封装,构造时需要传入真正的服务实现类。在调用方法的时候,processor会调用真正的实现实现类,然后

6.createBuyCarOder_result:调用服务类后产生的结果的类的封装,里面包含scheme(它可以负责对结果进行read,write)

整个流程就是:

Client类发起请求,通过调用对象的read,write进行序列化,对象的read,write会调用schema的read,write

Server端收到请求后,会转到Processor中,会调用服务实现类,然后将结果封装到createBuyCarOder_result中,里面会调用对象的read,write方法进行序列话,将结果返回给Client

推荐阅读更多精彩内容