亚洲狠狠干,亚洲国产福利精品一区二区,国产八区,激情文学亚洲色图

遠(yuǎn)程過(guò)程調(diào)用方法及裝置與流程

文檔序號(hào):11154688閱讀:332來(lái)源:國(guó)知局
遠(yuǎn)程過(guò)程調(diào)用方法及裝置與制造工藝

本發(fā)明涉及遠(yuǎn)程過(guò)程調(diào)用技術(shù)領(lǐng)域,特別是涉及遠(yuǎn)程過(guò)程調(diào)用方法及裝置。



背景技術(shù):

遠(yuǎn)程過(guò)程調(diào)用協(xié)議(RPC,Remote Procedure Call Protocol)是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù)的協(xié)議,它采用客戶(hù)端設(shè)備/服務(wù)端設(shè)備模式,請(qǐng)求服務(wù)的一方為客戶(hù)端設(shè)備,提供服務(wù)的一方為服務(wù)端設(shè)備。

為了支持不同語(yǔ)言平臺(tái),技術(shù)人員研發(fā)了Thrift。它解決了系統(tǒng)間大數(shù)據(jù)量的傳輸通信,以及系統(tǒng)之間語(yǔ)言環(huán)境的差異,具有跨平臺(tái)的特性。但是,Thrift接口規(guī)范需要統(tǒng)一定義接口描述語(yǔ)言(IDL,Interface description language)文件。一旦接口發(fā)生變化,就需要重新修改IDC文件。

大型系統(tǒng)在開(kāi)發(fā)和設(shè)計(jì)過(guò)程中存在大量對(duì)接過(guò)程,接口修改的頻率非常高,因此使用Thrift進(jìn)行遠(yuǎn)程過(guò)程調(diào)用時(shí)較為繁瑣。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明實(shí)施例的目的在于提供一種遠(yuǎn)程過(guò)程調(diào)用方法及裝置,以實(shí)現(xiàn)簡(jiǎn)化RPC調(diào)用過(guò)程。具體技術(shù)方案如下:

一種遠(yuǎn)程過(guò)程調(diào)用方法,應(yīng)用于服務(wù)端設(shè)備,所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備通信連接,所述方法包括:

接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;

根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;

確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。

可選的,所述方法還包括:

對(duì)線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息的執(zhí)行結(jié)果進(jìn)行監(jiān)控;

判斷所述執(zhí)行結(jié)果是否滿(mǎn)足預(yù)設(shè)的觸發(fā)條件,如果是,則觸發(fā)與所滿(mǎn)足的觸發(fā)條件匹配的事件。

可選的,所述預(yù)設(shè)的RPC協(xié)議為:

所述RPC請(qǐng)求的格式為:包長(zhǎng)、頭大小、請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度、編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容、body主體內(nèi)容長(zhǎng)度、body主體數(shù)據(jù)。

可選的,在所述接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求前,所述方法還包括:

所述服務(wù)端設(shè)備對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng);

在監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,與所述客戶(hù)端設(shè)備建立鏈接。

可選的,所述方法還包括:

所述服務(wù)端設(shè)備對(duì)與客戶(hù)端設(shè)備的鏈接狀態(tài)進(jìn)行監(jiān)控;

在所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備的鏈接斷開(kāi)時(shí),重新建立與該客戶(hù)端設(shè)備的鏈接。

可選的,所述確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,包括:

在所述服務(wù)端設(shè)備本地查找具有得到的所述標(biāo)識(shí)信息的鍵key,根據(jù)與所述key對(duì)應(yīng)的值value中存儲(chǔ)的方法參數(shù)生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中;

其中,在生成寫(xiě)消息時(shí),將生成的寫(xiě)消息放入寫(xiě)消息生產(chǎn)隊(duì)列中;

在生成讀消息時(shí),將生成的讀消息放入讀消息生產(chǎn)隊(duì)列中。

可選的,所述從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,包括:

從所述寫(xiě)消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述寫(xiě)消息生產(chǎn)隊(duì)列中的寫(xiě)消息,在執(zhí)行所述寫(xiě)消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述寫(xiě)消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述寫(xiě)消息消費(fèi)者線(xiàn)程池;

