thrift最先由facebook開發,後來貢獻給了apache。thrift主要解決跨語言調用的問題。php
thrift和protobuf,都解決了一個問題就是誇語言數據結構的定義,json也解決了跨語言的數據結構定義,只不過json都是字符串的,傳輸的開銷和解析的開銷可能有些大。那麼想傳輸二進制的話怎麼辦呢,能夠本身定義數據結構,好比你們熟知的網絡協議就是這麼定出來的,前1個字節表明啥啥啥,第二個字節表明啥啥啥,而後客戶端和服務端都遵照這個協議。在沒有thrift或者profobuf以前好多cs程序就是這麼幹的。可是這麼幹很累啊,還得寫文檔,並且開發時候也很差記,很差交流。後來人們想出了個辦法,就是用一個相似json格式的文件定義數據結構,而後自動生成代碼去處理二進制的轉換,這樣人們既能夠用好讀的格式定義數據結構,又能夠高效的使用,因而就誕生了protobuf和thrift這類東西。protobuf到此爲止了,thrift又把服務端程序和客戶端程序也順手加進去能夠自動生成了,這樣程序員就只負責寫業務邏輯,其餘的傳輸啊神馬的都自動生成了,這就是protobuf和thrift的區別。這樣thrift就有了全套的RPC機制,java
有人認爲是團隊須要,不一樣的人擅長不一樣的語言,我認爲從架構的角度想,有2點好處python
是的,能夠用json,好多api都是用json形式的,如今也流行REST,其實也是蠻方便的,可是有幾個缺點linux
thrift的安裝分兩部分程序員
這個其實不必編譯安裝的,直接下載windows版的就行。 在linux上編譯安裝也還比較好裝,可是可能會缺這缺那,缺啥用yum裝便可算法
./configure make make install
語言包都在源碼的lib目錄下,因此下載linux版本纔有,windows版本那個只是個編譯好的thrift編譯器apache
好比javajson
cd thrift源碼/lib/java ant 會生成libthrift-0.9.3.jar
再好比pythonwindows
cd thrift源碼/lib/py python setup.py install
service HelloService{ string sayHello(1:string username) }
而後用thrift編譯:api
import org.apache.thrift.TException; public class helloImp implements HelloService.Iface { @Override public String sayHello(String username) throws TException { System.out.println(username); return username; } }
這裏這個HelloService就是thrift生成的java文件 3. 寫服務端
import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TSimpleServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; public class Server { public void start() { TProcessor tpProcessor = new HelloService.Processor<HelloService.Iface>(new helloImp()); TServerSocket serverTransport; try { serverTransport = new TServerSocket(8889); TServer.Args args = new TServer.Args(serverTransport); args.processor(tpProcessor); args.protocolFactory(new TBinaryProtocol.Factory()); TServer server = new TSimpleServer(args); System.out.println("thrift server start"); server.serve(); } catch (TTransportException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.start(); } }
4.寫客戶端 以python爲列子
import sys import glob from hello import HelloService from thrift import Thrift from thrift.transport import TSocket from thrift.transport import TTransport from thrift.protocol import TBinaryProtocol # Make socket transport = TSocket.TSocket('localhost', 8889) # Buffering is critical. Raw sockets are very slow transport = TTransport.TBufferedTransport(transport) # Wrap in a protocol protocol = TBinaryProtocol.TBinaryProtocol(transport) # Create a client to use the protocol encoder client = HelloService.Client(protocol) # Connect! transport.open() rs = client.sayHello('luyu') print rs
其餘語言版本怎麼寫????
在源碼的tutorial目錄下有各類語言的例子
持續更新 未完待續...