Thrift是跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目
最新版本:0.9.2由于需要运行在Java 1.7 所以使用了0.8.0版本 下载地址如下:http://archive.apache.org/dist/thrift/0.8.0/
在linux上安装如下:
1 执行tar xvf thrift-0.8.0.tar.gz
2 cd thrift-0.8.0
3 执行:./configure & make
4 执行:make install
在thrift-0.8.0同级目录下创建:thrift文件夹
1 cd thrift
2 生成Hello.thrift
namespace java cdv
service Hello{
string helloString(1:string para)
i32 helloInt(1:i32 para)
bool helloBollean(1:bool para)
void helloVoid()
}
3 执行:thrift -gen java Hello.thrift
在同级目录中生成 gen-java目录,在该目录下生成cdv/Hello.class文件
在Eclipse中引入:
1 cdv/Hello.class文件
2 进入:thrift-0.8.0/lib/java目录,执行:ant 命令进行打包在build目录下生成:libthrift-0.8.0.jar
3 eclipse中引入libthrift-0.8.0.jar slf4j-log4j12-1.5.8.jar slf4j-api-1.5.8.jar log4j-1.2.14.jar
4 即可在Eclipse中开发Server 和 Client端代码
Server端:
1 实现Hello.Iface接口
package com.cdv.hello;
import org.apache.thrift.TException;
import cdv.Hello.Iface;
public class HelloServerImpl implements Iface {
@Override
public String helloString(String para) throws TException {
// TODO Auto-generated method stub
System.out.println(para);
return para;
}
@Override
public int helloInt(int para) throws TException {
// TODO Auto-generated method stub
System.out.println(String.valueOf(para));
return 1;
}
@Override
public boolean helloBollean(boolean para) throws TException {
// TODO Auto-generated method stub
System.out.println(String.valueOf(para));
return false;
}
@Override
public void helloVoid() throws TException {
// TODO Auto-generated method stub
System.out.println("空值");
}
}
2 接受客户端请求
package com.cdv.hello;
import org.apache.thrift.TProcessor;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
import cdv.Hello;
public class ServerThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while( true ){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
try {
// 设置服务端口为 7911
TServerSocket serverTransport = new TServerSocket(7911);
// 关联处理器与 Hello 服务的实现
TProcessor processor = new Hello.Processor<HelloServerImpl>(new HelloServerImpl());
TServer server = new TThreadPoolServer(new Args(serverTransport).processor(processor));
System.out.println("Start server on port 7911...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
}
3 创建服务端线程
package com.cdv.hello;
public class HelloServiceServer {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
Thread _thread = new Thread(new ServerThread()) ;
_thread.start();
}
}
客户端代码:
package com.org;
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;
import cdv.Hello;
public class Client {
public static void main( String[] args ) {
try {
// 设置调用的服务地址为本地,端口为 7911
TTransport transport = new TSocket("localhost", 7911);
transport.open();
// 设置传输协议为 TBinaryProtocol
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
// 调用服务的 helloVoid 方法
client.helloVoid();
System.out.println(client.helloInt(28)) ;
System.out.println(client.helloBollean(true)) ;
System.out.println(client.helloString("测试")) ;
client.send_helloString("测试0101");
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}