亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談Thrift內部實現原理

2019-11-11 06:51:13
字體:
來源:轉載
供稿:網友
     Thrift由兩部分組成:編譯器(在compiler目錄下,采用C++編寫)和服務器(在lib目錄下),其中編譯器的作用是將用戶定義的thrift文件編譯生成對應語言的代碼,而服務器是事先已經實現好的、可供用戶直接使用的RPC Server(當然,用戶也很容易編寫自己的server)。同大部分編譯器一樣,Thrift編譯器(采用C++語言編寫)也分為詞法分析、語法分析等步驟,Thrift使用了開源的flex和Bison進行詞法語法分析(具體見thrift.ll和thrift.yy),經過語法分析后,Thrift根據對應語言的模板(在compiler/cpp/src/generate目錄下)生成相應的代碼。對于服務器實現而言,Thrift僅包含比較經典的服務器模型,比如單線程模型(TSimpleServer),線程池模型(TThreadPoolServer)、一個請求一個線程(TThreadedServer)和非阻塞模型(TNonblockingServer)等。本文將以C++為例進行一個實例分析。

假設用戶編寫了以下Thrift文件:

struct LogInfo {

1: required string name,

2: optional string content,

}

service LogSender {

void SendLog(1:list<LogInfo> loglist);

}

用戶使用命令“thrift –gen cpp example.thrift”可生成C++代碼,該代碼包含以下文件:

example_constants.h

example_constants.cpp

example_types.h  //struct定義

example_types.cpp  //struct實現

LogSender.h  //service定義

LogSender.cpp  //service實現和LogSenderClient實現

LogSender_server.skeleton.cpp //一個實例RPC Server

用戶可以這樣編寫Client:

shared_ptr socket(new TSocket(“8.8.8.8″, 9090));

shared_ptr transport(new TBufferedTransport(socket));

shared_ptr PRotocol(new TBinaryProtocol(transport));

LogSenderClient client(protocol);

try {

transport->open();

vector<LogInfo> logInfos;

LogInfo logInfo(“image”, “10:9:0 visit:xxxxxx”);

logInfos.push_back(logInfo);

…..

client.SendLog(logInfos);

transport->close();

} catch (TException &tx) {

printf(“ERROR: %s/n”, tx.what());

}

為了深入分析這段代碼,我們看一下client.SendLog()函數的內部實現(在LogSender.cpp中):

void LogSenderClient::SendLog(const std::vector<LogInfo> & loglist)

{

send_SendLog(loglist);

recv_SendLog();

}

void LogSenderClient::send_SendLog(const std::vector<LogInfo> & loglist)

{

int32_t cseqid = 0;

oprot_->writeMessageBegin(“SendLog”, ::apache::thrift::protocol::T_CALL, cseqid);

LogSender_SendLog_pargs args;

args.loglist = &loglist;

args.write(oprot_);

oprot_->writeMessageEnd();

oprot_->getTransport()->flush();

oprot_->getTransport()->writeEnd();

}

void LogSenderClient::recv_SendLog()

{

int32_t rseqid = 0;

std::string fname;

::apache::thrift::protocol::TMessageType mtype;

iprot_->readMessageBegin(fname, mtype, rseqid);

if (mtype == ::apache::thrift::protocol::T_EXCEPTION) {

…..

}

if (mtype != ::apache::thrift::protocol::T_REPLY) {

……

}

if (fname.compare(“SendLog”) != 0) {

……

}

LogSender_SendLog_presult result;

result.read(iprot_);

iprot_->readMessageEnd();

iprot_->getTransport()->readEnd();

return;

}

閱讀上面的代碼,可以看出,RPC函數SendLog()實際上被轉化成了兩個函數:send_SendLog和recv_SendLog,分別用于發送數據和接收結果。數據是以消息的形式表示的,消息頭部是RPC函數名,消息內容是RPC函數的參數。

