Thrift 是facebook的核心技术之一,使用不同开发语言开发的系统可以通过该框架实现彼此间的通讯,开发者只需编辑一份thrift脚本,即可自动获得其它开发语言的代码(比如 c++ java python ruby c# haskell ocmal erlang cocoa php squeak).同时提供了完整的rpc service framework,可以很方便的直接构建服务。
简单实现一个User Activity的log服务和客户端,只是作简单的演示,所以没有实现异步调用等缓冲机制(比如Queue),具体实现可以根据自己的情况定制。
目标:实现一个user activity log 服务。
step 1:安装Thrift
step 2:编写Thrift脚本,存为DataReceiver.thrift
namespacejavathrift.test
structActivity{ 1:i64uid, 2:i32type, 3:i64timestamp, 4:map<string,string>maps, }
service DataReceiver{ onewayvoidpostData(1:Activityac), onewayvoidpostDataArray(1:list<Activity>arg), }
|
step 3:生成代码
thrift--genjavaDataReceiver.thrift |
step 4:根据需要,编写自己的代码
a.server实现类
packagecom.happyelements.DataCenter;
importjava.util.List;
importorg.apache.thrift.TException;
publicclassDataServerImplimplementsDataReceiver.Iface{
@Override publicvoidpostData(Activityac)throwsTException{ // TODO Auto-generated method stub //这里写自己的定制代码
}
@Override publicvoidpostDataArray(List<Activity>arg)throwsTException{ // TODO Auto-generated method stub //这里写自己的定制代码 longtime=System.currentTimeMillis(); System.out.println("postDataArray called timestamp: "+time); List<Activity>activities=arg; System.out.println("len = "+activities.size()); for(inti=0;i<activities.size();i++){ Activityac=activities.get(i); System.out.println(ac.getUid()); System.out.println(ac.getType()); System.out.println(ac.getMaps().get("foo")); } } }
|
b.服务器
packagecom.happyelements.DataCenter;
importorg.apache.thrift.protocol.TBinaryProtocol; importorg.apache.thrift.protocol.TBinaryProtocol.Factory; importorg.apache.thrift.server.TServer; importorg.apache.thrift.server.TThreadPoolServer; importorg.apache.thrift.transport.TServerSocket; importorg.apache.thrift.transport.TTransportException;
publicclassDataServer{
privatevoidstart(){ try{ TServerSocket serverTransport=newTServerSocket(8811); DataReceiver.Processor processor=newDataReceiver.Processor(newDataServerImpl()); Factory protFactory=newTBinaryProtocol.Factory(true,true); TServerserver=newTThreadPoolServer(processor,serverTransport,protFactory); System.out.println("Starting server on port 8811 ..."); server.serve(); }catch(TTransportException e){ e.printStackTrace(); }catch(Exceptione){ e.printStackTrace(); } } /** * @param args */ publicstaticvoidmain(String[]args){ // TODO Auto-generated method stub
DataServer srv=newDataServer(); srv.start(); }
}
|
c.客户端
packagecom.happyelements.DataCenter;
importjava.util.ArrayList; importjava.util.HashMap; importjava.util.List; importjava.util.Map;
importorg.apache.thrift.TException; importorg.apache.thrift.protocol.TBinaryProtocol; importorg.apache.thrift.protocol.TProtocol; importorg.apache.thrift.transport.TSocket; importorg.apache.thrift.transport.TTransport; importorg.apache.thrift.transport.TTransportException;
importcom.happyelements.DataCenter.DataReceiver.Client;
publicclassTestClient{ privatevoidstart(){ TTransport transport; try{ transport=newTSocket("localhost",8811); TProtocol protocol=newTBinaryProtocol(transport); Client client=newClient(protocol); transport.open(); List<Activity>la=newArrayList<Activity>(); Activityac=newActivity(); ac.setType(1); ac.setUid(12345); Map<String,String>map=newHashMap<String,String>(); map.put("foo","blablabla..."); ac.setMaps(map);
la.add(ac); client.postDataArray(la); transport.close(); }catch(TTransportException e){ e.printStackTrace(); }catch(TException e){ e.printStackTrace(); } }
publicstaticvoidmain(String[]args){ TestClient c=newTestClient(); c.start(); } }
|
以上代码需要的jar包:
libthrift.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.15.jar
ok. thats all.