一、Apache Thrift 详解

Thrift:
一、Thrift介绍
1、Thrift是用于各个服务之间的RPC通信,支持跨语言,支持C++ java python....
2、Thrift是一个典型的CS结构,客户端和服务器端可以使用不同的语言来开发,中间是通过IDL
(Interface Description Language)来关联客户端和服务器端。
二、数据类型
1、基本类型
    bool,布尔型,1个字节;
    byte,有符号单字节;
    i16,有符号16位整型;
    i32,有符号32位整型;
    i64,有符号64位整型;
    double,64位浮点数;
    string,字符串;
    binary,字节数组;
    注意:不支持无符号的类型,因为很多编程语言不存在无符号的类型,比如java

2、容器类型
    map<t1,t2>,字典;
    list<t1>,列表; 元素可以重复
    set<t1>,集合;不可重复
    注意:容器中的元素类型可以是除了service 以外的任何合法thrift类型(包括结构体和异常)。

3、结构体 struct
Thrift结构体在概念上同C语言结构体类型—-一种将相关属性聚集(封装)在一起的方式;
在面向对象语言中,thrift结构体被转换成类。
struct Work {
  1: i32 num1 = 0,
  2: i32 num2,
  3: Operation op, 
  4: optional string comment,
}
结构体中,每个字段包含一个整数ID,数据类型、字段名,和一个可选的默认值。字段还可以声明
为"optional",当该字段没有设置的时候,不会被序列化输出;规范的struct定义中的每个域均
会使用required或者optional关键字进行标识。
如果required标识的域没有赋值,thrift将给予提示。如果optional标识的域没有赋值,该域将
不会被序列化传输。如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺
省值。

4、异常 exception
异常在语法和功能上类似于结构体,只不过异常使用关键字exception而不是struct关键字声明。
但它在语义上不同于结构体,当定义一个RPC服务时,开发者可能需要声明一个远程方法抛出一个异常。
exception InvalidOperation {
  1: i32 what,
  2: string reason 
}

5、服务 service 

在流行的序列化/反序列化框架(如protocol buffer)中,Thrift是少有的提供多语言间RPC服务的框架。
Thrift编译器会根据选择的目标语言为server产生服务接口代码,类似java中的inteface。
service中的函数,其参数列表的定义方式与struct完全一样;
service支持继承,一个service可使用extends关键字继承另一个service,struct不支持继承;

6、枚举类型 enum
enum TweetType {
 
TWEET,         // 编译器默认从1开始赋值
RETWEET = 2,  // 可以赋予某个常量某个整数
DM = 0xa,     //允许常量是十六进制整数
REPLY         // 末尾没有逗号
}        


struct Tweet {
1: required i32 userId;
2: required string userName;
3: required string text;
4: optional Location loc;
5: optional TweetType tweetType = TweetType.TWEET // 给常量赋缺省值时,使用常量的全称
16: optional string language = "english"
}
注意:枚举常量必须是32位的正整数

7、常量 const
Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。
const i32 INT_CONST = 1234;    // 分号是可选的
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
PS:跟C语言类似,Thrift也支持typedef语句,例如:
typedef i32 MyInteger

8、命名空间
Thrift中的命名空间同C++中的namespace类似,它们均提供了一种组织(隔离)代码的方式。
因为每种语言均有自己的命名空间定义方式(如python中有module),
thrift允许开发者针对特定语言定义namespace:
namespace cpp com.example.project 
namespace java com.example.project 

9、Thrift工作原理
   (1)、如何实现多语言之间的通信?
        数据传输使用socket(多种语言均支持),数据再以特定的格式(String等)发送,接受方
        语言进行解析。
    (2)、定义thrift的文件,由thrift文件(IDL)生成双方语言的接口,model,再生成的model
        以及接口中会有编解码的代码。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值