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();
}
}
}