C#使用Thrift作為RPC框架入門詳細(xì)教程
前言
本文將介紹由 Facebook 開發(fā)的遠(yuǎn)程服務(wù)調(diào)用框架 Apache Thrift,它采用接口描述語(yǔ)言定義并創(chuàng)建服務(wù),支持可擴(kuò)展的跨語(yǔ)言服務(wù)開發(fā),所包含的代碼生成引擎可以在多種語(yǔ)言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等創(chuàng)建高效的、無(wú)縫的服務(wù),其傳輸數(shù)據(jù)采用二進(jìn)制格式,相對(duì) XML 和 JSON 體積更小,對(duì)于高并發(fā)、大數(shù)據(jù)量和多語(yǔ)言的環(huán)境更有優(yōu)勢(shì)。本文將詳細(xì)介紹 Thrift 在C#語(yǔ)言下的使用方式,并且提供豐富的實(shí)例代碼加以解釋說(shuō)明,幫助使用者快速構(gòu)建服務(wù)。
完善開發(fā)工具
通過(guò)nuget在vs2019中安裝thrift
在項(xiàng)目中引用右鍵點(diǎn)擊管理Nuget程序包,在打開的界面輸入thrift,如下圖:
我們選擇ApacheThrift這一項(xiàng)進(jìn)行安裝,安裝后,在我們項(xiàng)目里有Thrift45.dll的引用,如下圖:
下載thrift代碼生成工具
thrift是支持異構(gòu)語(yǔ)言、異構(gòu)平臺(tái)的通信開發(fā)RPC框架,它通過(guò)中間語(yǔ)言IDL進(jìn)行描述你要定義的結(jié)構(gòu)、類、服務(wù)等,并通過(guò)代碼生成工具生成各個(gè)語(yǔ)言上對(duì)應(yīng)的代碼。
接下來(lái),我們進(jìn)入Apache網(wǎng)站Thrift項(xiàng)目下載Thrift代碼生成工具,如下圖:
我們把下載的這個(gè)exe文件放到我們項(xiàng)目的根目錄下,以備后用,如下圖:
至此,關(guān)于thrift的開發(fā)工具,我們已經(jīng)準(zhǔn)備完畢,接下來(lái)來(lái)編寫thrift接口描述文件
thrift描述文件
thrift提供的接口描述文件是以thrift結(jié)尾的格式文件,我們來(lái)解釋一下這種IDL的語(yǔ)法,
- 它提供了基礎(chǔ)類型的定義,包括bool、i16、i32、i64、double、string
- enum
- Struct 對(duì)一些基礎(chǔ)類型的封裝,對(duì)應(yīng)C#中Class字段
- 還有一些集合的定義,包含 set<> 對(duì)應(yīng)C#中的HashSet,是一種唯一元素的集合(Thrift框架自己定義了THashSet類型與之相對(duì)應(yīng));list<>對(duì)應(yīng)C#中的List<>;map<K,V>對(duì)應(yīng)C#的Dictionary<K,V>
- service 這個(gè)是thrift的重點(diǎn),它是一些方法集合,thrift會(huì)根據(jù)這個(gè)定義生成客戶端代碼和服務(wù)端代碼
- exception 對(duì)應(yīng)C#中的Exception類型
- thrift關(guān)于類型的定義以及示例代碼請(qǐng)打開這個(gè)網(wǎng)址:IDL描述
在IDL描述文件中,Thrift除了對(duì)類型的定義外,我們還需要記住一下知識(shí)點(diǎn):
- namespace 在描述文件的頭部定義。 以當(dāng)前文件為根目錄,生成多級(jí)目錄;在生成的代碼上添加namespace命名空間。代碼如下:
namespace csharp WpfApp1.ceshi
include 在描述文件的頭部定義。 用該命令包含其他thrift描述文件,當(dāng)編譯生成代碼時(shí)也會(huì)編譯include指定的thrift文件。代碼如下:
include "pe1.thrift"
使用方法,pe1.thrift文件定義如下:
struct pe1 { 1: i32 id; }
在其他文件中,引入上述文件,定義如下:
include "pe1.thrift" service GuidGenService { string getGuid(1:pe1.pe1 pe1); }
typedef 類型定義命令,將thrift支持的類型定義一個(gè)別名。代碼如下:
typedef i32 int struct People { 1: int ID; 2: string Name; 3: i16 Age; 4: list<i32> onelist; 5: set<string> oneSet; 6: map<i32,string> oneset; }
當(dāng)定義完描述文件后,我們通過(guò)如下cmd命令生成代碼文件:
thrift-0.12.0.exe -r -gen csharp People.thrift
我們先要通過(guò)cd 將當(dāng)前路徑跳轉(zhuǎn)到thrift-0.12.0.exe所在的路徑
示例
我定義了了一個(gè)描述文件,如下:
namespace csharp WpfApp1.ceshi include "pe1.thrift" typedef i32 int struct People { 1: int ID; 2: string Name; 3: i16 Age; 4: list<i32> onelist; 5: set<string> oneSet; 6: map<i32,string> oneset; } service HelloService { void SetPeople(1: People people1); } service GuidGenService { string getGuid(1:pe1.pe1 pe1); }
我們通過(guò)上述命令執(zhí)行后,生成的代碼結(jié)構(gòu)如下圖:
我們打開people.cs可以看到struct people生成了如下代碼:
namespace WpfApp1.ceshi { #if !SILVERLIGHT [Serializable] #endif public partial class People : TBase { private int _ID; private string _Name; private short _Age; private List<int> _onelist; private THashSet<string> _oneSet; private Dictionary<int, string> _oneset; .....
這里需要注意一下people類的命名空間,這和我們上文講的時(shí)一致的。
我們定義的service GuidGenService生成了如下代碼:
該類是我們使用該框架的重點(diǎn),它給我們生成了客戶端和服務(wù)器端代碼,從圖中我們可以看該文件下生成了兩個(gè)接口ISync和Iface,前者是同步方法,后者生成的是異步調(diào)用方法,接下來(lái)是一個(gè)供我們客戶端調(diào)用的類,它繼承了iface接口,而iface又繼承了ISync接口;再往下看是一個(gè)Processor,是服務(wù)端使用的類。
結(jié)尾
這篇文件我們講了從0到1使用thrift框架的方法,也講了一些該框架的基本知識(shí),接下來(lái)的文件,我們將通過(guò)一個(gè)示例具體講解一下service指令代碼生成的代碼的具體含義和使用方法
到此這篇關(guān)于C#使用Thrift作為RPC框架入門(一)的文章就介紹到這了,更多相關(guān)c# Thrift RPC框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用C#實(shí)現(xiàn)在屏幕上畫圖效果的代碼實(shí)例
本篇文章是對(duì)使用C#在屏幕上畫圖效果的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C# out關(guān)鍵詞的應(yīng)用實(shí)例
下面小編就為大家分享一篇C# out關(guān)鍵詞的應(yīng)用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12C# 向Word中設(shè)置/更改文本方向的方法(兩種)
在一般情況下word中輸入的文字都是橫向的,今天小編給大家?guī)?lái)兩種方法來(lái)設(shè)置更改文本方向的方法,非常不錯(cuò),對(duì)c# word 更改文本方向的知識(shí)感興趣的朋友一起看看吧2016-08-0810分鐘學(xué)會(huì)Visual Studio將自己創(chuàng)建的類庫(kù)打包到NuGet進(jìn)行引用(net,net core,C#)
這篇文章主要介紹了10分鐘學(xué)會(huì)Visual Studio將自己創(chuàng)建的類庫(kù)打包到NuGet進(jìn)行引用(net,net core,C#),本文給大家介紹的非常詳細(xì)對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作
這篇文章主要介紹了C# 如何使用 Index 和 Range 簡(jiǎn)化集合操作,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02C#檢查指定對(duì)象是否存在于ArrayList集合中的方法
這篇文章主要介紹了C#檢查指定對(duì)象是否存在于ArrayList集合中的方法,涉及C#中Contains方法的使用技巧,需要的朋友可以參考下2015-04-04Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間
本文給大家分享Extjs4如何處理后臺(tái)json數(shù)據(jù)中日期和時(shí)間,通過(guò)代碼示例給大家剖析,感興趣的朋友快來(lái)圍觀2015-08-08C#實(shí)現(xiàn)動(dòng)態(tài)圖標(biāo)閃爍顯示的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)動(dòng)態(tài)圖標(biāo)閃爍顯示的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以了解一下2022-12-12