從所述讀消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述讀消息生產(chǎn)隊(duì)列中的讀消息,在執(zhí)行所述讀消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述讀消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述讀消息消費(fèi)者線(xiàn)程池。

可選的,在所述服務(wù)端設(shè)備對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)之前,所述方法還包括:

綁定對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)的監(jiān)聽(tīng)地址TServerSocket,注冊(cè)與所述客戶(hù)端設(shè)備進(jìn)行連接的接口方法存根RpcProxyProcessor;

啟動(dòng)IO線(xiàn)程,創(chuàng)建選擇器Selector,將通道ServerSocketChannel注冊(cè)到Selector以監(jiān)聽(tīng)客戶(hù)端設(shè)備的連接請(qǐng)求,Selector輪詢(xún)就緒的Selector key,其中,所述Selector key為客戶(hù)端設(shè)備連接服器端設(shè)備時(shí)注冊(cè)到通道ServerSocketChannel中的事件的對(duì)象標(biāo)識(shí);

所述在監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,與所述客戶(hù)端設(shè)備建立鏈接,包括:

在從所述監(jiān)聽(tīng)地址TServerSocket監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,由AcceptImpl設(shè)置與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備進(jìn)行連接的參數(shù)并根據(jù)設(shè)置的參數(shù)與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備建立鏈接;

所述確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,包括:

由所述Selector確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中。

一種遠(yuǎn)程過(guò)程調(diào)用裝置,應(yīng)用于服務(wù)端設(shè)備,所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備通信連接,所述裝置包括:請(qǐng)求接收單元、請(qǐng)求解析單元、方法執(zhí)行單元和消息執(zhí)行單元;

所述請(qǐng)求接收單元,用于接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;

所述請(qǐng)求解析單元,用于根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;

所述方法執(zhí)行單元,用于確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

所述消息執(zhí)行單元,用于從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。

可選的,所述預(yù)設(shè)的RPC協(xié)議為:

所述RPC請(qǐng)求的格式為:包長(zhǎng)、頭大小、請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度、編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容、body主體內(nèi)容長(zhǎng)度、body主體數(shù)據(jù)。

本發(fā)明實(shí)施例提供的遠(yuǎn)程過(guò)程調(diào)用方法及裝置,可以接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。本發(fā)明可以通過(guò)RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息來(lái)執(zhí)行該方法,因此無(wú)需生成IDL文件,簡(jiǎn)化了RPC調(diào)用過(guò)程。

當(dāng)然,實(shí)施本發(fā)明的任一產(chǎn)品或方法必不一定需要同時(shí)達(dá)到以上所述的所有優(yōu)點(diǎn)。

附圖說(shuō)明

為了更清楚地說(shuō)明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對(duì)實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡(jiǎn)單地介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。

圖1為本發(fā)明實(shí)施例提供的一種遠(yuǎn)程過(guò)程調(diào)用方法的流程圖;

圖2為本發(fā)明實(shí)施例提供的另一種遠(yuǎn)程過(guò)程調(diào)用方法的流程圖;

圖3為本發(fā)明實(shí)施例提供的一種遠(yuǎn)程過(guò)程調(diào)用裝置的結(jié)構(gòu)示意圖;

圖4為本發(fā)明實(shí)施例提供的另一種遠(yuǎn)程過(guò)程調(diào)用裝置的結(jié)構(gòu)示意圖。

具體實(shí)施方式

下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對(duì)本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例。基于本發(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。

如圖1所示,本發(fā)明實(shí)施例提供的一種遠(yuǎn)程過(guò)程調(diào)用方法,應(yīng)用于服務(wù)端設(shè)備,所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備通信連接,該方法可以包括:

S100、接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;

其中,在步驟S100前,所述方法還可以包括:

所述服務(wù)端設(shè)備對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng);

在監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,與所述客戶(hù)端設(shè)備建立鏈接。