我們再進一步分析RPC Server端,一個server的編寫方法(在LogSender.cpp中)如下:

shared_ptr protocolFactory(new TBinaryProtocolFactory());

shared_ptr handler(new LogSenderHandler());

shared_ptr processor(new LogSenderProcessor(handler));

shared_ptr serverTransport(new TServerSocket(9090));

shared_ptr transportFactory(new TBufferedTransportFactory());

TSimpleServer server(processor,

serverTransport,

transportFactory,

protocolFactory);

printf(“Starting the server…/n”);

server.serve();

Server端最重要的類是LogSenderProcessor,它內部有一個映射關系processMap_,保存了所有RPC函數名到函數實現句柄的映射,對于LogSender而言,它只保存了一個RPC映射關系:

processMap_[" SendLog"] = &LogSenderProcessor::process_SendLog;

其中,process_SendLog是一個函數指針,它的實現如下:

void LogSenderProcessor::process_SendLog(int32_t seqid, ::apache::thrift::protocol::TProtocol* iprot, ::apache::thrift::protocol::TProtocol* oprot)

{

LogSender_SendLog_args args;

args.read(iprot);

iprot->readMessageEnd();

iprot->getTransport()->readEnd();

LogSender_SendLog_result result;

try {

iface_->SendLog(args.loglist);//調用用戶編寫的函數

} catch (const std::exception& e) {

……

}

oprot->writeMessageBegin(“SendLog”, ::apache::thrift::protocol::T_REPLY, seqid);

result.write(oprot);

oprot->writeMessageEnd();

oprot->getTransport()->flush();

oprot->getTransport()->writeEnd();

}

LogSenderProcessor中一個最重要的函數是process(),它是服務器的主體函數,服務器端(socket server)監聽到客戶端有請求到達后,會檢查消息類型,并檢查processMap_映射,找到對應的消息處理函數,并調用之(注意,這個地方可以采用各種并發模型,比如one-request-one-thread,thread pool等)。

