thriftThrift的二三事程序员

Thrift入门

2017-07-22  本文已影响131人  雁宇

简介

Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。
它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。
另外,Thrift早期由Facebook开发,目前已成为Apache软件基金会的开源项目。

基本架构

类似于计算机网络,Thrift包含一套完整的栈来创建客户端和服务端程序。

Thrift的栈结构

使用

快送入门

根据官网,使用Thrift前需要下载Thrift并且构建和安装Thrift编译器。
在使用Thrift进行编程时,需要以下几步(详细过程可见Apache Thrift Tutorial):

  1. 创建.thrift文件
  2. 使用Thrift编译器编译为特定语言的源码
  3. 根据源码实现服务的功能

其实,如果你是一个Java开发者,使用Thrfit有一个更好的方式:借助Swift(并不是指苹果的Swift语言)。使用Swift,你可以告别书写thrift文件并且进行多余的一步编译,而且也不用忍受由thrift生成的冗长的Java文件,一切都可以用Java代码和注解搞定😎

样例代码thrift_demo已提交码云

Thrift IDL

IDL即为Interface Description Language,对于Thrift有其特定的语法。详细内容可以参考:Thrift interface description language

PS:若采用Jetbrains出品的IDE,可以安装Thrift Support插件来对Thrift语法做出支持。

原有数据类型

基本类型

容器类型

可定制数据类型

结构体类型

struct关键字定义,需要给字段提供数字标签,示例如下:

struct PersonVo{
    1:required i32 id,
    2:required string name,
    3:required double wealth
}

说明:

  1. 字段可以采用=来设置默认值。
  2. 数字标签不要轻易修改。在修改时可以考虑新加一个数字标签,丢弃原有的字段。
  3. 字段前标识required表示,该字段必填,自然传输时必然会序列化;字段前无标识,表示可以不填充,但一定会序列化;字段前标识optional表示该字段,可以不填充,并且不填充也不会序列化。

异常类型

异常类型的定义和结构体基本相同,但采用exception作为关键字。

枚举类型

采用enum作为关键字定义,示例如下:

enum ColorEnum{
    WHITE = 0;
    BLACK = 1;
    BLUE = 2;
}

常量类型

采用const关键字定义,示例如下:

const i32 INT_CONST = 1234; 

服务类型

使用service关键字定义,用于描述接口,类似于Java中的接口文件。示例如下:

service PersonService {
    PersonDomain.PersonVo get(1:i32 id);
    oneway void add(1:PersonDomain.PersonVo pv);
}

说明:

文件间关系

定义本文件的所处的命名空间可以采用namespace关键字,其效果同Java中的包。使用命名空间后需指定语言类型,如java。示例如下:

namespace java demo.thrift

使用其他文件的内容需要使用include后接其他文件名,其他文件名需要用单引号修饰。示例如下:

include 'PersonDomain.thrift'

其他

传输体系

传输体系由传输协议和传输方式构成,具体内容在和 Thrift 的一场美丽邂逅一文中有更为详细的说明,这里就是粗略枚举一些。

传输协议

传输方式

服务器

Thrift自带了一些好用的服务器程序,以Java为例,大致有下面这些:

参照

上一篇 下一篇

猜你喜欢

热点阅读