具體的,可以由acceptImpl根據(jù)客戶(hù)端設(shè)備的連接請(qǐng)求設(shè)置與客戶(hù)端設(shè)備進(jìn)行連接的參數(shù)以與客戶(hù)端設(shè)備建立鏈接。

進(jìn)一步,為了保持與客戶(hù)端設(shè)備的鏈接保持穩(wěn)定,本發(fā)明還可以包括:

所述服務(wù)端設(shè)備對(duì)與客戶(hù)端設(shè)備的鏈接狀態(tài)進(jìn)行監(jiān)控;

在所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備的鏈接斷開(kāi)時(shí),重新建立與該客戶(hù)端設(shè)備的鏈接。

由于服務(wù)端設(shè)備對(duì)與客戶(hù)端設(shè)備的鏈接狀態(tài)進(jìn)行監(jiān)控,因此在所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備的鏈接斷開(kāi)時(shí),就可以及時(shí)重新建立與該客戶(hù)端設(shè)備的鏈接以完成相應(yīng)工作,提高了工作效率。

在本發(fā)明其他實(shí)施例中,服務(wù)端設(shè)備可以定期對(duì)與各客戶(hù)端設(shè)備的所有鏈接進(jìn)行掃描,根據(jù)鏈接數(shù)量進(jìn)行相應(yīng)處理。例如:設(shè)定最小鏈接數(shù)量及最大鏈接數(shù)量,當(dāng)當(dāng)前鏈接數(shù)量大于最大鏈接數(shù)量時(shí),將當(dāng)前鏈接中沒(méi)有使用的鏈接回收,以減小當(dāng)前鏈接數(shù)量,節(jié)省因過(guò)多鏈接數(shù)量帶來(lái)的系統(tǒng)開(kāi)銷(xiāo)。

本發(fā)明同時(shí)適用于Java.NIO和標(biāo)準(zhǔn)IO,其中,Java.NIO和標(biāo)準(zhǔn)IO采用相同的TServer,Java.NIO根據(jù)服務(wù)端設(shè)備的CPU核數(shù),啟動(dòng)固定個(gè)數(shù)的線(xiàn)程處理Java.NIO事件,標(biāo)準(zhǔn)IO可以根據(jù)實(shí)際情況設(shè)定最小線(xiàn)程數(shù)和最大線(xiàn)程數(shù)處理標(biāo)準(zhǔn)IO事件。

S200、根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;

其中,方法的標(biāo)識(shí)信息可以為:請(qǐng)求方法簽名。

所述預(yù)設(shè)的RPC協(xié)議可以為:

所述RPC請(qǐng)求的格式為:包長(zhǎng)、頭大小、請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度、編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容、body主體內(nèi)容長(zhǎng)度、body主體數(shù)據(jù)。

其中,在RPC請(qǐng)求的包頭的TMessage.name里面存儲(chǔ)KEY=VALUE形式的頭部數(shù)據(jù)。包頭中包含請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度和編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容;其中,請(qǐng)求方法簽名由請(qǐng)求的方法的名稱(chēng)和參數(shù)列表構(gòu)成。SEQID用于標(biāo)識(shí)不同的RPC請(qǐng)求,編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容用于保存請(qǐng)求及響應(yīng)內(nèi)容。消息類(lèi)型是遠(yuǎn)程方法調(diào)用的類(lèi)型,包括四種類(lèi)型:CALL(業(yè)務(wù)調(diào)用)、EXCEPTION(異常處理)、REPLY(請(qǐng)求響應(yīng))和ONEWAY(擴(kuò)展使用)。擴(kuò)展數(shù)據(jù)主要用于除了業(yè)務(wù)數(shù)據(jù)外其它的數(shù)據(jù)傳輸和方法調(diào)用,也可以作為方法回調(diào)的用途。

S300、確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

具體的,由于服務(wù)端設(shè)備可以通過(guò)與多個(gè)客戶(hù)端設(shè)備通信連接,因此服務(wù)端設(shè)備常需要處理多個(gè)并發(fā)的RPC請(qǐng)求,這種情況下,可以通過(guò)上述消息生產(chǎn)隊(duì)列的方式處理并發(fā)的RPC請(qǐng)求。

