1. Thrift 框架介绍

Thrift 是由facebook研发的,可以实现不同开发语言的通信,使用接口定义语言来定义数据类型与服务。也就是说Thrift是充当不同编程语言“中间商”的作用。

2. Thrift 文件的定义

1)基本类型:不支持无符号类型

byte: 有符号字节 i16: 16位有符号整数 i32: 32位有符号整数 i64: 64位有符号整数 double: 64位浮点数 string: 字符串 2)容器类型:集合中的元素可以是除了service之外的任何类型,包括exception

list: 一系列由T类型的数据组成的有序列表,元素可以重复。**直接翻译为STL vector,Java ArrayList,或脚本语言中的native array**。 set: 一系列由T类型的数据组成的无序集合,元素不可重复。**翻译为STL set,Java HashSet,Python中的set,或PHP/Ruby中的native dictionary**。 map<K, V>: 一个字典结构,严格唯一的键(keys)到值(values)的映射。**翻译为STL map,Java HashMap,PHP associative array,或Python/Ruby dictionary**。 3)结构体(struct)

struct DocContent{ 1:string content, 2:string title, }

4)枚举(enum)

enum DocContent{ MALE, FEMALE }

5)异常(exception)

异常在语法和功能上都与结构体相同,生成的对象继承自各目标编程语言中适当的异常基类,以便与任何给定语言中的本地异常处理无缝地整合。 exception RequestException{ 1: i32 code; 2: string reason; }

6)常量(const)

const i32 MAX_RETRIES_TIME = 10

7)可选与必选

struct People { 1: required string name; 2: optional i32 age; }

8)服务(Services)

对一个服务的定义在语法上等同于在面向对象编程中定义一个接口(或一个纯虚抽象类)。Thrift编译器生成实现该接口的客户与服务器存根。 service GetKeywordsString { KeywordsResult get_keywords(1: DocContent doc), string get(1:i32 key) throws (1:KeyNotFound knf), }

注意:

除其他所有定义的Thrift类型外,void也是一个有效的函数返回类型。Void函数可添加一个async修饰符,产生的代码不等待服务器的应答。一个纯void函数会向客户端返回一个应答,保证服务器一侧操作已完成。应用开发者应小心,仅当方法调用失败是可以接受的,或传输层已知可靠的情况下,才使用async优化。

3. 代码详解

首先我们书写thrift文件

namespace cpp test
namespace java com.test.thrift

service OCRService {
   string recognizeWithFile(1:binary file, 2:string uuid, 3:map<string, string> meta);
}

其中 OCRService中的recognizeWithFile定义了客户端和服务端发生交互的函数。

我们通过以下命令来生成