Thrift for Java 源码解析
一、 Thrift自动生成的代码解析
以thrift自带的tutorial为例,tutorial.thrift生成的java文件有:
InvalidOperation.java是对应的异常类文件;Operation.java是枚举类文件;tutorialConstants.java是所有常量类;Work.java是struct结构体类文件;由此可以看出thrift扫描IDL文件里的struct、enum、exception、service,并分别生成对应的文件,下面,下面详细介绍下service自动生成的文件结构:
1、 服务接口 Iface、AsyncIface
Thrift服务端需要实现Iface接口,这个接口就是服务需要提供的外部API、如果服务端支持异步调用,还需要实现AsynceIface接口;接口含有的所有方法对应IDL文件里的清单
2、 客户端类Client、AsyncClient
客户端类不需要业务进行修改,业务直接使用客户端类与服务器通信,进行远程调用。客户端类帮助业务进行了调用、消息的序列化和网络发送,并接受服务器返回的数据和反序列化,将调用结果返回给业务
3、 调用参数和调用结果类
methodname_args\methodname_result这对类对应一个外部接口方法的输入参数和返回值,xxx_args含有write和read方法,与Transport层进行数据的读写交换
4、 Processor类
Processor类是服务端执行客户端请求的回调框架,也就是说,服务端的Transport层接受到客户端的请求,Transport会委托Processor类处理。所以,一般情况下,服务器端创建Iface接口的实例A,并注入到Processor,Processor在处理具体业务接口的时候调用实例A。
二、 Thrift客户端代码实现
1、 客户带代码模式

客户端代码一般为:
1) 创建一个Transport对象,连接到服务器对应端口,定义数据传输方式,一般为TCP/IP
2) 创建一个Protocol对象来包裹Transport,定义数据传输格式,常用有二进制
3) 创建一个Client实例,通过client对象直接调用,服务端位置对客户端透明
4)
注意点:Protocol属于数据协议层,并持有两个transport,一个负责发送数据,一个负责接收数据,默认为同一个transport,所以同一个client实例是线程不安全的,如果客户端需要提高调用并发量,可以考虑实例化多个client实例,或引入client池
三、 Thrift服务端代码实现
Thrift库提供了3种模型,分别为:TSimpleServer(单线程服务模型)、TThreadPoolServer(多线程服务模型,阻塞IO)、TNonblockingServer(多线程服务模型,非阻塞IO)
注意:采用第三种服务模型,需要创建一个TNonblockingServerTransport类型的transport,并注入一个Selector对象到transport中,Thrift非阻塞IO依赖Java的nio包来处理。