其中,步驟S300可以具體包括:

在所述服務(wù)端設(shè)備本地查找具有得到的所述標(biāo)識(shí)信息的鍵key,根據(jù)與所述key對(duì)應(yīng)的值value中存儲(chǔ)的方法參數(shù)生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

其中,在生成寫(xiě)消息時(shí),將生成的寫(xiě)消息放入寫(xiě)消息生產(chǎn)隊(duì)列中;

在生成讀消息時(shí),將生成的讀消息放入讀消息生產(chǎn)隊(duì)列中。

服務(wù)端設(shè)備可以讀取需要對(duì)外提供服務(wù)的類(lèi),對(duì)外服務(wù)的接口通過(guò)注解的形式進(jìn)行聲明,由統(tǒng)一的Sign方法進(jìn)行注冊(cè),以key-value形式保存到服務(wù)端設(shè)備內(nèi)存當(dāng)中,其中key即注解實(shí)例名稱(chēng),value值存儲(chǔ)實(shí)際的類(lèi)方法和參數(shù)列表,當(dāng)服務(wù)端接收到服務(wù)調(diào)用請(qǐng)求時(shí),從key中識(shí)別指定服務(wù),并實(shí)現(xiàn)調(diào)用。其中,注解可以標(biāo)識(shí)方法可被用于遠(yuǎn)程調(diào)用,沒(méi)有注解的方法無(wú)法被遠(yuǎn)程調(diào)用。

S400、從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。

具體的,可以使用java的線(xiàn)程池去管理并發(fā)的連接、異步處理連接和遠(yuǎn)程調(diào)用請(qǐng)求。

其中,步驟S400可以包括:

從所述寫(xiě)消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述寫(xiě)消息生產(chǎn)隊(duì)列中的寫(xiě)消息,在執(zhí)行所述寫(xiě)消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述寫(xiě)消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述寫(xiě)消息消費(fèi)者線(xiàn)程池;

從所述讀消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述讀消息生產(chǎn)隊(duì)列中的讀消息,在執(zhí)行所述讀消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述讀消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述讀消息消費(fèi)者線(xiàn)程池。

通過(guò)單獨(dú)的讀消息生產(chǎn)隊(duì)列及寫(xiě)消息生產(chǎn)隊(duì)列,就使得進(jìn)行讀及進(jìn)行寫(xiě)的線(xiàn)程分離。

可選的,如圖2所示,本發(fā)明實(shí)施例提供的另一種遠(yuǎn)程過(guò)程調(diào)用方法,還可以包括:

S500、對(duì)線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息的執(zhí)行結(jié)果進(jìn)行監(jiān)控;

S600、判斷所述執(zhí)行結(jié)果是否滿(mǎn)足預(yù)設(shè)的觸發(fā)條件,如果是,則執(zhí)行步驟S700;

S700、觸發(fā)與所滿(mǎn)足的觸發(fā)條件匹配的事件。

具體的,本發(fā)明可以采用Java.NIO的selector選擇器模型進(jìn)行事件注冊(cè)。

具體的,在本發(fā)明其他實(shí)施例中,在所述服務(wù)端設(shè)備對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)之前,所述方法還可以包括:

綁定對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)的監(jiān)聽(tīng)地址TServerSocket,注冊(cè)與所述客戶(hù)端設(shè)備進(jìn)行連接的接口方法存根RpcProxyProcessor;

啟動(dòng)IO線(xiàn)程,創(chuàng)建選擇器Selector,將ServerSocketChannel注冊(cè)到Selector以監(jiān)聽(tīng)客戶(hù)端設(shè)備的連接請(qǐng)求,Selector輪詢(xún)就緒的Selector key,其中,所述Selector key為客戶(hù)端設(shè)備連接服器端設(shè)備時(shí)注冊(cè)到通道ServerSocketChannel中的事件的對(duì)象標(biāo)識(shí)。

具體的,解析RPC請(qǐng)求后,可以異步寫(xiě)B(tài)yteBuffer到ServerSocketChannel。

