跟我学Thrift 4:由浅入深Thrift文件

Python012

跟我学Thrift 4:由浅入深Thrift文件,第1张

我们以顾客下单买车为例子,来深入了解下Thrift的一些细节

1.自定义标识符VS自动标识符

2.Optional VS Required VS Default

3.struct的组合(struct不支持继承)

首先是Thrift文件定义如下:

namespace java com.whp.demo.thrift.optional

struct Car {

1:required i32 carId,

2:required string carName,

3:required i64 price,

4: optional i16 age=0

}

struct Consumer{

1:required i32 consumerId,

2:optional string name

}

struct Order{

required i64 orderId,

required Car car,

required Consumer consumer,

}

service CarService{

Order createBuyCarOder(1:required Car car, 2:required Consumer consumer)

}

include "other.thrift"      //包含其它的thrift文件

namespace java com.whp.demo   //java下的namespace com.whp.demo

typedef i32 int   //tydef 语法

typedef i64 long

enum Player {

    JAVA = 0

    FLASH = 1

}

#required:一定会被序列号,并且如果没有被复制,将会被提醒

#optional:如果没有被赋值,将不会被序列化。如果有默认值,则将会被序列化成默认值。具有一定的向后兼容性。

#default: 默认情况下是 req-in,opt-out即 对于write stream默认是required,对于read stream是optional

#如果一个程序分开来开发,那版本问题就是绕不过去的问题。Thrift的版本是通过“field identifiers”来实现的,每个结构由其标识,结构中的每个域有其标识,这两个标识唯一决定了一个数据域。在解码的时候,数据域的标识被检查,如果不能识别,则该数据域被抛弃.

用户自定义编号是从1开始的正整数

默认编号是从-1 开始递减。

struct Order{

required i64 orderId,

required Car car,

required Consumer consumer,

}

比如这个,编译后会成为:

ORDER_ID((short)-1,"orderId"),

CAR((short)-2,"car"),

CONSUMER((short)-3,"consumer")

struct Order{

required i64 orderId,

required Car car,

required Consumer consumer,

}

我们可以直接在Order中组合Car和Consumer

要编写Thrift定义文件,肯定要熟悉Thrift常见的数据类型:

1.基本类型(括号内为对应的Java类型):

bool(boolean): 布尔类型(TRUE or FALSE)

byte(byte): 8位带符号整数

i16(short): 16位带符号整数

i32(int): 32位带符号整数

i64(long): 64位带符号整数

double(double): 64位浮点数

string(String): 采用UTF-8编码的字符串

2.特殊类型(括号内为对应的Java类型):

binary(ByteBuffer):未经过编码的字节流

3.Structs(结构):

struct定义了一个很普通的OOP对象,但是没有继承特性。

struct UserProfile {

1: i32 uid,

2: string name,

3: string blurb

}

如果变量有默认值,可以直接写在定义文件里:

struct UserProfile {

1: i32 uid = 1,

2: string name = "User1",

3: string blurb

}

4.容器,除了上面提到的基本数据类型,Thrift还支持以下容器类型:

list(java.util.ArrayList):

set(java.util.HashSet):

map(java.util.HashMap):

用法如下:

struct Node {

1: i32 id,

2: string name,

3: list<i32>subNodeList,

4: map<i32,string>subNodeMap,

5: set<i32>subNodeSet

}

包含定义的其他Object:

struct SubNode {

1: i32 uid,

2: string name,

3: i32 pid

}

struct Node {

1: i32 uid,

2: string name,

3: list<subNode>subNodes

}

5.Services服务,也就是对外展现的接口:

service UserStorage {

void store(1: UserProfile user),

UserProfile retrieve(1: i32 uid)

然后实现这个接口就好了啊。

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

thrift最初由facebook开发用做系统内各语言之间的RPC通信 。

2007年由facebook贡献到apache基金 ,08年5月进入apache孵化器 。

支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务 ,跨越语言的C/S RPC调用 。

thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。