一、Thrift入门
1.下载Apache Thrift
下载一份Windows下的Thrift 编译工具 (最新版)
http://www.apache.org/dyn/closer.cgi?path=/thrift/0.10.0/thrift-0.10.0.exe
2.构建和按照Apache Thrift 编译工具
将exe放在windows下指定好的安装目录即可
3.编写一份.thrift文件
你将新建一份.thrift后缀的文件。此文件由thrift 类型和服务组成的接口定义。Thrift定义的服务有服务器进行实现,供客户端调用。Thrift的编译器将依据thrift文件进行生成源代码,由不同的客户端和服务器使用。
运行命令(跳转到安装目录):
thrift-0.10.0.exe --gen <language> <Thrift filename>
简单的例子 (test.thrift):
namespace java com.fan.message
/**
* generrate code by thrift
* define quaut javabean
* define service ThrfitTest
*
**/
struct message{
1:i32 number,
2:string msgtype,
3:bool status,
4:string name
}
/**
*生成服务接口
**/
service MessageDeal{
/**
* 执行
**/
void execute(1:i32 key,2:string value),
i32 add(1:i32 a,2:i32 b),
bool getStatus()
}
二、thrift接口文件的编写
thrift文件是有Thrift特定的接口定义语言(interface description language IDL)和Thrift 类型。一个Thrift IDL支持Thrift 代码生成多种目标语言定义的结构(Structs)和服务(Services)在IDL文件中。
Thrift Types
基础类型:
bool: A boolean value (true or false)
byte: An 8-bit signed integer
i16: A 16-bit signed integer
i32: A 32-bit signed integer
i64: A 64-bit signed integer
double: A 64-bit floating point number
string: A text string encoded using UTF-8 encoding
Thrift的基础类型和容器类型在java下映射对应关系如下:
bool: boolean
binary: byte[]
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>
IDL 文档规范
Include | CppInclude | Namespace
include
inclue "common.thrift"
要点:
1.导入common.thrift文件,最终将common.thrift中的语句与新建此文件一起生成
namespace
namespace java com.fan.message
namesapce py cn.fan
要点:
1.支持语言'cpp' | 'java' | 'py' | 'perl' | 'rb' | 'cocoa' | 'csharp'
2.thrift生成统一的结构或者模块
const
const i32 INT_CONST = 1234;
enum
Enum 语法: 'enum' Identifier '{' (Identifier ('=' IntConstant)? ListSeparator?)* '}'
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
Struct
Struct语法: 'struct' Identifier 'xsd_all'? '{' Field* '}'
要点:
1.struct中每个字段必须有一个唯一的正整数标识符加冒号,如:1:
2.字段可以有required or optional作为修饰符
3.struct中可以包含其他的structs
4.字段可以有一个默认值
5.一个thrift文件中可以定义多个structs
6.struct 类似与java中的javabean,所以struct 唯一标识、字段命名规范都与Java中类似
例子:
struct Location {
1: required double latitude;
2: required double longitude;
}
struct City{
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
16: optional string language = "english"
}
Exception
Exception语法: 'exception' Identifier '{' Field* '}'
exception InvalidOperation {
1: i32 whatOp,
2: string why
}
Service
Service语法:'service' Identifier ( 'extends' Identifier )? '{' Function* '}'
Function语法: 'oneway'?FunctionType Identifier '('Field*')'?Throws ListSeparator?
FunctionType语法: FieldType | 'void'
Throws语法: 'throws' '(' Field* ')'
要点:
1.service支持继承其他service,作为RPC的接口定义,包括方法
2.service中的方法。a)返回值支持void、原始类型(i32、bool)、struct等
b)方法参数正常的的字段定义
c)可以抛出自定义异常throws
3)service中的每个方法可以用逗号和分号结束
4)方法中定义 onway标识服务器无需响应(onway),返回值必须为void
例子:
service Twitter {
void ping(),
bool postTweet(1:Tweet tweet) throws (1:TwitterUnavailable unavailable),
TweetSearchResult searchTweets(1:string query);
oneway void zip()
}
Comments
# This is a valid comment.
/*
* This is a multi-line comment.
* Just like in C.
*/
// C++/Java style single-line comments work just as well.
要点:
支持Shell、C++、Java类型注释
参考: