目錄:
一、開發前准備
1、安裝golang的Thrift包:
2、產生協議庫:
3、生成開發庫
二、go語言實現
1、服務器端
2、客戶端程序
三、Java版實現
1、Java服務器版
2、Java客戶端版
每種語言都有自己最擅長的領域,Golang 最適合的領域就是服務器端程序。
做為服務器端程序,需要考慮性能同時也要考慮與各種語言之間方便的通訊。采用http協議簡單,但性能不高。采用TCP通訊,則需要考慮封包、解包、粘包等等很多因素,而且想寫個高效的TCP服務,也很難。
其實,對於此類需求,采用RPC(Remote Procedure Call Protocol)編程最靠譜。使用 RPC 編程被認為是在分布式環境中運行的客戶機和服務器應用程序之間進行可靠通信的最強大、最高效的方法之一。
Golang內置了對RPC支持,但只能適用於go語言程序之間調用。如果go語言能使用Thrift開發,那麼就如虎添翼了。可惜,thrift雖然很早就提供了golang的代碼,但一直都存在各種問題無法正確執行……直到0.9.1版本的發布!
最近,Apache Thrift 0.9.1正式發布了。新版的Thrift終於對Golang提供了完美的支持。經過實驗,服務器端、客戶端已經完美支持跨語言調用,且性能、尤其是內存占用上,編譯型語言的特點展現出來,比java版的實現強了很多。
下面,我們采用golang實現一個Thrift的Server端和Client端程序。
一、開發前准備
1、安裝golang的Thrift包:
go get git.apache.org/thrift.git/lib/go/thrift
2、產生協議庫:
這是我定義的測試用IDL,為檢驗兼容性,采用了多種數據結構:
RpcService.thrift
namespace go demo.rpc
namespace java demo.rpc
// 測試服務
service RpcService {
// 發起遠程調用
list<string> funCall(1:i64 callTime, 2:string funCode, 3:map<string, string> paramMap),
}
3、生成開發庫
下載開發庫編譯器 http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.1/thrift-0.9.1.exe
thrift -gen go RpcService.thrift
自動生成出的源碼結構如下:
其中 constants.go、rpc_service.go、ttypes.go 是協議庫,編寫程序需要用到。rpc_service-remote.go 是自動生成的例程,可以不用。