本發(fā)明屬于通信及互聯(lián)網(wǎng)金融領(lǐng)域,特別涉及一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置、方法及系統(tǒng)。
背景技術(shù):
thrift是由facebook開源出來用在系統(tǒng)以及各語言之間的進(jìn)行rpc通信的基礎(chǔ)軟件框架,thrift通過一個中間描述文件以及thrift特有的中間描述語言來定義數(shù)據(jù)類型和服務(wù)接口,通過thrift的編譯器可以利用中間描述文件來生成各種語言的基礎(chǔ)代碼,從而實現(xiàn)各個語言以及系統(tǒng)間的無縫調(diào)用。thrift編譯器可在c++,java,python,php,ruby,erlang,perl,haskell,c#,cocoa,javascript,node.js,smalltalk,ocaml,delphi間提供支持??偟脕碚f,thrift提供了很完備的網(wǎng)絡(luò)通信和中間協(xié)議。參考出處:http://thrift.apache.org/;http://dongxicheng.org/search-engine/thrift-framework-intro/。
但是利用thrift進(jìn)行服務(wù)和客戶端開發(fā),需要開發(fā)人員懂得使用thrift開發(fā)語言,對于不熟悉thrift環(huán)境的開發(fā)人員,存在較大的學(xué)習(xí)成本,不利于高效開發(fā);此外,采用thrift原生開發(fā)方式,需要在開發(fā)環(huán)境中帶入thrift代碼,存在諸多不便。
技術(shù)實現(xiàn)要素:
為了克服現(xiàn)有技術(shù)中存在的如下技術(shù)缺陷:1、上手成本偏高,需要所有開發(fā)人員都要關(guān)心thrift的客戶端如何開發(fā),無法高效的開發(fā)和使用;2、用原生的開發(fā)方式開發(fā)會讓業(yè)務(wù)代碼侵入很多關(guān)于thrift本身的代碼,使得業(yè)務(wù)代碼非常臃腫、不清晰、不易維護(hù)以及影響代碼可讀性;3、缺乏靈活調(diào)度和監(jiān)控調(diào)用過程方案;本發(fā)明在thrift基礎(chǔ)上繼續(xù)封裝,充分利用thrift優(yōu)秀的協(xié)議框架基礎(chǔ)之上,開發(fā)一套可以和spring技術(shù)體系高度融合、讓開發(fā)人員透明使用、幾乎無學(xué)習(xí)成本、簡單高效開發(fā)、無任何thrift代碼侵入、靈活調(diào)度、充分監(jiān)控調(diào)用過程數(shù)據(jù)的遠(yuǎn)程過程調(diào)用系統(tǒng)。
本發(fā)明首先提供了一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置,包括api模塊、遠(yuǎn)程調(diào)用模塊(tfcilentfactory);其中api模塊包括若干預(yù)設(shè)服務(wù)約定接口及若干thrift調(diào)用基礎(chǔ)類,一個預(yù)設(shè)服務(wù)約定接口對應(yīng)一種遠(yuǎn)程服務(wù),所述遠(yuǎn)程調(diào)用模塊(tfcilentfactory)包括若干java基礎(chǔ)工具類,所述java基礎(chǔ)工具類可讀取api模塊中包含的預(yù)設(shè)服務(wù)約定接口,并結(jié)合api包中的thrift編譯器生成的基礎(chǔ)類,生成一個代理對象,并擴(kuò)展java基礎(chǔ)類工具中的spring將生成的代理對象注入到spring所管理的context中,供調(diào)用者通過spring注解機(jī)制獲取代理對象,通過代理對象以thrift協(xié)議觸發(fā)對遠(yuǎn)程服務(wù)的調(diào)用。
優(yōu)選地,所述api模塊中各預(yù)設(shè)服務(wù)約定接口通過url和tprotocol兩個變量與一種特定遠(yuǎn)程服務(wù)對應(yīng),url用于定義該特定遠(yuǎn)程服務(wù)的地址,tprotocol用于定義該特定遠(yuǎn)程服務(wù)所以使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式,所述遠(yuǎn)程調(diào)用模塊(tfcilentfactory)中的java基礎(chǔ)類工具可利用java反射機(jī)制讀取任何api包中約定格式的接口,并提取出該接口對應(yīng)的服務(wù)的url和網(wǎng)絡(luò)傳輸格式tprotocol,結(jié)合api包中thrift編譯器生成的基礎(chǔ)代碼,利用java的動態(tài)代理技術(shù),根據(jù)約定接口動態(tài)生成一個代理對象。根據(jù)項目涉及及目標(biāo)調(diào)用環(huán)境編程語言需求,相關(guān)變量或參數(shù)的數(shù)量可以根據(jù)實際需要進(jìn)行調(diào)整。
優(yōu)選地,java基礎(chǔ)類工具包含經(jīng)擴(kuò)展的springbeanfactorypostprocessor后置處理器,該處理器中設(shè)有自定義處理邏輯,用以將代理對象注入到spring所管理的context中,供調(diào)用者通過spring注解機(jī)制獲取代理對象,通過代理對象以thrift協(xié)議觸發(fā)對遠(yuǎn)程服務(wù)的調(diào)用。
優(yōu)選地,還包括服務(wù)端模塊和客戶端模塊,所述服務(wù)端模塊包括基于thrift協(xié)議的若干預(yù)設(shè)服務(wù),所述服務(wù)端模塊可根據(jù)客戶端模塊發(fā)出的調(diào)用請求向調(diào)用者反饋對應(yīng)的預(yù)設(shè)服務(wù)處理結(jié)果,并記錄執(zhí)行數(shù)據(jù),所述執(zhí)行數(shù)據(jù)包括輸入流、輸出流、基于thrift協(xié)議的預(yù)設(shè)服務(wù)、調(diào)用成功情況、響應(yīng)時間中的一種或多種。
本發(fā)明還提供了一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法,包括以下步驟:
建立api包的步驟,所述api包中若干預(yù)設(shè)服務(wù)約定接口及thrift調(diào)用基礎(chǔ)類工具,一個預(yù)設(shè)服務(wù)約定接口對應(yīng)一種遠(yuǎn)程服務(wù);
建立遠(yuǎn)程調(diào)用包(tfcilentfactory)的步驟,所述遠(yuǎn)程調(diào)用包設(shè)有特定開發(fā)語言對應(yīng)的若干基礎(chǔ)類工具,所述特定開發(fā)語言對應(yīng)的基礎(chǔ)類工具可讀取所述api包中包含的預(yù)設(shè)服務(wù)約定接口,并協(xié)同thrift調(diào)用基礎(chǔ)類工具產(chǎn)生的基礎(chǔ)代碼,動態(tài)生成一個代理對象。
本發(fā)明還提供了另一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法,包括以下步驟:
步驟1:建立thrift中間描述文件,其中定義了若干服務(wù);
步驟2:對中間文件定義一個注解,注解里面定義兩個變量,其中一個變量用于定義各服務(wù)的遠(yuǎn)程地址(url),另一個變量用于定義遠(yuǎn)程服務(wù)所使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式(tprotocol);
步驟3:將步驟2中產(chǎn)生的注解存放于一個公共的基礎(chǔ)包中;
步驟4:定義一個約定接口,并繼承對應(yīng)服務(wù)的接口,并在接口上打上注解定義好步驟2中的兩個變量;
步驟5:利用thrift編譯器和thrift-maven-plugin插件,將步驟4中的接口與對應(yīng)的thrift中間描述文件所生成的thrift調(diào)用基礎(chǔ)類工具打包成api包;
步驟6:建立遠(yuǎn)程調(diào)用包(tfcilentfactory),所述遠(yuǎn)程調(diào)用包設(shè)有特定開發(fā)語言對應(yīng)的若干基礎(chǔ)類工具,所述特定開發(fā)語言對應(yīng)的基礎(chǔ)類工具可讀取api模塊中包含的預(yù)設(shè)服務(wù)約定接口,并協(xié)同thrift調(diào)用基礎(chǔ)類工具產(chǎn)生的基礎(chǔ)代碼,動態(tài)生成一個代理對象,供業(yè)務(wù)開發(fā)者實現(xiàn)對特定服務(wù)的本地化遠(yuǎn)程調(diào)用。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,步驟6中的遠(yuǎn)程調(diào)用包為java開發(fā)語言對應(yīng)的若干基礎(chǔ)類工具,該等工具類可利用java反射原理讀取api包中任一約定格式的接口,并提取出該接口對應(yīng)服務(wù)的注解變量,結(jié)合api包中thrift編譯器生成的基礎(chǔ)代碼,利用java的動態(tài)代理技術(shù),根據(jù)約定接口動態(tài)生成一個代理對象。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,擴(kuò)展spring的beanfactorypostprocessor后置處理器,添加自定義處理邏輯,使引入了api包和遠(yuǎn)程調(diào)用包的工程可以在spring容器啟動后自動掃描所有該工程引入的約定接口,并利用掃描到的約定接口生成對應(yīng)的代理對象,將產(chǎn)生的代理對象自動存入springcontext;供業(yè)務(wù)開發(fā)者在需要使用該服務(wù)的類中就可以創(chuàng)建約定接口類型的成員變量,并在其上約定接口上打@autowired,注解,即可快捷方便的自動注入代理對象,實現(xiàn)對特定服務(wù)的本地化遠(yuǎn)程調(diào)用。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,還包括步驟7,遠(yuǎn)程過程調(diào)用方法被執(zhí)行時利用hystrix進(jìn)行包裝,收集對應(yīng)服務(wù)的統(tǒng)計數(shù)據(jù),統(tǒng)計數(shù)據(jù)至少包括成功次數(shù)、失敗次數(shù)、失敗比例、調(diào)用時長中的一種或多種。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,統(tǒng)計數(shù)據(jù)以一定頻率將統(tǒng)計數(shù)據(jù)發(fā)往時序存儲數(shù)據(jù)庫influxdb,通過grafana以圖表形式實時將顯示相關(guān)數(shù)據(jù)。
優(yōu)選地,在前述任一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,還包括步驟8,定義一個服務(wù)端處理工具包,主要入口需提供三個參數(shù):輸入流、輸出流、thrift服務(wù)具體實現(xiàn)的實例,處理邏輯讀取api包產(chǎn)生的通信格式tprotocol,并結(jié)合thrift編譯器生成的基礎(chǔ)類以及thrift服務(wù)具體實現(xiàn)實例,將輸入流讀取為請求對象,調(diào)用具體實現(xiàn)實例進(jìn)行處理,處理結(jié)果回寫入輸出流,完成一次調(diào)用。
優(yōu)選地,在前述任一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用方法中,好包括步驟9,具體為擴(kuò)展默認(rèn)的遠(yuǎn)程服務(wù)所使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式變量,實現(xiàn)一個自定義的遠(yuǎn)程服務(wù)所使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式變量處理器,在擴(kuò)展的遠(yuǎn)程服務(wù)的變量中再解析傳輸協(xié)議時增加詳細(xì)的日志監(jiān)控,包括服務(wù)端的調(diào)用性能,傳遞的參數(shù)數(shù)據(jù)。
本發(fā)明還提供了一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng),包括服務(wù)端和調(diào)用端;所述服務(wù)端包括前述任一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置,且設(shè)有基于thrift協(xié)議的若干預(yù)設(shè)服務(wù),所述服務(wù)端可根據(jù)調(diào)用端發(fā)送的請求,向調(diào)用者反饋對應(yīng)的預(yù)設(shè)服務(wù);所述調(diào)用端,可供調(diào)用者根據(jù)所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置生成的代理對象,向服務(wù)端發(fā)送調(diào)用請求,并接受服務(wù)端反饋的預(yù)設(shè)服務(wù)。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,所述服務(wù)端在處理調(diào)用請求的同時記錄執(zhí)行數(shù)據(jù),所述執(zhí)行數(shù)據(jù)包括輸入流、輸出流、基于thrift協(xié)議的預(yù)設(shè)服務(wù)、調(diào)用成功情況、響應(yīng)時間中的一種或多種。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,所述系統(tǒng)采用http通訊協(xié)議,并基于nginx構(gòu)架。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,還包括hystrix封裝裝置,用于在所述服務(wù)端執(zhí)行調(diào)用請求時收集對應(yīng)服務(wù)的統(tǒng)計數(shù)據(jù),統(tǒng)計數(shù)據(jù)至少包括成功次數(shù)、失敗次數(shù)、失敗比例、調(diào)用時長中的一種或多種。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,還包括時序存儲數(shù)據(jù)庫(influxdb),用于按照一定頻率接收和存儲所述統(tǒng)計數(shù)據(jù)。
優(yōu)選地,在前述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,還包括grafana裝置,用于以圖表形式實時顯示時序存儲數(shù)據(jù)庫接收的統(tǒng)計數(shù)據(jù)。
優(yōu)選地,在前述任一種基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)中,還包括thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式變量處理器,用于擴(kuò)展默認(rèn)的遠(yuǎn)程服務(wù)所使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式變量,通過擴(kuò)展的遠(yuǎn)程服務(wù)的變量中再解析傳輸協(xié)議時增加詳細(xì)的日志監(jiān)控,包括服務(wù)端的調(diào)用性能,傳遞的參數(shù)數(shù)據(jù)。
通過本發(fā)明所述技術(shù)方案,至少能夠?qū)崿F(xiàn)以下有益效果:
1、客戶端調(diào)用手寫代碼書寫量以及服務(wù)端注入thrift實現(xiàn)的代碼量由平均5行降為1行,開發(fā)效率直接提升5倍左右;
2、業(yè)務(wù)代碼中沒有任何thrift相關(guān)代碼的體現(xiàn),實現(xiàn)了對thrift調(diào)用實現(xiàn)代碼的完全隔離,對業(yè)務(wù)開發(fā)者完全透明,大大降低了業(yè)務(wù)組之間服務(wù)相互調(diào)用的開發(fā)門檻與成本,并且完全不影響任何代碼可讀性;
3、能實時觀察各個接口調(diào)用數(shù)據(jù),掌握各服務(wù)實時吞吐量和健康情況,方便制定擴(kuò)容和維護(hù)等策略;
4、采用http協(xié)議通訊,基于nginx可以方便快速的進(jìn)行流量調(diào)度。
附圖說明
圖1是本發(fā)明所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置結(jié)構(gòu)示意圖;
圖2是本發(fā)明所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)及方法實施例調(diào)用過程流程圖;
圖3是本發(fā)明所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)網(wǎng)絡(luò)結(jié)構(gòu)圖;
圖4是本發(fā)明所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)實施例效果示意圖。
具體實施方式
為了使本發(fā)明技術(shù)方案更容易理解,現(xiàn)結(jié)合附圖采用具體實施例的方式,對本發(fā)明的技術(shù)方案進(jìn)行清晰、完整的描述。應(yīng)當(dāng)注意,在此所述的實施例僅為本發(fā)明的部分實施例,而非本發(fā)明的全部實現(xiàn)方式,所述實施例只有示例性,其作用只在于為審查員及公眾提供理解本發(fā)明內(nèi)容更為直觀明了的方式,而不是對本發(fā)明所述技術(shù)方案的限制。在不脫離本發(fā)明構(gòu)思的前提下,所有本領(lǐng)域普通技術(shù)人員沒有做出創(chuàng)造性勞動就能想到的其它實施方式,及其它對本發(fā)明技術(shù)方案的簡單替換和各種變化,都屬于本發(fā)明的保護(hù)范圍。
如圖1所示,基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用裝置,包括api模塊、遠(yuǎn)程調(diào)用模塊(tfcilentfactory);其中api模塊包括若干預(yù)設(shè)服務(wù)約定接口及若干thrift調(diào)用基礎(chǔ)類,一個預(yù)設(shè)服務(wù)約定接口對應(yīng)一種遠(yuǎn)程服務(wù),所述遠(yuǎn)程調(diào)用模塊(tfcilentfactory)包括若干java基礎(chǔ)工具類,所述java基礎(chǔ)工具類可讀取api模塊中包含的預(yù)設(shè)服務(wù)約定接口,并結(jié)合api包中的thrift編譯器生成的基礎(chǔ)類,生成一個代理對象,并擴(kuò)展java基礎(chǔ)類工具中的spring將生成的代理對象注入到spring所管理的context中,供調(diào)用者通過spring注解機(jī)制獲取代理對象,通過代理對象以thrift協(xié)議觸發(fā)對遠(yuǎn)程服務(wù)的調(diào)用。
所述api模塊中各預(yù)設(shè)服務(wù)約定接口通過url和tprotocol兩個變量與一種特定遠(yuǎn)程服務(wù)對應(yīng),url用于定義該特定遠(yuǎn)程服務(wù)的地址,tprotocol用于定義該特定遠(yuǎn)程服務(wù)所以使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式,所述遠(yuǎn)程調(diào)用模塊(tfcilentfactory)中的java基礎(chǔ)類工具可利用java反射機(jī)制讀取任何api包中約定格式的接口,并提取出該接口對應(yīng)的服務(wù)的url和網(wǎng)絡(luò)傳輸格式tprotocol,結(jié)合api包中thrift編譯器生成的基礎(chǔ)代碼,利用java的動態(tài)代理技術(shù),根據(jù)約定接口動態(tài)生成一個代理對象。根據(jù)項目涉及及目標(biāo)調(diào)用環(huán)境編程語言需求,相關(guān)變量或參數(shù)的數(shù)量可以根據(jù)實際需要進(jìn)行調(diào)整。擴(kuò)展spring的beanfactorypostprocessor后置處理器,該處理器中設(shè)有自定義處理邏輯,用以將代理對象注入到spring所管理的context中,供調(diào)用者通過spring注解機(jī)制獲取代理對象,通過代理對象以thrift協(xié)議觸發(fā)對遠(yuǎn)程服務(wù)的調(diào)用。
還包括服務(wù)端模塊,所述包括基于thrift協(xié)議的若干預(yù)設(shè)服務(wù),所述服務(wù)端模塊可根據(jù)調(diào)用請求對應(yīng)的代理對象,向調(diào)用者反饋對應(yīng)的預(yù)設(shè)服務(wù),并記錄執(zhí)行數(shù)據(jù),所述執(zhí)行數(shù)據(jù)包括輸入流、輸出流、基于thrift協(xié)議的預(yù)設(shè)服務(wù)、調(diào)用成功情況、響應(yīng)時間中的一種或多種。
為進(jìn)一步說明本發(fā)明所述基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)的工作流程和實現(xiàn)方式,以下以java環(huán)境為例,對基于thrift協(xié)議的遠(yuǎn)程過程調(diào)用系統(tǒng)調(diào)用流程進(jìn)行說明:
如圖2所示:
1、假設(shè)有一個已經(jīng)存在的thrift中間描述文件-userservice.thrift,并在其中定義了一些服務(wù),如userservice;
2、定義一個注解@stfservice,里面定義url和tprotocol兩個變量,url用于定義一個服務(wù)的遠(yuǎn)程地址,tprotocol用于定義這個遠(yuǎn)程服務(wù)所以使用的thrift網(wǎng)絡(luò)數(shù)據(jù)傳輸格式;
3、產(chǎn)生的注解會存放于一個公共的基礎(chǔ)包中,我們稱為soeasy-thrift-commons;
4、約定在開發(fā)任何一個服務(wù)前,先定義一個接口并約定名稱以大寫‘i’打頭,后面接在中間描述文件中定義的服務(wù)名,并繼承對應(yīng)服務(wù)的iface接口,如iuserservice,并在接口上打上注解@stfservice定義好url和tprotocol,暫稱之為約定接口;
5、利用thrift編譯器和thrift-maven-plugin插件,約定接口與對應(yīng)的thrift中間描述文件所生成的thrift調(diào)用基礎(chǔ)類打成一個包,我們稱這個包為api包,命名依據(jù)具體服務(wù)場景而定;
6、創(chuàng)建一個新包,定義一些基礎(chǔ)工具類,這些工具類可以利用java反射原理讀取任何api包中約定格式的接口,并提取出該接口對應(yīng)的服務(wù)的url和網(wǎng)絡(luò)傳輸格式tprotocol,結(jié)合api包中thrift編譯器生成的基礎(chǔ)代碼,利用java的動態(tài)代理技術(shù),根據(jù)約定接口動態(tài)生成一個代理對象,業(yè)務(wù)開發(fā)者拿到動態(tài)代理對象就可以像使用任何本地對象一樣,我把這個工具類新包成為tfclientfactory;動態(tài)生成代理對象通過以下方式實現(xiàn):利用spring的beanfactorypostprocessor,添加邏輯使引入了api包和tfclientfactory包的工程可以在spring容器啟動后自動掃描所有該工程引入的約定接口,并利用tfclientfactory根據(jù)掃描到的約定接口生成對應(yīng)的代理對象,并將產(chǎn)生的代理對象存入springcontext,這樣在業(yè)務(wù)服務(wù)中,直接在約定接口上打@autowired注解就會自動注入代理對象,就像使用本地service一樣進(jìn)行遠(yuǎn)程調(diào)用;
7、在前述步驟的基礎(chǔ)上,在代理方法被執(zhí)行時利用hystrix進(jìn)行包裝,收集對應(yīng)服務(wù)對應(yīng)方法的執(zhí)行數(shù)據(jù),包括成功次數(shù),失敗次數(shù),失敗比例,調(diào)用時長等數(shù)據(jù),并以一定頻率(如:10s一次)將統(tǒng)計數(shù)據(jù)發(fā)往時序存儲數(shù)據(jù)庫influxdb,然后通過grafana實時將數(shù)據(jù)以圖表形式展示出來;
8、定義一個新的工具包,用于服務(wù)端處理。主要入口需提供三個參數(shù):輸入流、輸出流、thrift服務(wù)具體實現(xiàn)的實例,處理邏輯讀取api包中的通信格式tprotocol,并結(jié)合thrift編譯器生成的基礎(chǔ)類以及thrift服務(wù)具體實現(xiàn)實例將輸入流讀取為請求對象,并調(diào)用具體實現(xiàn)實例進(jìn)行處理,處理結(jié)果回寫入輸出流,完成一次調(diào)用。我們將這個新包稱為tfsfactory。
9、在前述步驟的基礎(chǔ)上,擴(kuò)展默認(rèn)的tprotocol,并實現(xiàn)一個自定義的tprocessor,在擴(kuò)展的tprotocol中再解析傳輸協(xié)議時增加詳細(xì)的日志監(jiān)控,包括服務(wù)端的調(diào)用性能,傳遞的參數(shù)等數(shù)據(jù)。
為進(jìn)一步說明本發(fā)明的技術(shù)方案,以定時調(diào)度系統(tǒng)對外提供的服務(wù)為例,本實施例采用http通訊協(xié)議,并基于nginx構(gòu)架,如圖3所示。
1、創(chuàng)建api包,添加中間描述文件quartzservice.thrift,定義tquartzservice,利用thrift編譯器變出thrift基礎(chǔ)代碼,創(chuàng)建接口iquartzservice繼承tquartzservice.iface,添加注解@stfservice(url="http://xxx.souyidai.com/quartz/xxx",tprotocol=tbinaryprotocol.class)定義好服務(wù)的地址以及網(wǎng)絡(luò)傳輸所采用的數(shù)據(jù)格式。
2、maven打包發(fā)布api
3、實現(xiàn)服務(wù)端邏輯,并使用tfsfactory在webcontroller中開啟thrift服務(wù)
4、調(diào)用方如果想調(diào)用quartz的服務(wù),僅需要引入quartz服務(wù)的api包以及公共的tfcfactory包,并在需要使用的地方直接@autowired即可,代碼量對比可以參考圖4,圖中上半部分為使用原生thrift方式呈現(xiàn)的代碼量,下半部分屬于使用本發(fā)明所述技術(shù)方案呈現(xiàn)的代碼量;
通過圖4可以看出,本發(fā)明所述技術(shù)方案完全屏蔽掉了thrift的代碼,使得業(yè)務(wù)代碼更為清晰簡潔,易用;
由于采用http協(xié)議,當(dāng)監(jiān)控到請求量很大的情況下,可以直接通過nginx代理服務(wù)器進(jìn)行流量調(diào)度;
調(diào)用統(tǒng)計數(shù)據(jù)直接在grafana中實時顯示。可以監(jiān)控調(diào)用量,服務(wù)的健康情況,以便隨時調(diào)整調(diào)度策略。