如何才能深入理解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