编写服务说明.thrift文件

摘要:
如果由required标识的字段未赋值,Thrift将给出提示。Thrift编译器将根据所选目标语言生成服务器的服务接口代码和客户端的堆代码。这使得节俭底层的运输与系统的其他部分脱钩。因此,协议的实现应该提供编码机制并负责数据序列化。读和写数据流由协议对象表示。

1.数据类型

  • 基本类型:
    • bool:布尔值,true 或 false,对应 Java 的 boolean
    • byte:8 位有符号整数,对应 Java 的 byte
    • i16:16 位有符号整数,对应 Java 的 short
    • i32:32 位有符号整数,对应 Java 的 int
    • i64:64 位有符号整数,对应 Java 的 long
    • double:64 位浮点数,对应 Java 的 double
    • string:utf-8编码的字符串,对应 Java 的 String
    • 注意,thrift不支持无符号整型,因为很多目标语言不存在无符号整型(如java)。
  • 结构体类型:
    • struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
  • 容器类型:
    • list:对应 Java 的 ArrayList
    • set:对应 Java 的 HashSet
    • map:对应 Java 的 HashMap
  • 异常类型:
    • exception:对应 Java 的 Exception
  • 服务类型:
    • service:对应服务的类
2.命名空间
Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了一种组织(隔离)代码的方式。因为每种语言均有自己的命名空间定义方式(如python中有module),thrift允许开发者针对特定语言定义namespace,如下示例:
namespace java com.example.project 
说明:转换成package com.example.project
 
3. 文件包含
Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象,如:
include "tweet.thrift"  
...
struct TweetSearchResult {
1: list<tweet.Tweet> tweets; // b
}
说明:
a.  thrift文件名要用双引号包含,末尾没有逗号或者分号
b.  注意tweet前缀
 
4. 常量
Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。
const i32 INT_CONST = 1234;   
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
说明: 分号是可选的,可有可无;支持十六进制赋值。
 
5. 定义结构体
结构体由一系列域组成,每个域有唯一整数标识符,类型,名字和可选的缺省参数组成。如:
struct Tweet {
1: required i32 userId;                  // a
2: required string userName;             // b
3: required string text;
4: optional Location loc;                // c
16: optional string language = "english" // d
}
struct Location {                            // e
1: required double latitude;
2: required double longitude;
}
说明:
a.  每个域有一个唯一的,正整数标识符
b.  每个域可以标识为required或者optional(也可以不注明)
c.  结构体可以包含其他结构体
d.  域可以有缺省值
e.  一个thrift中可定义多个结构体,并存在引用关系
规范的struct定义中的每个域均会使用required或者optional关键字进行标识。如果required标识的域没有赋值,thrift将给予提示。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值。
与service不同,结构体不支持继承,即,一个结构体不能继承另一个结构体。
 
6. 定义服务
在流行的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多语言间RPC服务的框架。
Thrift编译器会根据选择的目标语言为server产生服务接口代码,为client产生桩代码。
//“Twitter”与“{”之间需要有空格!!!
service Twitter {
// 方法定义方式类似于C语言中的方式,它有一个返回值,一系列参数和可选的异常 列表. 注意,参数列表和异常列表定义方式与结构体中域定义方式一致.
void ping(),                                    // a
bool postTweet(1:Tweet tweet);                  // b
TweetSearchResult searchTweets(1:string query); // c
// ”oneway”标识符表示client发出请求后不必等待回复(非阻塞)直接进行下面的操作, ”oneway”方法的返回值必须是void
oneway void zip()                               // d
}
说明:
a. 函数定义可以使用逗号或者分号标识结束
b. 参数可以是基本类型或者结构体,参数是只读的(const),不可以作为返回值!!!
c. 返回值可以是基本类型或者结构体
d. 返回值可以是void
注意,函数中参数列表的定义方式与struct完全一样
Service支持继承,一个service可使用extends关键字继承另一个service
 
 
7.概念
Thrift的网络栈如下所示:
 
编写服务说明.thrift文件第1张
 
7.1   Transport
Transport层提供了一个简单的网络读写抽象层。这使得thrift底层的transport从系统其它部分(如:序列化/反序列化)解耦。以下是一些Transport接口提供的方法:open、close、read、write、flush等,
除了以上几个接口,Thrift使用ServerTransport接口接受或者创建原始transport对象。正如名字暗示的那样,ServerTransport用在server端,为到来的连接创建Transport对象。ServerTransport 提供以下接口:
open、listen、accept、close。
7.2   Protocol
Protocol抽象层定义了一种将内存中数据结构映射成可传输格式的机制。换句话说,Protocol定义了datatype怎样使用底层的Transport对自己进行编解码。因此,Protocol的实现要给出编码机制并负责对数据进行序列化。
7.3   Processor
Processor封装了从输入数据流中读数据和向数据数据流中写数据的操作。读写数据流用Protocol对象表示。Processor的结构体非常简单:
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
与服务相关的processor实现由编译器产生。Processor主要工作流程如下:从连接中读取数据(使用输入protocol),将处理授权给handler(由用户实现),最后将结果写到连接上(使用输出protocol)。 7.4   Server
Server将以上所有特性集成在一起:
(1)  创建一个transport对象
(2)  为transport对象创建输入输出protocol
(3)  基于输入输出protocol创建processor
(4)  等待连接请求并将之交给processor处理
 
