下面是一些对大部分thrift支持的语言均可用的protocol:
- binary:简单的二进制编码
- Compact:具体见THRIFT-11
- Json
ProcessorProcessor封装了从输入数据流中读数据和向数据数据流中写数据的操作。读写数据流用Protocol对象表示。Processor的结构体非常简单:
interface TProcessor { bool process(TProtocol in, TProtocol out) throws TException}
与服务相关的processor实现由编译器产生。Processor主要工作流程如下:从连接中读取数据(使用输入protocol),将处理授权给handler(由用户实现),最后将结果写到连接上(使用输出protocol)。
ServerServer将以上所有特性集成在一起:
- 创建一个transport对象
- 为transport对象创建输入输出protocol
- 基于输入输出protocol创建processor
- 等待连接请求并将之交给processor处理
应用举例下面,我们讨论thrift文件产生的特定语言代码。下面给出thrift文件描述:
namespace cpp thrift.examplenamespace java thrift.exampleenum TweetType { TWEET, RETWEET = 2, DM = 0xa, REPLY}struct Location { required double latitude; required double longitude;}struct Tweet { required i32 userId; required string userName; required string text; optional Location loc; optional TweetType tweetType = TweetType.TWEET; optional string language = "english";}typedef list<Tweet> TweetListstruct TweetSearchResult { TweetList tweets;}const i32 MAX_RESULTS = 100;service Twitter { void ping(), bool postTweet(1:Tweet tweet); TweetSearchResult searchTweets(1:string query); oneway void zip()}
Java语言产生的文件
一个单独的文件(Constants.java)包含所有的常量定义。
每个结构体,枚举或者服务各占一个文件
$ tree gen-java`– thrift `– example |– Constants.java |– Location.java |– Tweet.java |– TweetSearchResult.java |– TweetType.java `– Twitter.java类型
thrift将各种基本类型和容器类型映射成java类型:
bool: booleanbyte: bytei16: shorti32: inti64: longdouble: doublestring: Stringlist<t1>: List<t1>set<t1>: Set<t1>map<t1,t2>: Map<t1, t2>typedef
Java不支持typedef,它只使用原始类型,如,在上面的例子中,产生的代码中,TweetSearchResult会被还原成list tweets
Enum
Thrift直接将枚举类型映射成java的枚举类型。用户可以使用geValue方法获取枚举常量的值。此外,编译器会产生一个findByValue方法获取枚举对应的数值。 |