其中,ServerSocketChannel是一個(gè)可以監(jiān)聽(tīng)新進(jìn)來(lái)的TCP連接的通道,就像標(biāo)準(zhǔn)IO中的ServerSocket一樣。

在這種情況下,步驟S100可以包括:

在從所述監(jiān)聽(tīng)地址TServerSocket監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,由AcceptImpl設(shè)置與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備進(jìn)行連接的參數(shù)并根據(jù)設(shè)置的參數(shù)與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備建立鏈接;

步驟S300可以包括:

由所述Selector確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

其中,TServerSocket主要作為服務(wù)器端的套接字管理器使用。它封裝了服務(wù)端設(shè)備的套接字。在打開(kāi)套接字后,服務(wù)端設(shè)備就處于監(jiān)聽(tīng)狀態(tài),在接收到其它機(jī)器的連接請(qǐng)求后,與客戶(hù)端設(shè)備建立鏈接,創(chuàng)建一個(gè)新的套接字,用于和客戶(hù)端設(shè)備互傳數(shù)據(jù),此時(shí)TServerSocket組件則繼續(xù)監(jiān)聽(tīng)客戶(hù)端設(shè)備的連接請(qǐng)求。

本發(fā)明實(shí)施例提供的遠(yuǎn)程過(guò)程調(diào)用方法,可以接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。本發(fā)明可以通過(guò)RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息來(lái)執(zhí)行該方法,因此無(wú)需生成IDL文件,簡(jiǎn)化了RPC調(diào)用過(guò)程。本發(fā)明不需要修改客戶(hù)端設(shè)備對(duì)所要調(diào)用的方法的定義,客戶(hù)端設(shè)備只需要通過(guò)方法的標(biāo)識(shí)信息就可以實(shí)現(xiàn)方法的調(diào)用,簡(jiǎn)單易用。

與上述本發(fā)明實(shí)施例提供的方法相對(duì)應(yīng),本發(fā)明實(shí)施例還提供了遠(yuǎn)程過(guò)程調(diào)用裝置。

如圖3所示,本發(fā)明實(shí)施例提供的一種遠(yuǎn)程過(guò)程調(diào)用裝置,應(yīng)用于服務(wù)端設(shè)備,所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備通信連接,該裝置可以包括:請(qǐng)求接收單元100、請(qǐng)求解析單元200、方法執(zhí)行單元300和消息執(zhí)行單元400;

所述請(qǐng)求接收單元100,用于接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;

所述請(qǐng)求解析單元200,用于根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;

所述方法執(zhí)行單元300,用于確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

所述消息執(zhí)行單元400,用于從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。

其中,所述裝置還可以包括:請(qǐng)求監(jiān)聽(tīng)單元和鏈接建立單元,

所述請(qǐng)求監(jiān)聽(tīng)單元,用于在所述請(qǐng)求接收單元100接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求前,對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng);

所述鏈接建立單元,用于在監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,與所述客戶(hù)端設(shè)備建立鏈接。

具體的,可以由acceptImpl根據(jù)客戶(hù)端設(shè)備的連接請(qǐng)求設(shè)置與客戶(hù)端設(shè)備進(jìn)行連接的參數(shù)以與客戶(hù)端設(shè)備建立鏈接。

進(jìn)一步,為了保持與客戶(hù)端設(shè)備的鏈接保持穩(wěn)定,本發(fā)明還可以包括:鏈接監(jiān)控單元和鏈接重建單元,

所述鏈接監(jiān)控單元,用于對(duì)與客戶(hù)端設(shè)備的鏈接狀態(tài)進(jìn)行監(jiān)控;

所述鏈接重建單元,用于在所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備的鏈接斷開(kāi)時(shí),重新建立與該客戶(hù)端設(shè)備的鏈接。

由于服務(wù)端設(shè)備對(duì)與客戶(hù)端設(shè)備的鏈接狀態(tài)進(jìn)行監(jiān)控,因此在所述服務(wù)端設(shè)備與客戶(hù)端設(shè)備的鏈接斷開(kāi)時(shí),就可以及時(shí)重新建立與該客戶(hù)端設(shè)備的鏈接以完成相應(yīng)工作,提高了工作效率。

