CSharp使用Thrift作為RPC框架入門(一)

本人博客原文鏈接

前言

本文將介紹由 Facebook 開發(fā)的遠(yuǎn)程服務(wù)調(diào)用框架 Apache Thrift膳叨,它采用接口描述語言定義并創(chuàng)建服務(wù),支持可擴(kuò)展的跨語言服務(wù)開發(fā)粘都,所包含的代碼生成引擎可以在多種語言中不跟,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等創(chuàng)建高效的、無縫的服務(wù)励堡,其傳輸數(shù)據(jù)采用二進(jìn)制格式谷丸,相對(duì) XML 和 JSON 體積更小,對(duì)于高并發(fā)应结、大數(shù)據(jù)量和多語言的環(huán)境更有優(yōu)勢刨疼。本文將詳細(xì)介紹 Th[圖片上傳失敗...(image-6396aa-1563673235590)]
rift 在C#語言下的使用方式,并且提供豐富的實(shí)例代碼加以解釋說明鹅龄,幫助使用者快速構(gòu)建服務(wù)揩慕。

完善開發(fā)工具

通過nuget在vs2019中安裝thrift

在項(xiàng)目中引用右鍵點(diǎn)擊管理Nuget程序包,在打開的界面輸入thrift扮休,如下圖:

image

我們選擇ApacheThrift這一項(xiàng)進(jìn)行安裝迎卤,安裝后,在我們項(xiàng)目里有Thrift45.dll的引用肛炮,如下圖:

image

下載thrift代碼生成工具

thrift是支持異構(gòu)語言止吐、異構(gòu)平臺(tái)的通信開發(fā)RPC框架,它通過中間語言IDL進(jìn)行描述你要定義的結(jié)構(gòu)侨糟、類碍扔、服務(wù)等,并通過代碼生成工具生成各個(gè)語言上對(duì)應(yīng)的代碼秕重。

接下來不同,我們進(jìn)入Apache網(wǎng)站Thrift項(xiàng)目下載Thrift代碼生成工具,如下圖:


image

我們把下載的這個(gè)exe文件放到我們項(xiàng)目的根目錄下,以備后用二拐,如下圖:

image

至此服鹅,關(guān)于thrift的開發(fā)工具,我們已經(jīng)準(zhǔn)備完畢百新,接下來來編寫thrift接口描述文件

thrift描述文件

thrift提供的接口描述文件是以thrift結(jié)尾的格式文件企软,我們來解釋一下這種IDL的語法,

  • 它提供了基礎(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)定義完描述文件后糊肠,我們通過如下cmd命令生成代碼文件:

thrift-0.12.0.exe -r -gen csharp People.thrift

我們先要通過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);
}

我們通過上述命令執(zhí)行后遗锣,生成的代碼結(jié)構(gòu)如下圖:

image

我們打開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生成了如下代碼:

image

該類是我們使用該框架的重點(diǎn)精偿,它給我們生成了客戶端和服務(wù)器端代碼弧圆,從圖中我們可以看該文件下生成了兩個(gè)接口ISync和Iface赋兵,前者是同步方法,后者生成的是異步調(diào)用方法搔预,接下來是一個(gè)供我們客戶端調(diào)用的類霹期,它繼承了iface接口,而iface又繼承了ISync接口拯田;再往下看是一個(gè)Processor历造,是服務(wù)端使用的類。

結(jié)尾

這篇文件我們講了從0到1使用thrift框架的方法勿锅,也講了一些該框架的基本知識(shí)帕膜,接下來的文件昼扛,我們將通過一個(gè)示例具體講解一下service指令代碼生成的代碼的具體含義和使用方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末养盗,一起剝皮案震驚了整個(gè)濱河市巨税,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌张弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件酪劫,死亡現(xiàn)場離奇詭異吞鸭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)覆糟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門刻剥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滩字,你說我怎么就攤上這事造虏。” “怎么了麦箍?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵漓藕,是天一觀的道長。 經(jīng)常有香客問我挟裂,道長享钞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任诀蓉,我火速辦了婚禮栗竖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渠啤。我一直安慰自己狐肢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布埃篓。 她就那樣靜靜地躺著处坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上同窘,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天玄帕,我揣著相機(jī)與錄音,去河邊找鬼想邦。 笑死裤纹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丧没。 我是一名探鬼主播鹰椒,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呕童!你這毒婦竟也來了漆际?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤夺饲,失蹤者是張志新(化名)和其女友劉穎奸汇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往声,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡擂找,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浩销。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯涎。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慢洋,靈堂內(nèi)的尸體忽然破棺而出塘雳,到底是詐尸還是另有隱情,我是刑警寧澤且警,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布粉捻,位于F島的核電站,受9級(jí)特大地震影響斑芜,放射性物質(zhì)發(fā)生泄漏肩刃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一杏头、第九天 我趴在偏房一處隱蔽的房頂上張望盈包。 院中可真熱鬧,春花似錦醇王、人聲如沸呢燥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叛氨。三九已至呼渣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寞埠,已是汗流浹背屁置。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仁连,地道東北人蓝角。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像饭冬,于是被迫代替她去往敵國和親使鹅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容