2 Apache Thrift 初识 (2) - 数据类型与基本语法

Wu Jun 2019-12-25 15:59:04
10 微服务 > 1 服务调用 > 05 Apache Thrift

1 数据类型

官方文档-数据类型

基本类型(Base Types)、特殊类型(Special Types)、结构体(Structs)、容器(Containers)、异常(Exceptions)、服务(Services) 枚举类型、常量类型。

1.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编码的字符串

1.2 特殊类型

(括号内为对应的Java类型)

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

1.3 结构体

在 java 中 Thrift 结构体将会被转换成OOP对象。

struct ExampleStruct {
  1: required i32 feild1;
  2: optional string feild2= "defualt";
  3: set<string> feild3
}

无类型:可以不填,会序列化 optional: 不填充则不序列化 required:必须填充必须序列化

1.4 容器

有3种可用容器类型(括号内为对应的Java类型):

list<t>(ArrayList):元素类型为t的有序表,容许元素重复。
set<t>(HashSet):元素类型为t的无序表,不容许元素重复。
map<k,v>(HashMap):key/value对,键不容许重复。

容器中元素类型可以是除了 service 外的任何合法 Thrift 类型。

1.5 异常

异常在语法和功能上相当于结构体,差别是异常使用关键字 exception 而不是 struct 声明。它在语义上不同于结构体:当定义一个 RPC 服务时,开发者可能需要声明一个远程方法抛出一个异常。

exception RequestException {
     1: i32 code;
     2: string reason;
}

1.6 服务

服务的定义方法在语法上等同于面向对象语言中定义接口。Thrift编译器会产生实现这些接口的client和server桩。具体参见下一节。

service exampleService {
  ExampleStruct queryExampleStruct(1:i32 feild1, 2:string feild2);
  set<string> queryFeild3(1:i32 feild1);
}

在上面的例子中我们定义了一个 service 类型的结构,里面包含两个方法的定义。

在定义 services 的时候,我们还需要了解一下规则:

1.7 其他

Thrift 还支持枚举(enum)和常量(const)。 ####枚举(enum) 可以像C/C++那样定义枚举类型。

thrift不支持枚举类嵌套,枚举常量必须是32位的正整数。

enum ExampleEnum {
 
  Example1,       //编译器默认从0开始赋值
 
  Example2 = 2, //可以赋予某个常量某个整数
 
  Example3 = 0xa,  //允许常量是十六进制整数
 
  Example4
 
} 
 
ExampleEnum  exampleEnum  = ExampleEnum.Example1// 给常量赋缺省值时,使用常量的全称

常量(const)

Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。

const i32 INT_CONST = 1234;    // 分号是可选的,可有可无;支持十六进制赋值。
 
const map<string,string> MAP_CONST = {"hello": "world", "goodbye": "bye"}

2 基本语法

2.1 命名空间(namespace)

Thrift 中的命名空间类似于 java 中的 package,它们提供了一种组织(隔离)代码的简便方式。名字空间也可以用于解决类型定义中的名字冲突。

namespace java com.example.project // 转换成package com.example.project

2.2 文件包含(include)

Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象

include "exampleThrift.thrift"

2.3 类型定义(typedef)

Thrift支持C/C++风格的typedef

typedef exampleThrift.Example Example 

typedef i32 MyInteger 

2.4 注释

thrift注释方式支持shell风格的注释,支持C/C++风格的注释,即#和//开头的语句都单当做注释,/**/包裹的语句也是注释。

# This is a valid comment.
 
/*
* This is a multi-line comment.
*/
 
// C++/Java style single-line comments work just as well.

参考文档