在本發(fā)明其他實(shí)施例中,服務(wù)端設(shè)備可以定期對(duì)與各客戶(hù)端設(shè)備的所有鏈接進(jìn)行掃描,根據(jù)鏈接數(shù)量進(jìn)行相應(yīng)處理。例如:設(shè)定最小鏈接數(shù)量及最大鏈接數(shù)量,當(dāng)當(dāng)前鏈接數(shù)量大于最大鏈接數(shù)量時(shí),將當(dāng)前鏈接中沒(méi)有使用的鏈接回收,以減小當(dāng)前鏈接數(shù)量,節(jié)省因過(guò)多鏈接數(shù)量帶來(lái)的系統(tǒng)開(kāi)銷(xiāo)。

本發(fā)明同時(shí)適用于Java.NIO和標(biāo)準(zhǔn)IO,其中,Java.NIO和標(biāo)準(zhǔn)IO采用相同的TServer,Java.NIO根據(jù)服務(wù)端設(shè)備的CPU核數(shù),啟動(dòng)固定個(gè)數(shù)的線(xiàn)程處理Java.NIO事件,標(biāo)準(zhǔn)IO可以根據(jù)實(shí)際情況設(shè)定最小線(xiàn)程數(shù)和最大線(xiàn)程數(shù)處理標(biāo)準(zhǔn)IO事件。

其中,方法的標(biāo)識(shí)信息可以為:請(qǐng)求方法簽名。

所述預(yù)設(shè)的RPC協(xié)議可以為:

所述RPC請(qǐng)求的格式為:包長(zhǎng)、頭大小、請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度、編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容、body主體內(nèi)容長(zhǎng)度、body主體數(shù)據(jù)。

其中,在RPC請(qǐng)求的包頭的TMessage.name里面存儲(chǔ)KEY=VALUE形式的頭部數(shù)據(jù)。包頭中包含請(qǐng)求方法簽名、消息類(lèi)型、序列編號(hào)SEQID、擴(kuò)展數(shù)據(jù)長(zhǎng)度和編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容;其中,請(qǐng)求方法簽名由請(qǐng)求的方法的名稱(chēng)和參數(shù)列表構(gòu)成。SEQID用于標(biāo)識(shí)不同的RPC請(qǐng)求,編碼后的擴(kuò)展數(shù)據(jù)內(nèi)容用于保存請(qǐng)求及響應(yīng)內(nèi)容。消息類(lèi)型是遠(yuǎn)程方法調(diào)用的類(lèi)型,包括四種類(lèi)型:CALL(業(yè)務(wù)調(diào)用)、EXCEPTION(異常處理)、REPLY(請(qǐng)求響應(yīng))和ONEWAY(擴(kuò)展使用)。擴(kuò)展數(shù)據(jù)主要用于除了業(yè)務(wù)數(shù)據(jù)外其它的數(shù)據(jù)傳輸和方法調(diào)用,也可以作為方法回調(diào)的用途。

具體的,由于服務(wù)端設(shè)備可以通過(guò)與多個(gè)客戶(hù)端設(shè)備通信連接,因此服務(wù)端設(shè)備常需要處理多個(gè)并發(fā)的RPC請(qǐng)求,這種情況下,可以通過(guò)上述消息生產(chǎn)隊(duì)列的方式處理并發(fā)的RPC請(qǐng)求。

其中,方法執(zhí)行單元300可以具體用于:在所述服務(wù)端設(shè)備本地查找具有得到的所述標(biāo)識(shí)信息的鍵key,根據(jù)與所述key對(duì)應(yīng)的值value中存儲(chǔ)的方法參數(shù)生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

其中,在生成寫(xiě)消息時(shí),將生成的寫(xiě)消息放入寫(xiě)消息生產(chǎn)隊(duì)列中;

在生成讀消息時(shí),將生成的讀消息放入讀消息生產(chǎn)隊(duì)列中。

