首先是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即可.