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