Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。
Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
Thrift 脚本可定义的数据类型包括以下几种类型:
基本类型:
bool:布尔值,true 或 false,对应 Java 的 boolean
byte:8 位有符号整数,对应 Java 的 byte
i16:16 位有符号整数,对应 Java 的 short
i32:32 位有符号整数,对应 Java 的 int
i64:64 位有符号整数,对应 Java 的 long
double:64 位浮点数,对应 Java 的 double
string:未知编码文本或二进制字符串,对应 Java 的 String
结构体类型:
struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
容器类型:
list:对应 Java 的 ArrayList
set:对应 Java 的 HashSet
map:对应 Java 的 HashMap
异常类型:
exception:对应 Java 的 Exception
服务类型:service:对应服务的类
1.下载thrift.exe(我的是window7)
2.下载相关jar包
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.9.3</version>
</dependency>
3.编写Hello.thrift
Hello.thrift:
service Hello{
string helloString(1:string para)
i32 helloInt(1:i32 para)
bool helloBoolean(1:bool para)
void helloVoid()
string helloNull()
}
把该文件和thrift.exe放在同一个目录下,进入cmd模式,输入thrift.exe --gen java Hello.thrift
跟着会自动生成gen-java文件夹,把里面的.java文件导入eclipse
4.编写实现类
HelloServiceImpl:
package com.yingze.thrift;
import org.apache.thrift.TException;
/**
* @ClassName: HelloServiceImpl
* @Description: TODO()
* @author liang
* @date 2016年6月29日 下午3:07:50
*
*/
public class HelloServiceImpl implements Hello.Iface{
public String helloString(String para) throws TException {
return para;
}
public int helloInt(int para) throws TException {
return para;
}
public boolean helloBoolean(boolean para) throws TException {
return para;
}
public void helloVoid() throws TException {
System.out.println("HelloServiceImpl: helloVoid()...");
}
public String helloNull() throws TException {
return null;
}
}
5.编写服务端测试main方法
HelloServiceServer:
package com.yingze.thrift;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
/**
* @ClassName: HelloServiceServer
* @Description: TODO()
* @author liang
* @date 2016年6月29日 下午3:13:09
*
*/
public class HelloServiceServer {
public static void main(String[] args) {
try {
TServerSocket serverTransport = new TServerSocket(7911);//设置服务器端口为7911
/*协议层TProtocol:
TBinaryProtocol – 二进制编码格式进行数据传输。
TCompactProtocol – 高效的编码方式,使用类似于protobuffer的Variable-Length Quantity (VLQ) 编码(可以节省传输空间,使数据的传输效率更高)对数据进行压缩。 关于VLQ了解更多(http://en.wikipedia.org/wiki/Variable-length_quantity)
TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。*/
Factory proFactory = new TBinaryProtocol.Factory();
//关联处理器与接口服务的实现
TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(processor);
tArgs.protocolFactory(proFactory);
/*服务端类型 :
TSimpleServer - 单线程服务器端使用标准的阻塞式I/O。
TThreadPoolServer - 多线程服务器端使用标准的阻塞式I/O。
TNonblockingServer – 多线程服务器端使用非阻塞式I/O,并且实现了Java中的NIO通道。*/
TServer server = new TSimpleServer(tArgs);
System.out.println("Start server on port 7911....");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
6.编写客户端测试main方法
package com.yingze.thrift;
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;
/**
* @ClassName: HelloServiceClient
* @Description: TODO()
* @author liang
* @date 2016年6月29日 下午3:18:21
*
*/
public class HelloServiceClient {
public static void main(String[] args) {
try {
/*传输层TTransport:
TSocket- 使用阻塞式I/O进行传输,也是最常见的模式。
TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。
TZlibTransport- 使用执行zlib压缩,不提供Java的实现。
TNonblockingTransport-使用非阻塞方式,用于构建异步客户端。*/
TTransport transport = new TSocket("localhost", 7911);//设置调用的服务器为本地,端口为7911
transport.open();
/*协议层TProtocol:
TBinaryProtocol – 二进制编码格式进行数据传输。
TCompactProtocol – 高效的编码方式,使用类似于protobuffer的Variable-Length Quantity (VLQ) 编码(可以节省传输空间,使数据的传输效率更高)对数据进行压缩。 关于VLQ了解更多(http://en.wikipedia.org/wiki/Variable-length_quantity)
TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。*/
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
client.helloVoid();
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}