其實以前thrift和node.js接觸都不多,由於最近項目要用到node.js,而且須要涉及到java與node.js的通信,就想到了thrift。由於使用的系統是Lion,因此這篇文章也從安裝和配置方面,記錄下MAC平臺下這些服務的搭建方式。 html
node.js是一種能夠在後端運行的js語言,由於使用了回調機制避免了線程膨脹的問題,因此在處理簡單而且高性能要求的web服務方面有必定優點。具體能夠看這篇文章 java
我爲何向後端工程師推薦Node.js。http://nodejs.org/,有MAC下的pkg安裝包。最新版彷佛是0.6.7。 node
thrift是facebook提出的一種跨平臺遠程通訊框架,效率比較高。thrift能夠從http://www.apache.org/dyn/closer.cgi?path=/thrift/0.8.0/thrift-0.8.0.tar.gz下載到,須要編譯安裝,目前最新彷佛是0.8.0。這個版本跟svn下來的版本不一樣,不須要執行./bootstrap進行初始化,直接使用./configure編譯並安裝就能夠了。 git
thrift的使用比較複雜,首先須要編寫一個thrift文件,用於肯定鏈接雙方的接口。具體的thrift文件寫法能夠參考http://wiki.apache.org/thrift。下面是一個簡單的例子: web
Test.thrift apache
namespace java net.johnc.thrift service Test { voidping(1: i32 length) }使用thrift編譯成java文件:thrift --gen java Test.thrift。完成後生成一個java文件,大概是這樣子:
public class Test { public interfaceIface { public void ping(int length)throws org.apache.thrift.TException; } }thrift原生支持node.js,因此在編譯時,只用使用thrift --gen js:node Test.thrift就能夠了。編譯完以後生成Test.js和Test_types.js兩個文件。
var Thrift = require('thrift').Thrift; var ttypes = require('./Test_types'); //HELPER FUNCTIONS AND STRUCTURES var Test_ping_args =function(args) { this.length =null; if(args) { if(args.length !== undefined) { this.length = args.length; } } }最後,須要在node.js里加載thrift庫,使用npm install thrift命令就能夠了。準備工做到此爲止,下一步就能夠進行實戰了!
這裏咱們使用java當客戶端,node.js當服務端,客戶端代碼以下: npm
package apache.thrift; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; /** * @author cairne * @date Jan 11, 2012 */ public class TestUserStorage { /** * @param args */ public static void main(String[] args) { TTransport transport =new TFramedTransport(new TSocket("localhost",9799)); try{ transport.open(); }catch(TTransportException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } TProtocol protocol =new TBinaryProtocol(transport); UserStorage.Client client =new UserStorage.Client(protocol); try{ client.store(new UserProfile(1,"","")); System.out.println(client.retrieve(1)); }catch(TException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }注意兩個地方:thrift在java中的實現不少,可是node-thrift模塊目前只支持TFramedTransport,TBinaryProtocol,因此使用其餘實現時server會出錯。另外transport是須要先open進行鏈接的。
node.js代碼: bootstrap
var thrift = require('thrift'); var UserStorage = require('./gen-nodejs/UserStorage.js'), ttypes = require('./gen-nodejs/user_types'); var users = {}; var server = thrift.createServer(UserStorage, { store:function(user, success) { console.log("server stored:", user.uid); users[user.uid] = user; success(); }, retrieve:function(uid, success) { console.log("server retrieved:", uid); success(users[uid]); }, }); server.listen(9799);輸出結果:
client: UserProfile(uid:1, name:, blurb:) 後端
server: server stored: 1
server retrieved: 1 框架
參考文章:http://liuchangit.com/development/407.html