Thrift初探一(入门以及IDL规范)

本文介绍Apache Thrift的基本使用流程,从下载与安装Thrift编译工具开始,到编写.thrift文件并生成代码。详细解析Thrift类型、结构体(struct)、服务(service)的定义方法,以及IDL文档规范,帮助读者快速掌握Thrift RPC接口的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Thrift入门

 1.下载Apache Thrift

      下载一份Windows下的Thrift 编译工具 (最新版) 

          http://www.apache.org/dyn/closer.cgi?path=/thrift/0.10.0/thrift-0.10.0.exe

 2.构建和按照Apache Thrift 编译工具

         将exe放在windows下指定好的安装目录即可

  3.编写一份.thrift文件

       你将新建一份.thrift后缀的文件。此文件由thrift 类型和服务组成的接口定义。Thrift定义的服务有服务器进行实现,供客户端调用。Thrift的编译器将依据thrift文件进行生成源代码,由不同的客户端和服务器使用。

        运行命令(跳转到安装目录):

thrift-0.10.0.exe --gen <language> <Thrift filename>

简单的例子  (test.thrift):

namespace java com.fan.message
/**
* generrate code by thrift
* define quaut javabean
* define service ThrfitTest
*
**/
struct message{
  1:i32 number,
  2:string msgtype,
  3:bool status,
  4:string name
}



/**
*生成服务接口
**/
service MessageDeal{
    /**
	* 执行
	**/
    void execute(1:i32 key,2:string value),
	i32 add(1:i32 a,2:i32 b),
	bool getStatus()
}

 

二、thrift接口文件的编写      

     thrift文件是有Thrift特定的接口定义语言(interface description language IDL)和Thrift 类型。一个Thrift IDL支持Thrift 代码生成多种目标语言定义的结构(Structs)和服务(Services)在IDL文件中。

Thrift Types

基础类型:
bool: A boolean value (true or false)
byte: An 8-bit signed integer
i16: A 16-bit signed integer
i32: A 32-bit signed integer
i64: A 64-bit signed integer
double: A 64-bit floating point number
string: A text string encoded using UTF-8 encoding

Thrift的基础类型和容器类型在java下映射对应关系如下:
bool: boolean
binary: byte[]
byte: byte
i16: short
i32: int
i64: long
double: double
string: String
list<t1>: List<t1>
set<t1>: Set<t1>
map<t1,t2>: Map<t1, t2>

 

IDL 文档规范

Include | CppInclude | Namespace

 include

inclue "common.thrift"
要点:
  1.导入common.thrift文件,最终将common.thrift中的语句与新建此文件一起生成

namespace

namespace java com.fan.message
namesapce py cn.fan
要点:
 1.支持语言'cpp' | 'java' | 'py' | 'perl' | 'rb' | 'cocoa' | 'csharp'
 2.thrift生成统一的结构或者模块

const

const i32 INT_CONST = 1234;

enum

Enum 语法: 'enum' Identifier '{' (Identifier ('=' IntConstant)? ListSeparator?)* '}'
enum Operation {
  ADD = 1,
  SUBTRACT = 2,
  MULTIPLY = 3,
  DIVIDE = 4
}
 

Struct

Struct语法: 'struct' Identifier 'xsd_all'? '{' Field* '}'
要点:
  1.struct中每个字段必须有一个唯一的正整数标识符加冒号,如:1:
  2.字段可以有required or optional作为修饰符
  3.struct中可以包含其他的structs
  4.字段可以有一个默认值
  5.一个thrift文件中可以定义多个structs
  6.struct 类似与java中的javabean,所以struct 唯一标识、字段命名规范都与Java中类似
例子:
struct Location {                           
    1: required double latitude;
    2: required double longitude;
}

struct City{
    1: required i32 userId;                
    2: required string userName;            
    3: required string text;
    4: optional Location loc;                
    16: optional string language = "english" 
}

Exception

Exception语法: 'exception' Identifier '{' Field* '}'
exception InvalidOperation {
  1: i32 whatOp,
  2: string why
}

Service

Service语法:'service' Identifier ( 'extends' Identifier )? '{' Function* '}'
Function语法: 'oneway'?FunctionType Identifier '('Field*')'?Throws  ListSeparator?
FunctionType语法: FieldType | 'void'
Throws语法: 'throws' '(' Field* ')'
要点:
   1.service支持继承其他service,作为RPC的接口定义,包括方法
   2.service中的方法。a)返回值支持void、原始类型(i32、bool)、struct等
                    b)方法参数正常的的字段定义
                    c)可以抛出自定义异常throws
   3)service中的每个方法可以用逗号和分号结束
   4)方法中定义 onway标识服务器无需响应(onway),返回值必须为void

例子:
service Twitter {
    void ping(),                                                             
    bool postTweet(1:Tweet tweet) throws (1:TwitterUnavailable unavailable), 
    TweetSearchResult searchTweets(1:string query);                           
    oneway void zip()                                                        
}

Comments

# 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.

要点:
    支持Shell、C++、Java类型注释

参考:

     http://thrift.apache.org/docs/idl

转载于:https://my.oschina.net/hbt/blog/1544988

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值