8. 应用举例
下面,我们讨论thrift文件产生的特定语言代码。下面给出thrift文件描述:
namespace cpp thrift.example
namespace java thrift.example
enum TweetType {
TWEET,
RETWEET = 2,
DM = 0xa,
REPLY
}
struct Location {
1: required double latitude;
2: required double longitude;
}
struct Tweet {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
5: optional TweetType tweetType = TweetType.TWEET;
16: optional string language = "english";
}
typedef list<Tweet> TweetList
struct TweetSearchResult {
1: TweetList tweets;
}
const i32 MAX_RESULTS = 100;
service Twitter {
void ping(),
bool postTweet(1:Tweet tweet);
TweetSearchResult searchTweets(1:string query);
oneway void zip()
}

(1) Java语言
(a)  产生的文件
一个单独的文件(Constants.java)包含所有的常量定义。
每个结构体,枚举或者服务各占一个文件
$ tree gen-java
`– thrift
`– example
|– Constants.java
|– Location.java
|– Tweet.java
|– TweetSearchResult.java
|– TweetType.java
`– Twitter.java
(b)  类型
thrift将各种基本类型和容器类型映射成java类型:
bool: boolean
byte: byte
i16: short
i32: int
i64: long
double: double
string: String
list<t1>: List<t1>
set<t1>: Set<t1>
map<t1,t2>: Map<t1, t2>
(c)  typedef
Java不支持typedef,它只使用原始类型,如,在上面的例子中,产生的代码中,TweetSearchResult会被还原成list<Tweet> tweets
(d)  Enum
Thrift直接将枚举类型映射成java的枚举类型。用户可以使用geValue方法获取枚举常量的值。此外,编译器会产生一个findByValue方法获取枚举对应的数值。
(e)  常量
Thrift把所有的常量放在一个叫Constants的public类中,每个常量修饰符是public static final。
 
参考资料: http://dongxicheng.org/search-engine/thrift-guide/

免责声明:文章转载自《编写服务说明.thrift文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java property 配置文件管理工具框架,避免写入 property 乱序如何快速重置OUTLOOK2013,2016到初始配置状态,outlook 修改数据文件位置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

beego 结构体构造及json转化

已有的beego项目实现一个查询接口,顺便记录一下常用的技术点 package controllersApi import ( "encoding/json" "fmt" "myproject/common" "myproject/models" "reflect" "github.com/astaxie...

Go第六篇之结构体剖析

Go 语言通过用自定义的方式形成新的类型,结构体是类型中带有成员的复合类型。Go 语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。 Go 语言中的类型可以被实例化,使用new或&构造的类型实例的类型是类型的指针。 结构体成员是由一系列的成员变量构成,这些成员变量也被称为“字段”。字段有以下特性: 字段拥有自己的类型和值。...

usb设备 配置 接口 端点

在USB设备的逻辑组织中,包含设备、配置、接口和端点4个层次。每个USB设备都提供了不同级别的配置信息,可以包含一个或多个配置,不同的配置使设备表现出不同的功能组合(在探测/连接期间需从其中选定一个),配置由多个接口组成。在USB协议中,接口由多个端点组成,代表一个基本的功能,是USB设备驱动程序控制的对象,一个功能复杂的USB设备可以具有多个接口。每个配...

标准C程序设计七---32

Linux应用 编程深入 语言编程标准C程序设计七---经典C11程序设计以下内容为阅读:《标准C程序设计》(第7版) 作者:E. Balagurusamy(印), 李周芳译 清华大学出版社 2017.7《21天学通C语言》(第7版) 作者:Bradley Jones Peter Aitken Dean Miller(美), 姜佑译 人民邮电出版社 201...

Matlab学习笔记(三)

二、MATLAB基础知识 (四)数组 MATLAB总是把数组看作存储和运算的基本单位,标量数据也被看作是(1×1)的数组 一维数组的创建 创建一维数组的几种方法:(e_two_14.m) 直接输入法:直接通过空格、逗号和分号来分隔数组元素。 步长生成方法:x=a:inc:b,a和b为一维向量数组的起始数值和终止数值,inc为数组的间隔步长;如果a和b...

thrift入门(1) 安装配置

thrift 是一个跨语言的通讯框架,支持c++, java, .net, python,php等。你可以用一种语言写一个服务器,然后另外一种语言写一个客户端,快速搭建一个rpc调用服务。而且它很轻量级,只要引入特定库便可以运行服务和客户端,不需要再安装配置其它复杂的环境和容器。 下面介绍如何在ubuntu11.10上安装thrift0.8.0。 1....