欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置及方法

文檔序號(hào):6430961閱讀:223來(lái)源:國(guó)知局
專利名稱:實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置及方法
技術(shù)領(lǐng)域
本申請(qǐng)涉及網(wǎng)絡(luò)環(huán)境中的系統(tǒng)測(cè)試技術(shù),尤其涉及一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置及方法。
背景技術(shù)
遠(yuǎn)程接口通常部署在遠(yuǎn)程服務(wù)器 里,用于提供各種類型的服務(wù),同時(shí)通過(guò)自身提供的遠(yuǎn)程調(diào)用方法以供其他服務(wù)器完成對(duì)這些服務(wù)的遠(yuǎn)程調(diào)用。在多系統(tǒng)共存的網(wǎng)絡(luò)環(huán)境中,系統(tǒng)與系統(tǒng)之間通常通過(guò)遠(yuǎn)程接口的方式進(jìn)行交互。另一方面,在一個(gè)系統(tǒng)正式上線應(yīng)用之前,開(kāi)發(fā)和測(cè)試人員通常需要針對(duì)該系統(tǒng)設(shè)置定期自動(dòng)化執(zhí)行系統(tǒng)部署、測(cè)試和集成的過(guò)程,以此來(lái)持續(xù)地檢測(cè)系統(tǒng)中存在的問(wèn)題,這一過(guò)程通常被稱為持續(xù)集成,其中理所當(dāng)然也包括對(duì)待測(cè)系統(tǒng)調(diào)用其所依賴的第三方系統(tǒng)提供的遠(yuǎn)程接口的過(guò)程的測(cè)試。然而,在長(zhǎng)期的持續(xù)集成過(guò)程中,難免會(huì)出現(xiàn)第三方系統(tǒng)不可用的情況,當(dāng)這種情況發(fā)生時(shí),為了繼續(xù)進(jìn)行正常的測(cè)試工作,便需要通過(guò)下述幾種方法來(lái)屏蔽第三方系統(tǒng)不可用所帶來(lái)的不利影響。其中一種方法通過(guò)人為修改調(diào)用端系統(tǒng)(即待測(cè)系統(tǒng))的遠(yuǎn)程接口調(diào)用邏輯來(lái)實(shí)現(xiàn),該方法意在臨時(shí)去除調(diào)用端對(duì)遠(yuǎn)程接口的依賴,而待遠(yuǎn)程接口可用后,再恢復(fù)原來(lái)的正常邏輯。然而,該方法只能臨時(shí)解決開(kāi)發(fā)過(guò)程中遠(yuǎn)程接口不可用的問(wèn)題,但其在持續(xù)集成的過(guò)程中并不合適,一方面是由于往返修改的時(shí)間成本比較高,另一方面還會(huì)存在因開(kāi)發(fā)人員忘記恢復(fù)原來(lái)的正常邏輯而將臨時(shí)邏輯帶入正式環(huán)境中而造成故障的隱患。另一種方法通過(guò)添加對(duì)調(diào)用端的攔截邏輯來(lái)實(shí)現(xiàn),該方法需要在調(diào)用端系統(tǒng)里添加對(duì)調(diào)用遠(yuǎn)程接口進(jìn)行攔截的模塊,以在設(shè)定的規(guī)則下攔截調(diào)用端對(duì)遠(yuǎn)程接口的調(diào)用,并返回該調(diào)用過(guò)程所需要的模擬值。然而,該方法需要對(duì)調(diào)用端系統(tǒng)進(jìn)行改造,會(huì)在其中引入與正常邏輯無(wú)關(guān)的模塊,從而對(duì)調(diào)用端系統(tǒng)造成了侵入;并且,該方法如果要實(shí)現(xiàn)返回遠(yuǎn)程接口的模擬值,就需要額外提供不同的攔截規(guī)則,從而造成模擬行為實(shí)現(xiàn)繁瑣、不夠便捷。

發(fā)明內(nèi)容
本申請(qǐng)的實(shí)施例旨在提供一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置及方法,以解決現(xiàn)有調(diào)用端系統(tǒng)依賴的遠(yuǎn)程接口不可用時(shí)所采取的手段中存在的上述問(wèn)題。為實(shí)現(xiàn)上述目的,本申請(qǐng)的實(shí)施例提供了一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,連接至對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的調(diào)用端系統(tǒng),其中所述調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該裝置包括代理單元,用于修改所述調(diào)用端系統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼;模擬單元,用于根據(jù)所述被調(diào)用系統(tǒng)的遠(yuǎn)程接口設(shè)置模擬遠(yuǎn)程接口 ;控制單元,用于在確認(rèn)所述遠(yuǎn)程接口不可用時(shí),控制所述代理單元修改所述相關(guān)字節(jié)碼,以使所述調(diào)用端系統(tǒng)由調(diào)用所述遠(yuǎn)程接口切換至調(diào)用所述模擬遠(yuǎn)程接口。
本申請(qǐng)的實(shí)施例還提供了一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,應(yīng)用于調(diào)用端系統(tǒng)對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的過(guò)程中,其中所述調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該方法包括以下步驟監(jiān)測(cè)所述遠(yuǎn)程接口的可用狀態(tài);在所述遠(yuǎn)程接口不可用時(shí)修改所述調(diào)用端系 統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼,以控制所述調(diào)用端系統(tǒng)由調(diào)用所述遠(yuǎn)程接口切換至調(diào)用模擬遠(yuǎn)程接口;其中,所述模擬遠(yuǎn)程接口用于對(duì)所述遠(yuǎn)程接口進(jìn)行模擬。由上述技術(shù)方案可知,本申請(qǐng)的實(shí)施例通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式修改調(diào)用端系統(tǒng),無(wú)需在原有系統(tǒng)里附加任何代碼,不會(huì)給系統(tǒng)在正式環(huán)境上線造成隱患。


