thrift詳解

背景

thrift最先由facebook開發,後來貢獻給了apache。thrift主要解決跨語言調用的問題。php

thrift和protobuf有啥區別?

thrift和protobuf,都解決了一個問題就是誇語言數據結構的定義,json也解決了跨語言的數據結構定義,只不過json都是字符串的,傳輸的開銷和解析的開銷可能有些大。那麼想傳輸二進制的話怎麼辦呢,能夠本身定義數據結構,好比你們熟知的網絡協議就是這麼定出來的,前1個字節表明啥啥啥,第二個字節表明啥啥啥,而後客戶端和服務端都遵照這個協議。在沒有thrift或者profobuf以前好多cs程序就是這麼幹的。可是這麼幹很累啊,還得寫文檔,並且開發時候也很差記,很差交流。後來人們想出了個辦法,就是用一個相似json格式的文件定義數據結構,而後自動生成代碼去處理二進制的轉換,這樣人們既能夠用好讀的格式定義數據結構,又能夠高效的使用,因而就誕生了protobuf和thrift這類東西。protobuf到此爲止了,thrift又把服務端程序和客戶端程序也順手加進去能夠自動生成了,這樣程序員就只負責寫業務邏輯,其餘的傳輸啊神馬的都自動生成了,這就是protobuf和thrift的區別。這樣thrift就有了全套的RPC機制,java

爲何要跨語言調用?

有人認爲是團隊須要,不一樣的人擅長不一樣的語言,我認爲從架構的角度想,有2點好處python

  1. 用適合的語言作適合的事情,好比一些複雜算法的部分,c語言比較合適,性能高冗餘的事情乾的少,PHP的話可能性能就慢不少,這時候能夠考慮跨語言調用
  2. 對於大型項目的團隊間的解耦,在大公司中可能不一樣的功能並非一個組完成的,可能會跨組甚至跨部門,這時候把一個功能以服務的形勢對其餘部門提供,是一種比較好的方式。

爲何不直接用HTTP json交互多方便?

是的,能夠用json,好多api都是用json形式的,如今也流行REST,其實也是蠻方便的,可是有幾個缺點linux

  1. 無論用什麼語言吧,都得有個http服務,java和php還好,像c這種就有點費勁。
  2. json很靈活,也好改,可是須要有良好的文檔,本身用很是好,大團隊可能會有些溝通上的問題,起碼文檔要寫清楚json各個字段含義,值可能有哪些類型,否則你就給人家一個url說這個就是xxx的api,人家對接若是沒文檔基本是不可能接的了的。
  3. 鑑權和驗籤問題,以前作網站的get請求能夠不考慮調用者的身份問題,由於反正給人家看的嘛,誰看不同。可是做爲api的時候特別是涉及增刪改的時候,調用者的身份問題就得考慮了,不能誰都能調啊,因此通常http的api都要設計個簽名規則,對接的人得按照你的驗籤規則去寫程序,一般這是對接時候比較耗時和容易出問題的地方。 1.從傳輸量大小上,不如二進制省空間,對於

安裝

thrift的安裝分兩部分程序員

  1. 是thrift自己
  2. 是語言包

安裝thrift 編譯器

這個其實不必編譯安裝的,直接下載windows版的就行。 在linux上編譯安裝也還比較好裝,可是可能會缺這缺那,缺啥用yum裝便可算法

./configure
make
make install

安裝語言lib

語言包都在源碼的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

使用步驟:

  1. 準備:thrift編譯器,服務端、客戶端語言的lib
  2. 寫thrift文件
service HelloService{
    string sayHello(1:string username)
}

而後用thrift編譯:api

  • thrift.exe -r -gen java hello.thrift
  • thrift.exe -r -gen php hello.thrift
  • thrift.exe -r -gen py hello.thrift 要啥語言就生成啥
  1. 寫實現
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目錄下有各類語言的例子

持續更新 未完待續...

相關文章
相關標籤/搜索