thrift是一个RPC框架,最初由Facebook开发,后来移交apache组织管理。这里用thrift写了一个最简单的例子,服务器和客户端都用java,供大家参考。
0. 下载thrift
首先需要下载thrift编译器,它把thrift定义编译成对应语言。在thrift官网上有下载http://thrift.apache.org/download
这里我下载的是
Thrift compiler for Windows (thrift-0.9.2.exe)
1. 定义接口
test.thrift:
service TestService {
void log(1:string text);
i32 add(1:i32 a,2:i32 b);
}
总体上看,thrift接口定义文件与c++语言是比较类似的。有几点需要注意的说明一下:
- 接口都定义在service中
- 函数的参数需要标示出他们的位置,否则在生成代码时会有警告:
No field key specified for text, resulting protocol may have conflicts or not be backwards compatible!
- thrift定义了一套类型系统:
- 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
2. 生成代码
thrift官方支持如下这些语言,你自己也可以让自己的语言支持thrift,官网有相关文档
- Actionscript 3.0
- C++
- CSharp
- D
- Delphi
- Go
- Graphviz
- Haxe Framework
- Haskell
- Java
- Javascript
- Node.js
- OCaml
- Perl
- PHP
- Python
- Ruby
这里我使用的是java语言。在test.thrift的目录运行命令:
thrift -r --gen java test.thrift
就会在当前目录生成一个gen-java文件夹,其中有一个TestService.java
3. 下载thrift的java库
thrift对每个支持的语言都实现了支持库,官网上只提供了源码,需要自己编译,这里我们直接去maven仓库上下载。
这里推荐一个网站mvnrepository,可以搜索java库,而且有对应的maven,ant,gradle代码可以直接复制使用。
搜索thrift可以找到这个页面:
http://www.mvnrepository.com/artifact/org.apache.thrift/libthrift/0.9.2
可以写一个ant和ivy脚本:
build.xml:
<project xmlns:ivy="antlib:org.apache.ivy.ant" name="ThriftTest" default="resolve">
<target name="resolve">
<ivy:retrieve />
</target>
</project>
ivy.xml:
<ivy-module version="2.0">
<info organisation="" module="ThriftTest"/>
<dependencies>
<dependency org="org.apache.thrift" name="libthrift" rev="0.9.2"/>
<dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.7"/>
</dependencies>
</ivy-module>
在当前目录运行ant
,就会在lib目录中下载thrift以及它所依赖的库。
commons-codec-1.6.jar
commons-logging-1.1.1.jar
httpclient-4.2.5.jar
httpcore-4.2.4.jar
libthrift-0.9.2.jar
libthrift-0.9.2-javadoc.jar
log4j-1.2.17.jar
servlet-api-2.5.jar
slf4j-api-1.5.8.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.7.7.jar
slf4j-log4j12-1.7.7-javadoc.jar
slf4j-log4j12-1.7.7-sources.jar
注意一点:把slf4j-api-1.5.8.jar删掉,这里我们该用新版的sl4j
你也可以下载我打包的lib(下载地址)
4. 新建eclipse工程
新建eclipse工程,并把TestService.java复制进来,还有lib目录也复制进来。
在eclipse中刷新工程,点开lib目录,把所有jar加入build path:
5. 编写Handler类
你需要实现之前定义的接口,java语言中的做法是实现xxx.Iface,xxx是你定义的service名。
TestServiceHandler.java
import org.apache.thrift.TException;
public class TestServiceHandler implements TestService.Iface{
@Override
public void log(String text) throws TException {
System.out.println(text);
}
@Override
public int add(int a, int b) throws TException {
return a+b;
}
}
6. 编写Server
Server.java:
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;
public class Server {
public static void main(String[] args) {
TestServiceHandler handler = new TestServiceHandler();
TestService.Processor<TestServiceHandler> processor = new TestService.Processor<TestServiceHandler>(handler);
try {
TServerTransport serverTransport = new TServerSocket(8080);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
7. 编写Client
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
public class Client {
public static void main(String[] args) {
TTransport transport = new TSocket("localhost", 8080);
try {
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
TestService.Client client = new TestService.Client(protocol);
client.log("begin");
System.out.println(client.add(1,2));
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}
8. 运行
先运行Server,然后运行Client,可以看到Server的控制台输出begin
,Client控制台输出3
参考资料
- Apache Thrift - Java