日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...

發(fā)布時間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 的基本概念。
  • Thrift 的協(xié)議層的作用
  • Thrift 的數(shù)據(jù)結(jié)構(gòu)
  • Thrift 和 Http 區(qū)別?
  • Thrift 的安裝使用
  • Thrift 的入門例子編寫。
  • Thrift 的編譯和運行
  • pinpoint什么采用 Thrift 的原因?
本篇文章介紹了 跨語言的RPC框架 Thrift的入門知識,起源于研究Pinpoint的源碼,在這里想說的是:研究閱讀某個框架的源碼其實是很耗費精力的一件事,因為不同的人讀同樣的代碼會有不同的感受,這取決于各自的認知和知識深度不同。但是我覺得思路應該都是一致的,那就是不應該局限在框架本身,而是站在創(chuàng)造者的角度,去思考,為什么最后造出了這樣一個優(yōu)秀的框架,它依賴的那些底層的硬件、或是軟件。由點及面的將其剖析完整,希望能幫助到你。MySQL存儲過程的動態(tài)行轉(zhuǎn)列Java 應用性能調(diào)優(yōu)的一些實踐可視化界面在線生成JVM參數(shù)java內(nèi)存溢出問題分析過程二(附MAT超全操作文檔)使用Eclipse Memory Analyzer Tool(MAT)分析線上故障(一)一文讓你理解什么是shallow heap及retained heap內(nèi)存分析診斷系列-理解heap?dump記一次服務器被當肉雞挖礦的經(jīng)歷如何編寫一個可復用的SpringBoot應用運維腳本高效率編寫Dockerfile需要繞過的一些坑Mysql百萬量級數(shù)據(jù)高效導入Redis多線程之CountDownLatch的用法及原理筆記我就知道你“在看” 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的server如何调用 thrift_一文带你了解 Thrift,一个可伸缩的跨语言 RPC 框架(pinpoint 源码分析系列)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。