Posted on:
Last modified:
Thrift 是一个全栈的 RPC 框架,它包含了接口定义语言(IDL)和 RPC 服务两部分,大概相当于 protobuf + gRPC 的功能。
可以使用 https://github.com/yifeikong/install 中的脚本来安装
包括 bool, byte/i8, i16, i32, i64, double, string, binary
。
struct 就像编程语言中的结构体或者类一样,用来自定义类型。注意在 Thrift 中定义类型的时候 需要使用数字标记顺序,这样是为了更高效地序列化。
注意其中的 required 和 optional 字段,required 表示必选的字段,optional 的字段可以忽略。 为了兼容性考虑,建议尽可能把字段声明为 optional。
struct Cat {
1: required i32 number=10; // 可以有默认值
2: optional i64 big_number;
3: double decimal;
4: string name="thrifty"; // 字符串也可以有默认值
}
Thrift 中还可以定义异常,关键字是 exception,其他语法和 struct 一样。
Thrift 支持 C/C++ 类型的 typedef
typedef i32 MyInteger // 1
typedef Tweet ReTweet // 2
enum Operation {
ADD = 1;
SUB = 2;
MUL = 3;
DIV = 4;
}
Thrift 中包含了常见的容器类型 list set map
等。
list<t1>
: 一个 t1 类型的有序数组set<t1>
: 一个 t1 类型的无需集合map<t1,t2>
: 一个字典,key 是 t1 类型,value 是 t2 类型使用 const 定义常量
const i32 INT_CONST = 1234; // 1
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
Thrift 支持 Python 和 C++ 类型的注释。
# 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.
for each thrift file, you have to add a namespace for it.
namespace py tutorial
namespace java tutorial
include "other.thrift"
服务类似于一个接口,在 Thrift 中定义,然后根据 Thrift 生成的文件,再使用具体的代码实现。
注意其中的 oneway
, 意思是客户端不会等待响应。
service StringCache {
void set(1:i32 key, 2:string value),
string get(1:i32 key) throws (1:KeyNotFound knf),
oneway void delete(1:i32 key)
}
Thrift 的整个网络架构如图:
生成的代码位于蓝色的一层,Transport 实现了二进制数据的传输,我们可以选择 TCP 或者 HTTP 等协议传输我们的数据。也就是 Processor。Protocol 层定义了如何把 Thrift 内部结构的数据序列 化到二进制数据,或者反过来解析,可以使用 JSON、compact 等转换方法。Processor 负责从 Protocol 中读取请求,调用用户的代码,并写入响应。Server 的实现可以有很多中,比如多线程、 多进程的等等。
Processor 的定义:
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
Server 的具体工作:
thrift -r --gen py file.thrift
编译好的文件在 gen-py 目录下
-r
表示递归编译--gen
指定要生成的语言handler 对应实现 service Server 中使用 Handler
Python 的 server 和 client
YN: 线程安全性
何时需要一个 thrift 服务呢?而不是封装一个类或者 dal 来操作?
如果只是同一个语言内,需要读写一些数据库之类的,封装成一个类就可以了
Const 应该定义在哪儿?
如果是一个需要在调用过程中使用的常量,使用 thrift,如果是在数据库中存储,使用在代码中定义的常量
A few reasons other than speed:
Personally, I use thrift for internal LAN RPC and HTTP when I need connections from outside.
© 2016-2022 Yifei Kong. Powered by ynotes
All contents are under the CC-BY-NC-SA license, if not otherwise specified.
Opinions expressed here are solely my own and do not express the views or opinions of my employer.
友情链接: MySQL 教程站