服務(wù)端設(shè)備可以讀取需要對(duì)外提供服務(wù)的類(lèi),對(duì)外服務(wù)的接口通過(guò)注解的形式進(jìn)行聲明,由統(tǒng)一的Sign方法進(jìn)行注冊(cè),以key-value形式保存到服務(wù)端設(shè)備內(nèi)存當(dāng)中,其中key即注解實(shí)例名稱(chēng),value值存儲(chǔ)實(shí)際的類(lèi)方法和參數(shù)列表,當(dāng)服務(wù)端接收到服務(wù)調(diào)用請(qǐng)求時(shí),從key中識(shí)別指定服務(wù),并實(shí)現(xiàn)調(diào)用。其中,注解可以標(biāo)識(shí)方法可被用于遠(yuǎn)程調(diào)用,沒(méi)有注解的方法無(wú)法被遠(yuǎn)程調(diào)用。

具體的,可以使用java的線(xiàn)程池去管理并發(fā)的連接、異步處理連接和遠(yuǎn)程調(diào)用請(qǐng)求。

其中,消息執(zhí)行單元400可以包括:寫(xiě)消息處理子單元和讀消息處理子單元,

所述寫(xiě)消息處理子單元,用于從所述寫(xiě)消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述寫(xiě)消息生產(chǎn)隊(duì)列中的寫(xiě)消息,在執(zhí)行所述寫(xiě)消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述寫(xiě)消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述寫(xiě)消息消費(fèi)者線(xiàn)程池;

所述讀消息處理子單元,用于從所述讀消息消費(fèi)者線(xiàn)程池中獲取線(xiàn)程執(zhí)行所述讀消息生產(chǎn)隊(duì)列中的讀消息,在執(zhí)行所述讀消息成功后,將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備,其中,在線(xiàn)程執(zhí)行完所述讀消息后,所述服務(wù)端設(shè)備將該線(xiàn)程放回所述讀消息消費(fèi)者線(xiàn)程池。

通過(guò)單獨(dú)的讀消息生產(chǎn)隊(duì)列及寫(xiě)消息生產(chǎn)隊(duì)列,就使得進(jìn)行讀及進(jìn)行寫(xiě)的線(xiàn)程分離。

可選的,如圖4所示,本發(fā)明實(shí)施例提供的另一種遠(yuǎn)程過(guò)程調(diào)用裝置,還可以包括:結(jié)果監(jiān)控單元500、觸發(fā)判斷單元600和事件觸發(fā)單元700,

所述結(jié)果監(jiān)控單元500,用于對(duì)線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息的執(zhí)行結(jié)果進(jìn)行監(jiān)控;

所述觸發(fā)判斷單元600,用于判斷所述執(zhí)行結(jié)果是否滿(mǎn)足預(yù)設(shè)的觸發(fā)條件,如果是,則觸發(fā)所述事件觸發(fā)單元700;

所述事件觸發(fā)單元700,用于觸發(fā)與所滿(mǎn)足的觸發(fā)條件匹配的事件。

具體的,本發(fā)明可以采用Java.NIO的selector選擇器模型進(jìn)行事件注冊(cè)。

具體的,在本發(fā)明其他實(shí)施例中,所述裝置還可以包括:地址綁定單元和選擇器創(chuàng)建單元,

所述地址綁定單元,用于在所述請(qǐng)求監(jiān)聽(tīng)單元對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)之前,綁定對(duì)所述客戶(hù)端設(shè)備的連接請(qǐng)求進(jìn)行監(jiān)聽(tīng)的監(jiān)聽(tīng)地址TServerSocket,注冊(cè)與所述客戶(hù)端設(shè)備進(jìn)行連接的接口方法存根RpcProxyProcessor;

所述選擇器創(chuàng)建單元,用于啟動(dòng)IO線(xiàn)程,創(chuàng)建選擇器Selector,將ServerSocketChannel注冊(cè)到Selector以監(jiān)聽(tīng)客戶(hù)端設(shè)備的連接請(qǐng)求,Selector輪詢(xún)就緒的Selector key,其中,所述Selector key為客戶(hù)端設(shè)備連接服器端設(shè)備時(shí)注冊(cè)到通道ServerSocketChannel中的事件的對(duì)象標(biāo)識(shí)。

