server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
生活随笔
收集整理的這篇文章主要介紹了
server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Thrift 是什么研究分布式調用鏈工具pinpoint的時候,在源碼里看到了Thrift相關的代碼,所以來了興趣,想研究研究這個框架。Thrift 目前是 Apache 的一個項目,但是它是由facebook研發產生的。它的定位是一個 跨語言的RPC服務開發框架。在各個不同語言環境的系統中承擔大量數據傳輸和通信的工作。Thrift 支持包括上圖中所有等28種語言,所以使得在使用不同編程語言的程序,可以很容易的傳輸共享數據和進行遠程過程調用。它是一個輕量級的,獨立于語言的開發框架,在點對點rpc數據傳輸,數據的序列化上為我們提供了比較簡潔的抽象和實現。同樣的,由于Thrift在傳輸數據時,采用的是二進制,相對于在HTTP協議中使用的xml和json占用體積更小,在很多高并發、數據量級大的系統中更加有優勢。我們通過定義一個以.thrift結尾的文件作為輸入源,內容包含接口的定義,然后通過生成代碼的方式,來構建不同語言的RPC客戶端和服務端。Thrift 的各個組件層級在 Thrift 的客戶端和服務端交互中,各個組件都是比較靈活的,做到了充分的低耦合,所以我們可以基于不同的應用場景,選擇不同的方式搭建或是語言實現。由上圖,可以看出,最上層是我們編寫的Thrift代碼,它是一種IDL(接口描述語言), 是用于描述的服務接口信息的。我們在這個文件中寫好相關的注釋,就可以用它來作為接口文檔,提供給客戶端使用了。同時,IDL文件,也是自動生成接口代碼的輸入源,定義出來的接口能夠很靈活的支持擴展。第二層是使用Thrift編譯工具生成的代碼,主要用于結構化的數據解析,發送和接收通信協議層主要是定義數據傳輸的格式,對傳輸的數據進行序列化和反序列化, 從協議劃分上來說,主要包含兩個方面,一是文本,而是二進制,既然使用了Thrift,使用其二進制協議占多數,當然更是要結合實際的業務場景來分析考慮。傳輸層負責直接從網絡中讀取和寫入數據,它定義了具體的網絡傳輸協議;比如說TCP/IP傳輸等。Thrift 的數據結構Thrift 腳本可定義的數據類型包括以下幾種類型:圖片來自 wangyangfu,其中,byte、i16、i32、i64分別表示:8/16/32/64位有符號整數。Thrift 和 Http 區別?其實 Thrift 的主要特點就是跨語言、能自動生成客戶端。相對于 http 協議而言,算是比較小眾。它是基于 socket,通過 TCP 協議實現,相比較無連接、無狀態的 HTTP 協議的,每次打開、關閉連接會比較消耗性能 并且需要管理維護很多 IDL 文件。基于thrift實現高效的二進制傳輸 而 http 大部分是通過 json 來實現的,字節大小和序列化耗時都比 Thrift 要更消耗性能。總的來說,Thrift 更常見用于公司內部的系統服務之間調用,性能消耗比較低,保證服務質量,提高傳輸效率,而 http 主要用于對外的接口調用,瀏覽器、移動端、第三方接口等。Thrift 的安裝使用Thrift的官網地址是:http://thrift.apache.org
這里我使用的版本是 thrift-0.10.0.exe,下載地址:http://archive.apache.org/dist/thrift/0.10.0/thrift-0.10.0.exe
將下載好的trift-0.10.0.exe 重命名為 thrift.exe 并且在控制面板--> Path環境變量中配置exe所在的目錄 配置好后,命令行執行:thrift -version 應該會顯示表明安裝成功。Thrift 的編譯新建一個 maven 工程,在intf目錄下新建一個 IUserInfo.thrift 文件,內容為: struct User{
1: i32 id
2: string name
}
service UserService{
User getUser(1:i32 uid)
}
cmd命令行進入這個文件所在目錄,執行如下命令: thrift -gen java IUserInfo.thrift
語法格式為:thrift --gen使用雙面面命令即可將IDL文件編譯成對應語言的接口文件。執行完后,會生成兩個Java類。當然idea開發工具也提供了Thrift的編譯器支持,在插件倉庫中搜索安裝,配置相關的參數后,也能完成編譯。編寫 Thrift 服務端 // 業務處理器
TProcessor processorr = new UserService.Processor(new UserServiceImpl());// 設置服務器
TServerSocket serverSocket = new TServerSocket(9999);// 傳輸協議為二進制
TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();// 使用單線程阻塞 I/O 模型
TServer.Args simpleArgs = new TServer.Args(serverSocket).processor(processorr).protocolFactory(protocolFactory);
TServer server = new TSimpleServer(simpleArgs);
System.out.println("開啟俠夢的Thrift服務器,監聽端口:9999");
server.serve();編寫 Thrift 客戶端 // 設置調用的服務地址-端口
TTransport tTransport = new TSocket("localhost", 9999);
// 使用二進制協議
TProtocol protocol = new TBinaryProtocol(tTransport);
// 使用的接口
UserService.Client client = new UserService.Client(protocol);
// 打開 Socket
tTransport.open();
System.out.println(client.getUser(1));
tTransport.close();
依次執行Server 端 和Client 后,效果如下:至此,我們就完成了第一個Thrift 程序的編寫。pinpoint 中 為什么采用 Thrift 呢?通過使用二進制格式(thrift)可以提高編碼速度,雖然它使用和調試要難一些。也有利于減少網絡使用,因為生成的數據比較小。如果將一個長整型轉換為固定長度的字符串, 數據大小一般是8個字節。然而,如果你用變長編碼,數據大小可以是從1到10個字符,取決于給定數字的大小。為了減小數據大小,pinpoint 使用 Thrift 的CompactProtocol協議(壓縮協議)來編碼數據,因為變長字符串和記錄數據可以為編碼格式做優化。pinpoint agent通過基于跟蹤的根方法的時間開始來轉換其他的時間來減少數據大小。固定長度編碼和可變長度編碼的對比為了得到關于三個不同方法(見上圖)被調用時間的數據,不得不在6個不同的點上測量時間,用固定長度編碼這需要48個字節(6 * 8)。以此同時,pinpoint agent 使用可變長度編碼并根據對應的格式記錄數據。然后在其他時間點通過和參考點比較來計算時間值(在vector中),根方法的起點被確認為參考點。這只需要占用少量的字節,因為vector使用小數字。圖4中消耗了13個字節。如果執行方法花費了更多時間,即使使用可變長度編碼也會增加字節數量。但是,依然比固定長度編碼更有效率。總結先總結一下介紹的內容:
這里我使用的版本是 thrift-0.10.0.exe,下載地址:http://archive.apache.org/dist/thrift/0.10.0/thrift-0.10.0.exe
將下載好的trift-0.10.0.exe 重命名為 thrift.exe 并且在控制面板--> Path環境變量中配置exe所在的目錄 配置好后,命令行執行:thrift -version 應該會顯示表明安裝成功。Thrift 的編譯新建一個 maven 工程,在intf目錄下新建一個 IUserInfo.thrift 文件,內容為: struct User{
1: i32 id
2: string name
}
service UserService{
User getUser(1:i32 uid)
}
cmd命令行進入這個文件所在目錄,執行如下命令: thrift -gen java IUserInfo.thrift
語法格式為:thrift --gen使用雙面面命令即可將IDL文件編譯成對應語言的接口文件。執行完后,會生成兩個Java類。當然idea開發工具也提供了Thrift的編譯器支持,在插件倉庫中搜索安裝,配置相關的參數后,也能完成編譯。編寫 Thrift 服務端 // 業務處理器
TProcessor processorr = new UserService.Processor(new UserServiceImpl());// 設置服務器
TServerSocket serverSocket = new TServerSocket(9999);// 傳輸協議為二進制
TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();// 使用單線程阻塞 I/O 模型
TServer.Args simpleArgs = new TServer.Args(serverSocket).processor(processorr).protocolFactory(protocolFactory);
TServer server = new TSimpleServer(simpleArgs);
System.out.println("開啟俠夢的Thrift服務器,監聽端口:9999");
server.serve();編寫 Thrift 客戶端 // 設置調用的服務地址-端口
TTransport tTransport = new TSocket("localhost", 9999);
// 使用二進制協議
TProtocol protocol = new TBinaryProtocol(tTransport);
// 使用的接口
UserService.Client client = new UserService.Client(protocol);
// 打開 Socket
tTransport.open();
System.out.println(client.getUser(1));
tTransport.close();
依次執行Server 端 和Client 后,效果如下:至此,我們就完成了第一個Thrift 程序的編寫。pinpoint 中 為什么采用 Thrift 呢?通過使用二進制格式(thrift)可以提高編碼速度,雖然它使用和調試要難一些。也有利于減少網絡使用,因為生成的數據比較小。如果將一個長整型轉換為固定長度的字符串, 數據大小一般是8個字節。然而,如果你用變長編碼,數據大小可以是從1到10個字符,取決于給定數字的大小。為了減小數據大小,pinpoint 使用 Thrift 的CompactProtocol協議(壓縮協議)來編碼數據,因為變長字符串和記錄數據可以為編碼格式做優化。pinpoint agent通過基于跟蹤的根方法的時間開始來轉換其他的時間來減少數據大小。固定長度編碼和可變長度編碼的對比為了得到關于三個不同方法(見上圖)被調用時間的數據,不得不在6個不同的點上測量時間,用固定長度編碼這需要48個字節(6 * 8)。以此同時,pinpoint agent 使用可變長度編碼并根據對應的格式記錄數據。然后在其他時間點通過和參考點比較來計算時間值(在vector中),根方法的起點被確認為參考點。這只需要占用少量的字節,因為vector使用小數字。圖4中消耗了13個字節。如果執行方法花費了更多時間,即使使用可變長度編碼也會增加字節數量。但是,依然比固定長度編碼更有效率。總結先總結一下介紹的內容:
- 介紹了Thrift 的基本概念。
- Thrift 的協議層的作用
- Thrift 的數據結構
- Thrift 和 Http 區別?
- Thrift 的安裝使用
- Thrift 的入門例子編寫。
- Thrift 的編譯和運行
- pinpoint什么采用 Thrift 的原因?
總結
以上是生活随笔為你收集整理的server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么材质耐酸碱_粘玻璃用什么胶水?选择高
- 下一篇: 扫地机器人粘住老鼠板怎么办_家里老鼠的危