Thrift快速入门开发demo
一、认识Thrift
thrift是什么?一个RPC 代码生成框架,使用它的IDL(Interface Defination Language,接口定义语言)定义你想要实现的接口,然后它就会生成对应语言的远程调用框架代码,用户只需要实现接口逻辑,不用关心具体的细节。
tutorial:http://digital-madness.in/blog/wp-content/uploads/2012/11/BSD_08_2013.8-18.pdf
二、快速入门开发一个Demo
2.1 开发逻辑
- 编写IDL文件
- 使用IDL文件生成对应Java代码
- 拷贝Java代码到对应项目目录
- 实现接口逻辑
- 编写server端
- 编写client端
thrift --gen java /users/ccl/workspace/demo
2.2 编写IDL文件
Thrift具体语法参考官方文档Thrift interface description language
- data.thrift
namespace java thrift.gentypedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string Stringstruct Person{1: optional String username;2: optional int age;3: optional boolean marriage;
}exception DataException{1: optional String massage;2: optional String callback;3: optional String date;
}service PersonService{Person getPersonByUsername(1: required String username) throws(1: DataException dataException);void savePerson(1:required Person person) throws(1: DataException dataException);}
以下逐行解释:
namespace java thrift.gen
namespace定义命名空间,是一个关键字。生成的java代码会放在thrift.gen
包目录下。
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
IDL语言定义了一系列通用的基本数据类型,对应多种语言的数据类型。这里使用typedef关键字显示地为idl和java中的数据类型做一个别名替换,方便后续代码编写。
struct Person{1: optional String username;2: optional int age;3: optional boolean marriage;
}
struct结构体对应java中的class。这里我们定义了一个Person类。IDL规定定义数据要包含类似 1:
的位置提示符。optional
表示可选的,这里无多大意义。
exception DataException{1: optional String massage;2: optional String callback;3: optional String date;
}
exception关键字定义了异常类型,用法和struct一致,只是关键字名称改变。
service PersonService{Person getPersonByUsername(1: required String username) throws(1: DataException dataException);void savePerson(1:required Person person) throws(1: DataException dataException);
}
service关键字定义了一个服务。生成的java代码也是一个类,类中定义了两个方法。我们需要实现这两个方法的接口。
2.3 生成java代码
两种方法:
- 自己安装thrift然后运行命令
thrift --gen java gen-java
- 生成的代码就会放在gen-java目录下
- 在线thrift编译平台
- 版本号要与jar包一致
不出意外,会生成
- DataException.java
- Person.java
- PesonService.java
三个文件,放在package thrift.gen下。这三个类都封装好许多底层代码。
2.4 实现接口逻辑
现在,我们需要自己实现PersonService类中的两个方法。
在pom.xml下引入maven依赖
<dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><version>0.9.3</version>
</dependency>
版本号根据安装的thrift决定。
- PersonServiceImpl.java
import org.apache.thrift.