圖I為本申請(qǐng)實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置實(shí)施例結(jié)構(gòu)圖;圖2為圖I所示實(shí)施例中模擬單元的模擬遠(yuǎn)程接口配置界面示意圖;圖3為本申請(qǐng)實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法實(shí)施例流程圖;圖4為圖3所示實(shí)施例中接口調(diào)用請(qǐng)求的動(dòng)態(tài)修改流程示意圖;圖5為圖3所示實(shí)施例中調(diào)用端系統(tǒng)的模擬遠(yuǎn)程接口調(diào)用流程示意圖。
具體實(shí)施例方式下面將詳細(xì)描述本申請(qǐng)的具體實(shí)施例。應(yīng)當(dāng)注意,這里描述的實(shí)施例只用于舉例說(shuō)明,并不用于限制本申請(qǐng)。圖I為本申請(qǐng)實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置實(shí)施例結(jié)構(gòu)圖,如圖所示,本實(shí)施例實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置10連接至對(duì)被調(diào)用系統(tǒng)30的遠(yuǎn)程接口進(jìn)行調(diào)用的調(diào)用端系統(tǒng)20,其中調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該裝置包括代理單元11、模擬單元12及控制單元13。其中,代理單元11用于修改調(diào)用端系統(tǒng)20所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼;模擬單元12用于根據(jù)被調(diào)用系統(tǒng)30的遠(yuǎn)程接口設(shè)置模擬遠(yuǎn)程接口 ;控制單元13用于在確認(rèn)遠(yuǎn)程接口不可用時(shí),控制代理單元11在調(diào)用端系統(tǒng)20上修改上述的相關(guān)字節(jié)碼,以使調(diào)用端系統(tǒng)20由調(diào)用遠(yuǎn)程接口切換至調(diào)用模擬遠(yuǎn)程接口。Java虛擬機(jī)(JVM, Java Virtual Machine)通過(guò)在實(shí)際的計(jì)算機(jī)上仿真模擬各種計(jì)算機(jī)功能,能夠屏蔽與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使得Java程序只需要生成在Java虛擬機(jī)上運(yùn)行的字節(jié)碼,就可以在多種平臺(tái)上不加修改地運(yùn)行。如上所述,圖I所示實(shí)施例的調(diào)用端系統(tǒng)20便運(yùn)行在這樣一個(gè)Java虛擬機(jī)中,在一個(gè)實(shí)施例中,代理單元11可以利用Java虛擬機(jī)工具接口(JVM TI, JVM Tool Interface)來(lái)實(shí)現(xiàn)。JVM工具接口通常是用于對(duì)JVM進(jìn)行監(jiān)控,通過(guò)JVM工具接口可以監(jiān)控JVM的運(yùn)行狀態(tài)以及控制運(yùn)行在JVM之上的Java應(yīng)用程序。具體而言,利用JVM工具接口實(shí)現(xiàn)的代理單元11能夠在預(yù)設(shè)的網(wǎng)絡(luò)端口上偵聽(tīng)JVM中的所有網(wǎng)絡(luò)請(qǐng)求,由此其得以在JVM所加載的Java字節(jié)碼中找到與遠(yuǎn)程接口調(diào)用請(qǐng)求相關(guān)的字節(jié)碼,進(jìn)而,代理單元11可以利用JVM工具接口中的JavaInstrumentation所提供的特性來(lái)動(dòng)態(tài)修改調(diào)用端系統(tǒng)中加載的Java字節(jié)碼。由上述可知,本申請(qǐng)實(shí)施例實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置在調(diào)用端系統(tǒng)20原本需要調(diào)用的遠(yuǎn)程接口不可用時(shí),是通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式來(lái)修改調(diào)用端系統(tǒng)20切換至調(diào)用模擬遠(yuǎn)程接口,而無(wú)需在調(diào)用端系統(tǒng)里附加任何代碼,從而不會(huì)給系統(tǒng)在正式環(huán)境上線時(shí)造成隱患;并且,在字節(jié)碼已經(jīng)加載運(yùn)行的情況下對(duì)其進(jìn)行修改的動(dòng)態(tài)方式,不會(huì)影響到系統(tǒng)的正常工作,相較于只能在系統(tǒng)未啟動(dòng)狀態(tài)下對(duì)待加載字節(jié)碼進(jìn)行的靜態(tài)修改方式,應(yīng)用起來(lái)顯然更加靈活。進(jìn)一步,在一個(gè)實(shí)施例中,上述的代理單元11包括指令接收子單元111及調(diào)用修改子單元112。其中,指令接收子單元111用于接收控制單元13發(fā)送的控制指令,以此決定
是否進(jìn)行后續(xù)字節(jié)碼的修改;調(diào)用修改子單元112則根據(jù)接收到的控制指令將上述相關(guān)字節(jié)碼中的調(diào)用對(duì)象由遠(yuǎn)程接口修改為模擬遠(yuǎn)程接口。在一個(gè)實(shí)施例中,調(diào)用修改子單元112是利用Java Instrumentation提供的特性來(lái)動(dòng)態(tài)更改調(diào)用端系統(tǒng)20所加載的Java字節(jié)碼。具體而言,指令接收子單元111在收到控制單元13傳來(lái)的指令后通知給調(diào)用修改子單元112,后者進(jìn)而找到調(diào)用端系統(tǒng)20所加載的Java字節(jié)碼中涉及接口調(diào)用對(duì)象的相關(guān)字節(jié)碼,并將接口調(diào)用對(duì)象由被調(diào)用系統(tǒng)30的遠(yuǎn)程接口替換為模擬單元12提供的模擬遠(yuǎn)程接口,從而實(shí)現(xiàn)調(diào)用端系統(tǒng)20的動(dòng)態(tài)修改。接續(xù),上述模擬單元12設(shè)置的模擬遠(yuǎn)程接口具體是根據(jù)被調(diào)用系統(tǒng)30的真實(shí)遠(yuǎn)程接口的實(shí)現(xiàn)邏輯對(duì)該真實(shí)遠(yuǎn)程接口進(jìn)行模擬。進(jìn)一步具體而言,被調(diào)用系統(tǒng)30的每個(gè)真實(shí)遠(yuǎn)程接口各自具有相應(yīng)的實(shí)現(xiàn)邏輯,這一實(shí)現(xiàn)邏輯可以理解為由可執(zhí)行的計(jì)算機(jī)程序代碼組成,當(dāng)被調(diào)用系統(tǒng)30從調(diào)用端系統(tǒng)20收到調(diào)用某個(gè)真實(shí)遠(yuǎn)程接口的請(qǐng)求且該真實(shí)遠(yuǎn)程接口為可用時(shí),與該真實(shí)遠(yuǎn)程接口對(duì)應(yīng)的實(shí)現(xiàn)邏輯會(huì)以調(diào)用請(qǐng)求中攜帶的特定信息作為輸入而被執(zhí)行并得到用來(lái)返回給調(diào)用端系統(tǒng)20的輸出結(jié)果;而上述模擬單元12設(shè)置的模擬遠(yuǎn)程接口為了對(duì)真實(shí)遠(yuǎn)程接口進(jìn)行模擬,其自身并不需要設(shè)置與真實(shí)遠(yuǎn)程接口完全一致的實(shí)現(xiàn)邏輯,而只需要模擬該真實(shí)遠(yuǎn)程接口的實(shí)現(xiàn)邏輯對(duì)調(diào)用端系統(tǒng)20的調(diào)用請(qǐng)求作出響應(yīng)并輸出模擬的輸出結(jié)果。對(duì)于調(diào)用端系統(tǒng)20而言,其向被調(diào)用系統(tǒng)30發(fā)出調(diào)用某個(gè)遠(yuǎn)程接口的調(diào)用請(qǐng)求,而后收到被調(diào)用系統(tǒng)30返回的輸出結(jié)果,這就成功完成了一次遠(yuǎn)程接口的調(diào)用,至于該返回的輸出結(jié)果是真實(shí)遠(yuǎn)程接口返回的真實(shí)值還是模擬遠(yuǎn)程接口返回的模擬值,作為測(cè)試對(duì)象的調(diào)用端系統(tǒng)20來(lái)說(shuō)則完全不必關(guān)心。在一個(gè)實(shí)施例中,上述模擬單元12包括模擬配置庫(kù)121及模擬執(zhí)行子單元122。其中,模擬配置庫(kù)121用于存儲(chǔ)調(diào)用端系統(tǒng)20所依賴的遠(yuǎn)程接口的相關(guān)配置;模擬執(zhí)行子單元122用于根據(jù)模擬配置庫(kù)121存儲(chǔ)的相關(guān)配置對(duì)遠(yuǎn)程接口進(jìn)行模擬,以設(shè)置對(duì)應(yīng)的模擬遠(yuǎn)程接口供調(diào)用端系統(tǒng)20調(diào)用并向調(diào)用端系統(tǒng)20返回模擬值。在一個(gè)實(shí)施例中,上述的相關(guān)配置具體包括接口服務(wù)名、接口方法名、模擬腳本及模擬標(biāo)識(shí),其各項(xiàng)配置的說(shuō)明及內(nèi)容示例如表I所示,其中,接口服務(wù)名用于識(shí)別要模擬的遠(yuǎn)程接口 ;接口方法名用于識(shí)別遠(yuǎn)程接口的實(shí)現(xiàn)方法;模擬腳本用于由模擬執(zhí)行子單元122執(zhí)行以完成實(shí)現(xiàn)方法并返回模擬值,在一個(gè)實(shí)施例中,模擬腳本為利用動(dòng)態(tài)語(yǔ)言Groovy實(shí)現(xiàn)的代碼;模擬標(biāo)識(shí)用于表示當(dāng)前是否需要對(duì)遠(yuǎn)程接口進(jìn)行模擬。表I配置項(xiàng)__配置項(xiàng)說(shuō)明__配置內(nèi)容示例_
接口服務(wù)名定義需模擬的遠(yuǎn)程接口的服務(wù)名,以此來(lái)com.taobao.uic.common.service.userinfo.__識(shí)別需要模擬的遠(yuǎn)程接口__UicReadService: I.O.O.daily_
接口方法名定義遠(yuǎn)程接口具體需模擬的方法名,以此getBaseUserByNick
__來(lái)識(shí)別需要模擬的遠(yuǎn)程接口的實(shí)現(xiàn)方法__
模擬腳本定義完成具 體實(shí)現(xiàn)方法的Groovy腳本,def result=new ResultDO()
用于由模擬執(zhí)行子單元來(lái)執(zhí)行以得到所result· setSuccess(true)
__需的模擬值__return result_
是否模擬用于標(biāo)識(shí)當(dāng)前是否需要對(duì)遠(yuǎn)程接口進(jìn)行I:模擬模擬,如果設(shè)置為不模擬,則仍然調(diào)用真O:不模擬_實(shí)的遠(yuǎn)程接口__在一個(gè)實(shí)施例中,模擬單元12可以提供一個(gè)配置界面,如此一來(lái),用戶便可以通過(guò)該配置界面將例如表I所示的各配置項(xiàng)輸入至模擬單元12的模擬配置庫(kù)121中進(jìn)行存儲(chǔ)。其中,模擬腳本如上所述是利用Groovy實(shí)現(xiàn),作為Java程序設(shè)計(jì)語(yǔ)言的一種擴(kuò)展,Groovy是一種面向?qū)ο蟮哪_本語(yǔ)言,其使得Java平臺(tái)上具備了腳本語(yǔ)言的動(dòng)態(tài)特性,而本實(shí)施例采用基于Groovy實(shí)現(xiàn)的模擬腳本,無(wú)需預(yù)先開(kāi)發(fā)和部署任何模擬代碼,只需按例如上述的配置表項(xiàng)進(jìn)行配置后便可立即生效,因此實(shí)現(xiàn)遠(yuǎn)程接口模擬邏輯的過(guò)程靈活敏捷且成本較低。進(jìn)一步,按表I中各項(xiàng)完成配置后的配置界面的一個(gè)示例如圖2所示,其中模擬腳本內(nèi)容的一個(gè)示例如下def result = new com. taobao. uic. common, domain. ResultDO ()//定義返回結(jié)果對(duì)象result. setSucess (true) // 設(shè)置返回結(jié)果對(duì)象的 Success 屬性為 Truedef u = new. com. taobao. uic. common, domain. BaseUserDO ()Η定義用戶信息對(duì)象,該對(duì)象是結(jié)果對(duì)象的一個(gè)子對(duì)象u. setUserld(20256964671) // 設(shè)置用戶對(duì)象 Id 屬性為 20256964671result. setModule (u) //將用戶對(duì)象關(guān)聯(lián)到結(jié)果對(duì)象上return result// 返回調(diào)用結(jié)果最后,針對(duì)控制單元13而言,其對(duì)遠(yuǎn)程接口是否可用的判斷可以按如下所述來(lái)加以實(shí)施。在一個(gè)實(shí)施例中,控制單元13可以通過(guò)在調(diào)用端系統(tǒng)的遠(yuǎn)程接口調(diào)用進(jìn)程之外單獨(dú)設(shè)置的一個(gè)網(wǎng)絡(luò)監(jiān)測(cè)進(jìn)程,來(lái)監(jiān)測(cè)遠(yuǎn)程接口的可用狀態(tài)。在另一個(gè)實(shí)施例中,控制單元13還可以通過(guò)在調(diào)用端系統(tǒng)上設(shè)置一個(gè)前述調(diào)用進(jìn)程的相關(guān)進(jìn)程,進(jìn)而利用該相關(guān)進(jìn)程偵聽(tīng)調(diào)用端系統(tǒng)對(duì)遠(yuǎn)程接口進(jìn)行調(diào)用的請(qǐng)求及其響應(yīng),來(lái)實(shí)現(xiàn)遠(yuǎn)程接口是否可用的判斷。需要說(shuō)明的是,由于如前文所述代理單元11能夠在預(yù)設(shè)的網(wǎng)絡(luò)端口上偵聽(tīng)JVM的網(wǎng)絡(luò)請(qǐng)求,因此,在一個(gè)實(shí)施例中,可以由代理單元11對(duì)調(diào)用端系統(tǒng)的遠(yuǎn)程接口調(diào)用請(qǐng)求及其相應(yīng)進(jìn)行偵聽(tīng),由此來(lái)完成遠(yuǎn)程接口是否可用的判斷,并進(jìn)而將判斷接口通知給控制單元13,作為后續(xù)下發(fā)控制指令的依據(jù)。綜上所述,本申請(qǐng)實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置實(shí)施例通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式修改調(diào)用端系統(tǒng),無(wú)需在原有系統(tǒng)里附加任何代碼,不會(huì)給系統(tǒng)在正式環(huán)境上線造成隱患。進(jìn)一步,當(dāng)被調(diào)用系統(tǒng)30的真實(shí)遠(yuǎn)程接口狀態(tài)變?yōu)榭捎脮r(shí),首先,如果需要永久恢復(fù)成調(diào)用真實(shí)遠(yuǎn)程接口,則只需要重啟調(diào)用端系統(tǒng)20即可實(shí)現(xiàn),這是因?yàn)檎{(diào)用端系統(tǒng)20每次重啟時(shí)都會(huì)重新加載原始的Java字節(jié)碼;其次,如果只是臨時(shí)恢復(fù)成調(diào)用真實(shí)遠(yuǎn)程接口,則不需要重啟調(diào)用端系統(tǒng)20,而只需修改模擬單元12的模擬配置庫(kù)121中的相關(guān)配置便可以實(shí)現(xiàn)恢復(fù),例如,在一個(gè)實(shí)施例中,可以是將模擬標(biāo)識(shí)由表示需要模擬的值(例如“I”)修改為表示不需要模擬的值(例如“0”),然后控制單元13會(huì)下發(fā)相關(guān)控制指令,再由代理單元11根據(jù)接收到的控制指令將之前經(jīng)過(guò)修改的相關(guān)字節(jié)碼中的調(diào)用對(duì)象由模擬遠(yuǎn)程接口改回真實(shí)遠(yuǎn)程接口,就可以使得調(diào)用端系統(tǒng)20停止調(diào)用模擬遠(yuǎn)程接口轉(zhuǎn)而恢復(fù)調(diào)用被調(diào)用系統(tǒng)30的真實(shí)遠(yuǎn)程接口。對(duì)應(yīng)于上述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置實(shí)施例,本申請(qǐng)還提出一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,其應(yīng)用于調(diào)用端系統(tǒng)(運(yùn)行在Java虛擬機(jī)中)對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的過(guò)程中,該方法的實(shí)施例如圖3所示,包括以下步驟S31、S34。S31、監(jiān)測(cè)遠(yuǎn)程接口的可用狀態(tài),判斷遠(yuǎn)程接口是否可用;在一個(gè)實(shí)施例中,本步驟可以通過(guò)在調(diào)用端系統(tǒng)的調(diào)用進(jìn)程之外單獨(dú)設(shè)置一個(gè)網(wǎng)絡(luò)監(jiān)測(cè)進(jìn)程專門用來(lái)監(jiān)測(cè)遠(yuǎn)程接口的可用狀態(tài)。在另一個(gè)實(shí)施例中,本步驟還可以通過(guò)在調(diào)用端系統(tǒng)上設(shè)置一個(gè)前述調(diào)用進(jìn)程的相關(guān)進(jìn)程,進(jìn)而利用該相關(guān)進(jìn)程對(duì)調(diào)用端系統(tǒng)的遠(yuǎn)程接口調(diào)用的請(qǐng)求及其響應(yīng)進(jìn)行偵聽(tīng),來(lái)實(shí)現(xiàn)遠(yuǎn)程接口是否可用的判斷。S34、在遠(yuǎn)程接口不可用時(shí)修改調(diào)用端系統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼,以控制調(diào)用端系統(tǒng)由調(diào)用遠(yuǎn)程接口切換至調(diào)用模擬遠(yuǎn)程接口。步驟S34中所述的模擬遠(yuǎn)程接口用于對(duì)遠(yuǎn)程接口進(jìn)行模擬,以向調(diào)用端系統(tǒng)返回模擬值,模擬遠(yuǎn)程接口可以如上文裝置實(shí)施例中所述的那樣根據(jù)被調(diào)用系統(tǒng)的真實(shí)遠(yuǎn)程接口的實(shí)現(xiàn)邏輯對(duì)該真實(shí)遠(yuǎn)程接口進(jìn)行模擬。具體而言,在一個(gè)實(shí)施例中,模擬遠(yuǎn)程接口是根據(jù)步驟S34之前的以下步驟S32、S33來(lái)提供。S32、存儲(chǔ)調(diào)用端系統(tǒng)所依賴的遠(yuǎn)程接口的相關(guān)配置;在一個(gè)實(shí)施例中,步驟S32所述的相關(guān)配置具體包括接口服務(wù)名、接口方法名、模擬腳本及模擬標(biāo)識(shí),其各項(xiàng)配置的說(shuō)明及內(nèi)容示例如上文中表I所示,其中,接口服務(wù)名用于識(shí)別要模擬的遠(yuǎn)程接口 ;接口方法名用于識(shí)別遠(yuǎn)程接口的實(shí)現(xiàn)方法;模擬腳本用來(lái)被執(zhí)行以完成上述實(shí)現(xiàn)方法并返回所需模擬值,在一個(gè)實(shí)施例中,模擬腳本是利用動(dòng)態(tài)語(yǔ)言Groovy實(shí)現(xiàn)的代碼;模擬標(biāo)識(shí)則用于表示當(dāng)前是否需要對(duì)遠(yuǎn)程接口進(jìn)行模擬。另外,對(duì)上述各項(xiàng)進(jìn)行配置可以通過(guò)圖2所示的配置界面來(lái)完成,具體內(nèi)容在上文裝置實(shí)施例中已有述及,此處不再贅述。S33、根據(jù)相關(guān)配置模擬遠(yuǎn)程接口,以設(shè)置對(duì)應(yīng)的模擬遠(yuǎn)程接口供調(diào)用端系統(tǒng)調(diào)用;實(shí)際上,在針對(duì)某個(gè)真實(shí)遠(yuǎn)程接口完成步驟S32的配置存儲(chǔ)后,本實(shí)施例的方法就提供了將要用來(lái)對(duì)該真實(shí)遠(yuǎn)程接口進(jìn)行模擬的模擬遠(yuǎn)程接口。這時(shí),一旦步驟S31中判斷得出真實(shí)遠(yuǎn)程接口不可用的結(jié)論,便可以經(jīng)由步驟S34修改相關(guān)字節(jié)碼將調(diào)用端系統(tǒng)由調(diào)用真實(shí)遠(yuǎn)程接口切換到調(diào)用通過(guò)步驟S32 S33所配置的模擬遠(yuǎn)程接口。同時(shí)還可以看出,步驟S32 S33可以如圖3所示置于步驟S31與步驟S34之間,但在其他實(shí)施例中步驟S32 S33也可以置于步驟S31之前。進(jìn)一步,在一個(gè)實(shí)施例中,步驟S34中所述的修改相關(guān)字節(jié)碼具體包括以下步驟S341、設(shè)置與調(diào)用端系統(tǒng)連接且利用Java虛擬機(jī)工具接口實(shí)現(xiàn)的代理單元;S342、控制代理單元利用Java Instrumentation將相關(guān)字節(jié)碼中的調(diào)用對(duì)象由遠(yuǎn)程接口修改為模擬遠(yuǎn)程接口。通常JVM工具接口是用于對(duì)JVM進(jìn)行監(jiān)控,通過(guò)JVM工具接口可以監(jiān)控JVM的運(yùn)行狀態(tài)以及控制運(yùn)行在JVM之上的Java應(yīng)用程序,從而,步驟S341中利用JVM工具接口實(shí)現(xiàn)的代理單元得以對(duì)運(yùn)行在JVM上的調(diào)用端系統(tǒng)所加載的Java字節(jié)碼進(jìn)行修改。在一個(gè)實(shí)施例的步驟S342中,利用JVM工具接口實(shí)現(xiàn)的代理單元能夠在預(yù)設(shè)的網(wǎng)絡(luò)端口上偵聽(tīng)JVM中的所有網(wǎng)絡(luò)請(qǐng)求,由此其得以在JVM所加載的Java字節(jié)碼找到與遠(yuǎn)程接口調(diào)用請(qǐng)求相關(guān)的字節(jié)碼,進(jìn)而,代理單元可以利用JVM工具接口中的Java Instrumentation所提供的特性來(lái)動(dòng)態(tài)更改前述所找到的Java字節(jié)碼。需要說(shuō)明的是,由于代理單元有偵聽(tīng)JVM網(wǎng)絡(luò)請(qǐng)求的能力,因此,在一個(gè)實(shí)施例中,前文步驟S31中所述通過(guò)偵聽(tīng)遠(yuǎn)程接口調(diào)用請(qǐng)求及其響應(yīng)來(lái)判斷遠(yuǎn)程接口是否可用的動(dòng)作,便可以由代理單元來(lái)執(zhí)行。由上述可知,本申請(qǐng)實(shí)施例實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法在調(diào)用端系統(tǒng)原本需要 調(diào)用的遠(yuǎn)程接口不可用時(shí),是通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式來(lái)修改調(diào)用端系統(tǒng)以切換至調(diào)用模擬遠(yuǎn)程接口,而無(wú)需在調(diào)用端系統(tǒng)里附加任何代碼,從而不會(huì)給系統(tǒng)在正式環(huán)境上線時(shí)造成隱患。進(jìn)一步,結(jié)合前文裝置實(shí)施例及上述方法實(shí)施例的說(shuō)明,本申請(qǐng)實(shí)現(xiàn)接口調(diào)用請(qǐng)求動(dòng)態(tài)修改的流程的一個(gè)示例可以參考圖4所示,包括以下步驟S401 S405。S401、控制單元向代理單元傳送指令;該傳送指令用于通知代理單元修改調(diào)用端系統(tǒng)的接口調(diào)用請(qǐng)求,以將接口調(diào)用對(duì)象由被調(diào)用系統(tǒng)的真實(shí)遠(yuǎn)程接口修改為模擬單元提供的模擬遠(yuǎn)程接口。S402、代理單元載入原相關(guān)字節(jié)碼;S403、調(diào)用端系統(tǒng)返回原相關(guān)字節(jié)碼;利用JVM工具接口實(shí)現(xiàn)的代理單元可以找到調(diào)用端系統(tǒng)已加載的Java字節(jié)碼中涉及接口調(diào)用對(duì)象的相關(guān)字節(jié)碼。S404、修改調(diào)用端系統(tǒng)所加載的原相關(guān)字節(jié)碼;S405、用新的相關(guān)字節(jié)碼替換原相關(guān)字節(jié)碼;在找到調(diào)用端系統(tǒng)所加載的原相關(guān)字節(jié)碼之后,代理單元進(jìn)一步可以利用Javainstrumentation提供的特性對(duì)該相關(guān)字節(jié)碼進(jìn)行修改,進(jìn)而用修改后的新字節(jié)碼替換原相關(guān)字節(jié)碼由調(diào)用端系統(tǒng)進(jìn)行加載,由此將調(diào)用端系統(tǒng)的接口調(diào)用對(duì)象由真實(shí)遠(yuǎn)程接口替換為模擬遠(yuǎn)程接口。接續(xù),結(jié)合前文裝置實(shí)施例及上述方法實(shí)施例的說(shuō)明,本申請(qǐng)調(diào)用端系統(tǒng)調(diào)用模擬遠(yuǎn)程接口的流程的一個(gè)示例可以參考圖5所示,包括以下步驟S501 S505。S501、調(diào)用端系統(tǒng)向模擬單元發(fā)起調(diào)用請(qǐng)求;在經(jīng)過(guò)前述調(diào)用請(qǐng)求的動(dòng)態(tài)修改后,調(diào)用端系統(tǒng)的接口調(diào)用對(duì)象由被調(diào)用系統(tǒng)的真實(shí)遠(yuǎn)程接口替換為模擬單元提供的模擬遠(yuǎn)程接口。S502、根據(jù)接口服務(wù)名和接口方法名載入相關(guān)配置;在一個(gè)實(shí)施例中,調(diào)用端系統(tǒng)的接口調(diào)用請(qǐng)求可以攜帶接口服務(wù)名和接口方法名,而模擬單元便可以根據(jù)該接口服務(wù)名和接口方法名在模擬配置庫(kù)存儲(chǔ)的配置中查找對(duì)應(yīng)的相關(guān)配置。S503、執(zhí)行模擬腳本;在模擬配置庫(kù)中載入對(duì)應(yīng)的相關(guān)配置后,進(jìn)一步由模擬執(zhí)行子單元執(zhí)行配置項(xiàng)中存儲(chǔ)的Groovy腳本。S504、返回模擬值;模擬執(zhí)行子單元執(zhí)行模擬腳本后,會(huì)得到預(yù)先設(shè)置的模擬值,由模擬單元反饋給調(diào)用端系統(tǒng)。調(diào)用端系統(tǒng)從發(fā)出接口調(diào)用請(qǐng)求到收到模擬值,即完成一次接口調(diào)用過(guò)程,從調(diào)用端系統(tǒng)的角度看, 該過(guò)程與調(diào)用真實(shí)遠(yuǎn)程接口并無(wú)區(qū)別,相應(yīng)也表示模擬單元成功完成一次遠(yuǎn)程接口的模擬。進(jìn)一步,本申請(qǐng)實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的過(guò)程是通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式修改調(diào)用端系統(tǒng),而沒(méi)有在原有系統(tǒng)里附加任何代碼,因此,后續(xù)當(dāng)被調(diào)用系統(tǒng)的真實(shí)遠(yuǎn)程接口狀態(tài)變?yōu)榭捎脮r(shí),只需要重啟調(diào)用端系統(tǒng)即可恢復(fù)為調(diào)用被調(diào)用系統(tǒng)的遠(yuǎn)程接口 ;并且,如果只是臨時(shí)恢復(fù),則不需要重啟調(diào)用端系統(tǒng),而只需修改模擬單元的模擬配置庫(kù)中的相關(guān)配置,例如將模擬標(biāo)識(shí)由表示需要模擬的值(例如“I”)修改為不需要模擬的值(例如“O”),便可以由代理單元控制調(diào)用端系統(tǒng)停止調(diào)用模擬遠(yuǎn)程接口轉(zhuǎn)而調(diào)用被調(diào)用系統(tǒng)的真實(shí)遠(yuǎn)程接口。在一個(gè)實(shí)施例中,上述本申請(qǐng)所提供實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置可以是計(jì)算機(jī)。該計(jì)算機(jī)可以包括處理器和存儲(chǔ)器,其中,處理器可以根據(jù)存儲(chǔ)器中存儲(chǔ)的指令或程序來(lái)執(zhí)行前述各個(gè)實(shí)施例中提供的方法中的步驟。雖然已參照幾個(gè)典型實(shí)施例描述了本申請(qǐng),但應(yīng)當(dāng)理解,所用的術(shù)語(yǔ)是說(shuō)明和示例性、而非限制性的術(shù)語(yǔ)。由于本申請(qǐng)能夠以多種形式具體實(shí)施而不脫離申請(qǐng)的精神或?qū)嵸|(zhì),所以應(yīng)當(dāng)理解,上述實(shí)施例不限于任何前述的細(xì)節(jié),而應(yīng)在隨附權(quán)利要求所限定的精神和范圍內(nèi)廣泛地解釋,因此落入權(quán)利要求或其等效范圍內(nèi)的全部變化和改型都應(yīng)為隨附權(quán)利要求所涵蓋。
權(quán)利要求
1.一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,連接至對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的調(diào)用端系統(tǒng),其中所述調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該裝置包括 代理單元,用于修改所述調(diào)用端系統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼; 模擬單元,用于根據(jù)所述被調(diào)用系統(tǒng)的遠(yuǎn)程接口設(shè)置模擬遠(yuǎn)程接口 ; 控制單元,用于在確認(rèn)所述遠(yuǎn)程接口不可用時(shí),控制所述代理單元修改所述相關(guān)字節(jié)碼,以使所述調(diào)用端系統(tǒng)由調(diào)用所述遠(yuǎn)程接口切換至調(diào)用所述模擬遠(yuǎn)程接口。
2.如權(quán)利要求I所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,其中,所述模擬單元包括模擬配置庫(kù)及模擬執(zhí)行子單元, 所述模擬配置庫(kù)用于存儲(chǔ)所述調(diào)用端系統(tǒng)所依賴的所述遠(yuǎn)程接口的相關(guān)配置; 所述模擬執(zhí)行子單元用于根據(jù)所述相關(guān)配置模擬所述遠(yuǎn)程接口,以設(shè)置對(duì)應(yīng)的模擬遠(yuǎn)程接口供所述調(diào)用端系統(tǒng)調(diào)用并向所述調(diào)用端系統(tǒng)返回模擬值。
3.如權(quán)利要求2所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,其中,所述相關(guān)配置包括接口服務(wù)名、接口方法名、模擬腳本及模擬標(biāo)識(shí); 所述接口服務(wù)名用于識(shí)別要模擬的遠(yuǎn)程接口; 所述接口方法名用于識(shí)別所述遠(yuǎn)程接口的實(shí)現(xiàn)方法; 所述模擬腳本用于由所述模擬執(zhí)行子單元執(zhí)行以完成所述實(shí)現(xiàn)方法并返回所述模擬值; 所述模擬標(biāo)識(shí)用于表示當(dāng)前是否需要對(duì)所述遠(yuǎn)程接口進(jìn)行模擬。
4.如權(quán)利要求3所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,其中,所述模擬腳本是利用Groovy實(shí)現(xiàn)的代碼。
5.如權(quán)利要求I所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,其中,所述代理單元包括指令接收子單元及調(diào)用修改子單元; 所述指令接收子單元用于接收所述控制單元發(fā)送的控制指令; 所述調(diào)用修改子單元根據(jù)接收到的所述控制指令將所述相關(guān)字節(jié)碼中的調(diào)用對(duì)象由所述遠(yuǎn)程接口修改為所述模擬遠(yuǎn)程接口。
6.如權(quán)利要求5所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,其中,所述代理單元是利用Java虛擬機(jī)工具接口實(shí)現(xiàn),且所述調(diào)用修改子單元是利用Java Instrumentation來(lái)修改所述相關(guān)字節(jié)碼。
7.一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,應(yīng)用于調(diào)用端系統(tǒng)對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的過(guò)程中,其中所述調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該方法包括以下步驟 監(jiān)測(cè)所述遠(yuǎn)程接口的可用狀態(tài); 在所述遠(yuǎn)程接口不可用時(shí)修改所述調(diào)用端系統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼,以控制所述調(diào)用端系統(tǒng)由調(diào)用所述遠(yuǎn)程接口切換至調(diào)用模擬遠(yuǎn)程接口;其中,所述模擬遠(yuǎn)程接口用于對(duì)所述遠(yuǎn)程接口進(jìn)行模擬。
8.如權(quán)利要求7所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,在修改所述相關(guān)字節(jié)碼之前還包括以下步驟 存儲(chǔ)所述調(diào)用端系統(tǒng)所依賴的所述遠(yuǎn)程接口的相關(guān)配置; 根據(jù)所述相關(guān)配置模擬所述遠(yuǎn)程接口,以設(shè)置對(duì)應(yīng)的模擬遠(yuǎn)程接口供所述調(diào)用端系統(tǒng)調(diào)用并向所述調(diào)用端系統(tǒng)返回模擬值。
9.如權(quán)利要求8所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,其中,所述相關(guān)配置包括接口服務(wù)名、接口方法名、模擬腳本及模擬標(biāo)識(shí); 所述接口服務(wù)名用于識(shí)別要模擬的遠(yuǎn)程接口; 所述接口方法名用于識(shí)別所述遠(yuǎn)程接口的實(shí)現(xiàn)方法; 所述模擬腳本用來(lái)被執(zhí)行以完成所述實(shí)現(xiàn)方法并返回所述模擬值; 所述模擬標(biāo)識(shí)用于表示當(dāng)前是否需要對(duì)所述遠(yuǎn)程接口進(jìn)行模擬。
10.如權(quán)利要求9所述實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法,其中,所述模擬腳本是利用Groovy實(shí)現(xiàn)的代碼;所述修改相關(guān)字節(jié)碼包括以下步驟 設(shè)置與所述調(diào)用端系統(tǒng)連接且利用Java虛擬機(jī)工具接口實(shí)現(xiàn)的代理單元; 控制所述代理單元利用Java Instrumentation將所述相關(guān)字節(jié)碼中的調(diào)用對(duì)象由所述遠(yuǎn)程接口修改為所述模擬遠(yuǎn)程接口。
全文摘要
本發(fā)明公開(kāi)一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的裝置,連接至對(duì)被調(diào)用系統(tǒng)的遠(yuǎn)程接口進(jìn)行調(diào)用的調(diào)用端系統(tǒng),其中所述調(diào)用端系統(tǒng)運(yùn)行在Java虛擬機(jī)中,該裝置包括代理單元,用于修改所述調(diào)用端系統(tǒng)所加載的Java字節(jié)碼中涉及接口調(diào)用請(qǐng)求的相關(guān)字節(jié)碼;模擬單元,用于根據(jù)所述被調(diào)用系統(tǒng)的遠(yuǎn)程接口設(shè)置模擬遠(yuǎn)程接口;控制單元,用于在確認(rèn)所述遠(yuǎn)程接口不可用時(shí),控制所述代理單元修改所述相關(guān)字節(jié)碼,以使所述調(diào)用端系統(tǒng)由調(diào)用所述遠(yuǎn)程接口切換至調(diào)用所述模擬遠(yuǎn)程接口。本發(fā)明還相應(yīng)公開(kāi)一種實(shí)現(xiàn)動(dòng)態(tài)模擬遠(yuǎn)程接口的方法。本發(fā)明的實(shí)施例通過(guò)動(dòng)態(tài)修改Java字節(jié)碼的方式修改調(diào)用端系統(tǒng),無(wú)需在原有系統(tǒng)里附加任何代碼,不會(huì)給系統(tǒng)在正式環(huán)境上線造成隱患。
文檔編號(hào)G06F9/46GK102955714SQ201110235989
公開(kāi)日2013年3月6日 申請(qǐng)日期2011年8月17日 優(yōu)先權(quán)日2011年8月17日
發(fā)明者袁志俊, 禹?yè)P(yáng)帆 申請(qǐng)人:阿里巴巴集團(tuán)控股有限公司
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
靖州| 阳谷县| 拉孜县| 顺平县| 灵台县| 长汀县| 榆林市| 信丰县| 马关县| 太康县| 南召县| 上栗县| 察雅县| 工布江达县| 京山县| 鄄城县| 盱眙县| 乐亭县| 黔西县| 新邵县| 永春县| 宜君县| 南郑县| 新巴尔虎右旗| 新邵县| 济源市| 晋江市| 西乡县| 永德县| 云南省| 连州市| 分宜县| 黄大仙区| 安顺市| 稻城县| 苏州市| 秀山| 磐安县| 罗源县| 衡阳县| 涟源市|