通過上面的分析可以看出,Thrift最重要的組件是編譯器(采用C++編寫),它為用戶生成了網絡通信相關的代碼,從而大大減少了用戶的編碼工作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲最大福利视频网站| 668精品在线视频| 亚洲小视频在线| 福利一区视频在线观看| 欧美日韩中国免费专区在线看| 欧美最猛性xxxxx亚洲精品| 懂色av中文一区二区三区天美| 国产精品福利在线观看| 久久精品久久久久久| 亚洲精品国产精品乱码不99按摩| 成人精品久久一区二区三区| 日韩精品视频中文在线观看| 国产日韩欧美91| 欧美成人性生活| 久久天天躁日日躁| 欧美精品第一页在线播放| 日本欧美国产在线| 精品久久香蕉国产线看观看gif| 亚洲老头老太hd| 日韩在线视频线视频免费网站| 欧美一区三区三区高中清蜜桃| 91免费精品国偷自产在线| 久久成人一区二区| 国产成人精品免费视频| 国产精品日韩在线播放| 青青久久aⅴ北条麻妃| 97色在线观看免费视频| 午夜精品一区二区三区在线视| 日韩在线视频观看| 久久久免费高清电视剧观看| 国产成人鲁鲁免费视频a| 亚洲国产精品99久久| 国产最新精品视频| 久久久精品亚洲| 久久五月天综合| 久久av.com| 日韩美女av在线| 国产精品444| 日韩免费av在线| 色黄久久久久久| 亚洲男人天堂2023| 亚洲国产中文字幕久久网| 深夜福利91大全| 日本a级片电影一区二区| 亚洲第一精品夜夜躁人人爽| 成人午夜两性视频| 色偷偷偷亚洲综合网另类| 精品久久久久久久久久久久久| 国产精品wwww| 美女性感视频久久久| 色综合伊人色综合网站| 91国内在线视频| 欧美日韩在线影院| 91精品久久久久久久久久久久久| 色综合亚洲精品激情狠狠| 午夜精品一区二区三区在线播放| 亚洲iv一区二区三区| 亚洲国产精品久久久久| 91经典在线视频| 日韩暖暖在线视频| 亚洲伊人久久大香线蕉av| 性欧美xxxx| 日韩电影中文字幕av| www.日韩不卡电影av| 精品国产一区二区三区四区在线观看| 97在线视频一区| 777午夜精品福利在线观看| 成人高清视频观看www| 欧美色另类天堂2015| 欧美激情乱人伦| 欧美成人午夜影院| 国产精品丝袜白浆摸在线| 在线观看中文字幕亚洲| 亚洲大尺度美女在线| 色综合伊人色综合网站| 欧美日韩国产999| 亚洲视频自拍偷拍| 亚洲精品久久久久久久久久久久| 亚洲最大的网站| 成人国产精品av| 亚洲一区二区三区777| 欧洲亚洲免费视频| 狠狠躁天天躁日日躁欧美| 国产精品扒开腿做爽爽爽的视频| 51视频国产精品一区二区| 国产精品久久久久久久一区探花| 亚洲在线视频观看| 久久久久久久久网站| 日韩影视在线观看| 亚洲成人教育av| 亚洲国产精品成人一区二区| 亚洲国产高清福利视频| 久久久精品在线| 57pao国产精品一区| 国产一区二区三区视频| 久久综合久久美利坚合众国| 亚洲精品98久久久久久中文字幕| 国产成人激情小视频| 日韩va亚洲va欧洲va国产| 国产原创欧美精品| 日韩在线欧美在线| 欧美激情一二区| 高跟丝袜欧美一区| 精品久久久999| 狠狠综合久久av一区二区小说| 国产精品福利片| 中文字幕在线日韩| 日韩极品精品视频免费观看| 国产精品久久久久7777婷婷| 亚洲小视频在线| 爱福利视频一区| 国产精品嫩草影院久久久| 国产亚洲精品久久久久久777| 久久中文字幕国产| 亚洲男人天堂视频| 免费av在线一区| 日韩欧美国产黄色| 久久偷看各类女兵18女厕嘘嘘| 久久精品福利视频| 欧美在线精品免播放器视频| 97久久精品人人澡人人爽缅北| 国产成人精品在线| 亚洲美女激情视频| 欧美亚洲另类在线| 欧美在线观看网址综合| 国产精品视频一区国模私拍| 欧美成人午夜免费视在线看片| 2020国产精品视频| 欧美在线视频网站| 亚洲男人av电影| 欧美日韩裸体免费视频| 在线精品国产欧美| 久久久免费电影| 黑人巨大精品欧美一区二区一视频| 日本免费一区二区三区视频观看| 欧美激情视频网址| 国产精品视频自在线| 伊是香蕉大人久久| 日本韩国欧美精品大片卡二| 精品国内产的精品视频在线观看| 自拍视频国产精品| 亚洲国产精品一区二区三区| 久久久免费在线观看| 一区二区三区国产在线观看| 国产亚洲aⅴaaaaaa毛片| 欧美日韩精品在线| 久久久久久91香蕉国产| 国产精品va在线播放| 91精品国产色综合久久不卡98口| 亚洲三级免费看| 久久亚洲精品国产亚洲老地址| 91夜夜未满十八勿入爽爽影院| 日韩小视频在线观看| 欧美另类99xxxxx| 亚洲电影成人av99爱色| 奇米影视亚洲狠狠色| 亚洲毛茸茸少妇高潮呻吟| 亚洲一区二区三区乱码aⅴ| 黑人巨大精品欧美一区二区三区| 亚洲人成电影网站色xx| 亚洲国产欧美日韩精品| 久久亚洲国产精品成人av秋霞| 欧美亚洲一区在线| 日韩欧美在线视频免费观看|