具體的,解析RPC請(qǐng)求后,可以異步寫(xiě)B(tài)yteBuffer到ServerSocketChannel。

其中,ServerSocketChannel是一個(gè)可以監(jiān)聽(tīng)新進(jìn)來(lái)的TCP連接的通道,就像標(biāo)準(zhǔn)IO中的ServerSocket一樣。

在這種情況下,所述請(qǐng)求接收單元100,可以具體用于在從所述監(jiān)聽(tīng)地址TServerSocket監(jiān)聽(tīng)到所述客戶(hù)端設(shè)備的連接請(qǐng)求后,由AcceptImpl設(shè)置與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備進(jìn)行連接的參數(shù)并根據(jù)設(shè)置的參數(shù)與發(fā)送該連接請(qǐng)求的客戶(hù)端設(shè)備建立鏈接;

方法執(zhí)行單元300,可以具體用于由所述Selector確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;

其中,TServerSocket主要作為服務(wù)器端的套接字管理器使用。它封裝了服務(wù)端設(shè)備的套接字。在打開(kāi)套接字后,服務(wù)端設(shè)備就處于監(jiān)聽(tīng)狀態(tài),在接收到其它機(jī)器的連接請(qǐng)求后,與客戶(hù)端設(shè)備建立鏈接,創(chuàng)建一個(gè)新的套接字,用于和客戶(hù)端設(shè)備互傳數(shù)據(jù),此時(shí)TServerSocket組件則繼續(xù)監(jiān)聽(tīng)客戶(hù)端設(shè)備的連接請(qǐng)求。

本發(fā)明實(shí)施例提供的遠(yuǎn)程過(guò)程調(diào)用裝置,可以接收所述客戶(hù)端設(shè)備發(fā)送的遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC請(qǐng)求;根據(jù)預(yù)設(shè)的RPC協(xié)議對(duì)所述RPC請(qǐng)求進(jìn)行解析,得到所述RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息;確定所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法,執(zhí)行所述客戶(hù)端設(shè)備請(qǐng)求調(diào)用的方法以生成與該方法對(duì)應(yīng)的消息,將生成的消息放入消息生產(chǎn)隊(duì)列中,其中,生成的消息包括寫(xiě)消息和/或讀消息;從線(xiàn)程池中選擇線(xiàn)程執(zhí)行所述消息生產(chǎn)隊(duì)列中的消息并將執(zhí)行結(jié)果反饋至所述客戶(hù)端設(shè)備。本發(fā)明可以通過(guò)RPC請(qǐng)求中的請(qǐng)求調(diào)用的方法的標(biāo)識(shí)信息來(lái)執(zhí)行該方法,因此無(wú)需生成IDL文件,簡(jiǎn)化了RPC調(diào)用過(guò)程。本發(fā)明不需要修改客戶(hù)端設(shè)備對(duì)所要調(diào)用的方法的定義,客戶(hù)端設(shè)備只需要通過(guò)方法的標(biāo)識(shí)信息就可以實(shí)現(xiàn)方法的調(diào)用,簡(jiǎn)單易用。

需要說(shuō)明的是,在本文中,諸如第一和第二等之類(lèi)的關(guān)系術(shù)語(yǔ)僅僅用來(lái)將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開(kāi)來(lái),而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、物品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、物品或者設(shè)備中還存在另外的相同要素。

本說(shuō)明書(shū)中的各個(gè)實(shí)施例均采用相關(guān)的方式描述,各個(gè)實(shí)施例之間相同相似的部分互相參見(jiàn)即可,每個(gè)實(shí)施例重點(diǎn)說(shuō)明的都是與其他實(shí)施例的不同之處。尤其,對(duì)于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡(jiǎn)單,相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。

以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均包含在本發(fā)明的保護(hù)范圍內(nèi)。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢(xún)問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1