Board logo

标题: Thrift架构介绍(5) [打印本页]

作者: look_w    时间: 2019-1-15 19:36     标题: Thrift架构介绍(5)

下面是一些对大部分thrift支持的语言均可用的protocol:
ProcessorProcessor封装了从输入数据流中读数据和向数据数据流中写数据的操作。读写数据流用Protocol对象表示。Processor的结构体非常简单:
interface TProcessor {    bool process(TProtocol in, TProtocol out) throws TException}
与服务相关的processor实现由编译器产生。Processor主要工作流程如下:从连接中读取数据(使用输入protocol),将处理授权给handler(由用户实现),最后将结果写到连接上(使用输出protocol)。
ServerServer将以上所有特性集成在一起:
应用举例下面,我们讨论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方法获取枚举对应的数值。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0