RPC框架 - Thrift协议定义

rpc

RPC 是远程过程调用(Remote Procedure Call)。

RPC 是指计算机 A 上的进程,调用另外一台计算机 B 上的进程,其中 A 上的调用进程被挂起,而 B 上的被调用进程开始执行,当值返回给 A 时,A 进程继续执行。调用方可以通过使用参数将信息传送给被调用方,而后可以通过传回的结果得到信息。

远程过程调用采用客户机/服务器(C/S)模式。请求程序就是一个客户机,而服务提供程序就是一台服务器。和常规或本地过程调用一样,远程过程调用是同步操作,在远程过程结果返回之前,需要暂时中止请求程序。使用相同地址空间的低权进程或低权线程允许同时运行多个远程过程调用。

编写IDL文件时需要注意的问题

  • 函数的参数要用数字依序标好,序号从1开始,形式为:“序号:参数名”
  • 每个函数的最后要加上“,”,最后一个函数不加
  • 在IDL中可以使用/……/添加注释

IDL支持的数据类型

IDL大小写敏感,它共支持以下几种基本的数据类型:

  • string,字符串类型,注意是全部小写形式
  • i16,16位整形类型,相当于 short 类型
  • i32,32位整形类型,对应C/C++/java中的int类型
  • i64,64位整形,对应C/C++/java中的long类型
  • byte,8位的字符类型,对应C/C++中的char,java中的byte类型
  • bool, 布尔类型,对应C/C++中的bool,java中的boolean类型
  • double,双精度浮点类型,对应C/C++/java中的double类型
  • void,空类型,对应C/C++/java中的void类型;该类型主要用作函数的返回值

注:Thrift 不支持无符号整数类型,因为很多编程语言不存在无符号类型,比如 Java

除上述基本类型外,ID还支持以下类型:

  • map,map类型
  • set,集合类型
  • list,列表类型

在Thrift文件中自定义数据类型

  • 枚举类型
  • 结构体类型

thrift定义字段

1
2
3
4
5
-  1:optional a.b c;
- 2:required string d;
- 3:required i32 e=-1;
- 4:optional f g;
- 5:optional bool h=false;

required: 必须填充,并且会序列化

optional:可以不填充,但是不填充,不会序列化,填充的才会序列化,

thrift定义枚举和结构体

1
2
3
4
5
6
7
8
enum f{
x,y,z
}
struct b{
1:optional i16 o;
2:optional string p;
3:optional double q;
}

thrift定义接口

1
2
3
4
service Service{
list<b> getList(1:list<i64> ids);
b getInfo(1:i64 id);
}

定义类型别名

1
typedefi32  Integer

就可以为i32类型重新起个名字Integer。

常量

1
2
3
4
5
const string SERVER_IP = "127.0.0.1"

const i32 SERVER_PORT = 5900

const map<string, string> MAP_CONST = {"hello": "world", "goodnight": "moon"}

异常

异常在语法和功能上类似于结构体,差别是异常使用关键字exception,而且异常是继承每种语言的基础异常类。

1
2
3
4
5
exception Extest {
1: i32 errorCode,
2: string message,
3: StUser userinfo
}

Namespace和Includes

1
2
3
4
5
namespace java com.xx.xx.xx

include "xxx.thrift"
include "xx.thrift"
include "xxx.thrift"
  • Thrift中的命名空间同C++中的namespace和java中的package类似
  • Thrift允许一个IDL文件包含另一个IDL文件,被包含的文件会在当前目录下查找。在使用被包含文件中的类型时要注意通过文件名前缀来访问。

联合

当一个结构体中,field 之间的关系是互斥的,即只能有一个 field 可生效被赋值。我们可以用 union 来声明这个结构体,而不是一堆堆 optional 的 field,语意上也更明确了。例如:

1
2
3
4
5
6
7
8
union JavaObjectArg {
1: i32 int_arg;
2: i64 long_arg;
3: string string_arg;
4: bool bool_arg;
5: binary binary_arg;
6: double double_arg;
}

序列化和反序列化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

//序列化
TSerializer serializer = new TSerializer(new TJSONProtocol.Factory());

//反序列化
TDeserializer deserializer = new TDeserializer(new TJSONProtocol.Factory());

String json = "";
Request request2 = new Request();
try {
//thrift转json
json = serializer.toString(request, "UTF-8");
//string转thrift
deserializer.fromString(request2, json);
} catch (TException e) {
e.printStackTrace();
}
log.info(json);
------ 本文结束------

本文标题:RPC框架 - Thrift协议定义

文章作者:Perkins

发布时间:2019年08月19日

原始链接:https://perkins4j2.github.io/posts/45936/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。