天天看点

Storm-源码分析- Thrift的使用

首先是storm.thrift, 作为idl里面定义了用到的数据结构和service 

然后backtype.storm.generated, 存放从idl通过thrift自动转化成的java代码

比如对于nimbus service 

在idl的定义为,

而对应在nimbus.java的java代码如下,

1. 首先get client,

看看backtype.storm.utils下面的client.getconfiguredclient的逻辑, 

只是从配置中取出nimbus的host:port, 并new nimbusclient

nimbusclient 继承自thriftclient, public class nimbusclient extends thriftclient 

thriftclient又做了什么? 关键是怎么进行数据序列化和怎么将数据传输到remote 

这里看出thrift对transport和protocol的封装 

对于transport, 其实就是对socket的封装, 使用tsocket(host, port) 

然后对于protocol, 默认使用tbinaryprotocol, 如果你不指定的话

2. 调用任意rpc 

那么就看看submittopologywithopts

可以看出上面的nimbus的interface里面有这个方法的定义, 而且thrift不仅仅自动产生java interface, 而且还提供整个rpc client端的实现

分两步, 

首先send_submittopologywithopts, 调用sendbase 

接着, recv_submittopologywithopts, 调用receivebase 

可以看出thrift对protocol的封装, 不需要自己处理序列化, 调用protocol的接口搞定 

thrift强大的地方是, 实现了整个协议栈而不光只是idl的转化, 对于server也给出多种实现 

下面看看在nimbus server端, 是用clojure来写的 

可见其中使用thrift封装的nonblockingserversocket, thshaserver, tbinaryprotocol, proccessor, 非常简单 

其中processor会使用service-handle来处理recv到的数据, 所以作为使用者只需要在service-handle中实现nimbus$iface, 其他和server相关的, thrift都已经帮你封装好了, 这里使用的idl也在backtype.storm.generated, 因为clojure基于jvm所以idl只需要转化成java即可.