本發(fā)明涉及異構(gòu)環(huán)境技術(shù)領(lǐng)域,尤其涉及一種基于異構(gòu)環(huán)境的遠程通信打包方法及系統(tǒng)。
背景技術(shù):
目前,在實施soa服務(wù)體系過程中會涉及中間件的應(yīng)用。通常所述中間件通過采用dubbo、thrift、hsf等技術(shù)方案來實現(xiàn)框架服務(wù),其中,例如dubbo僅適用于同一環(huán)境下(即同一java環(huán)境)進行調(diào)用,又例如.net亦是如此情況。如果進行跨環(huán)境調(diào)用操作,則需要人工操作,且生成一大堆代碼文件,以供用戶調(diào)用。上述dubbo、thrift等在混合的語言環(huán)境中,會增加軟件開發(fā)過程中的人力與時間成本,而且導(dǎo)致軟件開發(fā)的復(fù)雜度增加。另外,也存在缺少相關(guān)的控制功能及后臺管理的問題。
因此,亟需提供一種基于異構(gòu)環(huán)境的遠程通信打包方法及系統(tǒng)。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于解決現(xiàn)有技術(shù)的不足,提供一種基于異構(gòu)環(huán)境的遠程通信打包方法及系統(tǒng),其適用于異構(gòu)多語言環(huán)境,通過自動化的打包平臺,在軟件開發(fā)過程中,不需要人工干預(yù),能夠自動為任意環(huán)境生成對應(yīng)的調(diào)用代理,開發(fā)人員通過代理便可進行遠程方法調(diào)用而無需關(guān)心具體環(huán)境,從而不僅實現(xiàn)屏蔽環(huán)境障礙,而且能夠降低軟件開發(fā)復(fù)雜度,以及節(jié)約軟件開發(fā)過程中的人力與時間成本。
為了解決上述問題,本發(fā)明的一方面,提供一種基于異構(gòu)環(huán)境的遠程通信打包方法,包括步驟:(a)設(shè)置在宿主中的服務(wù)探針搜索用于進行遠程通信的服務(wù)信息;(b)當(dāng)搜索到所述服務(wù)信息時,通過編碼方式將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù),并發(fā)送至打包平臺;(c)通過代碼生成器將所述服務(wù)元數(shù)據(jù)進行解析,以根據(jù)不同的目標環(huán)境生成相應(yīng)的代理代碼;(d)通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件。
本發(fā)明的另一方面,提供一種基于異構(gòu)環(huán)境的遠程通信打包系統(tǒng),其包括:服務(wù)信息搜索模塊,所述服務(wù)信息搜索模塊用于通過設(shè)置在宿主中的服務(wù)探針搜索用于進行遠程通信的服務(wù)信息;服務(wù)信息轉(zhuǎn)換模塊,所述服務(wù)信息轉(zhuǎn)換模塊與所述服務(wù)信息搜索模塊相連,所述服務(wù)信息轉(zhuǎn)換模塊用于當(dāng)搜索到所述服務(wù)信息時,通過編碼方式將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù);服務(wù)元數(shù)據(jù)發(fā)送模塊,所述服務(wù)元數(shù)據(jù)發(fā)送模塊用于將所述服務(wù)元數(shù)據(jù)發(fā)送至打包平臺;代理代碼生成模塊,所述代理代碼生成模塊與所述服務(wù)元數(shù)據(jù)發(fā)送模塊相連,所述代理代碼生成模塊用于通過代碼生成器將所述服務(wù)元數(shù)據(jù)進行解析,以根據(jù)不同的目標環(huán)境生成相應(yīng)的代理代碼;代理代碼編譯模塊,所述代理代碼編譯模塊與所述代理代碼生成模塊相連,所述代理代碼編譯模塊用于通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件。
本發(fā)明的優(yōu)點在于,通過本發(fā)明的基于異構(gòu)環(huán)境的遠程通信打包方法及系統(tǒng),其適用于異構(gòu)多語言環(huán)境,通過自動化的打包平臺,在軟件開發(fā)過程中,不需要人工干預(yù),能夠自動為任意環(huán)境生成對應(yīng)的調(diào)用代理,開發(fā)人員通過代理即可進行遠程方法調(diào)用而無需關(guān)心具體環(huán)境,從而不僅能夠達到屏蔽環(huán)境障礙效果,而且可以降低軟件開發(fā)復(fù)雜度,以及節(jié)約軟件開發(fā)過程中的人力與時間成本。另外,打包平臺具有語言級的控制能力,從而可以限制、開放某種特定類的使用和限制。
附圖說明
圖1是本發(fā)明一實施例中的基于異構(gòu)環(huán)境的遠程通信打包方法的步驟流程示意圖;
圖2是本發(fā)明一實施例中的基于異構(gòu)環(huán)境的遠程通信打包系統(tǒng)的架構(gòu)示意圖。
具體實施方式
下面結(jié)合附圖對本發(fā)明提供的基于異構(gòu)環(huán)境的遠程通信打包方法及系統(tǒng)的具體實施方式做詳細說明。
在現(xiàn)有soa服務(wù)體系過程中會涉及中間件的應(yīng)用,通常所述中間件通過采用dubbo技術(shù)方案來實現(xiàn)框架服務(wù),但是dubbo僅適用于同一環(huán)境下(即同一java環(huán)境)進行調(diào)用。如果進行跨環(huán)境調(diào)用操作,則需要人工進行大量的本地代理。再者,現(xiàn)有的系統(tǒng)開發(fā)完畢后,如果收到用戶的調(diào)用請求,則需要將其自身系統(tǒng)下的文件發(fā)送給用戶,但是這只能在單語言環(huán)境下使用,其原因是由于每一個語言使用環(huán)境不同。若需要實現(xiàn)跨平臺,則需要有中間物來表示,如果通過特定工具,則仍然需要人工手動操作以生成相關(guān)文件(例如,針對c#語言環(huán)境,手動生成.cs文件,針對java語言環(huán)境,手動生成.java文件),而且在該種情況下,缺少版本控制,如果遇到系統(tǒng)升級或業(yè)務(wù)變化,容易造成版本混亂。
另外,雖然wsdl(webservicesdescriptionlanguage,web服務(wù)描述語言)為一種web通用的服務(wù)中間語言,但是用戶無法解讀采用該格式的描述文本,因此需要單獨使用一套開發(fā)工具進行解析。而開發(fā)工具例如visualstudio等需要人工操作,并且會在本地生成一堆代碼文件,基于該代碼文件才能對目標服務(wù)進行調(diào)用。因此,采用wsdl方式并不能夠真正解決現(xiàn)有技術(shù)中所存在的問題。
于是,本發(fā)明提出一種基于異構(gòu)環(huán)境的遠程通信打包方法。
參見圖1所示,本發(fā)明一實施例中的基于異構(gòu)環(huán)境的遠程通信打包方法,包括以下步驟:(a)設(shè)置在不同語言服務(wù)器中的服務(wù)探針搜索用于進行遠程通信的服務(wù)信息;(b)當(dāng)搜索到所述服務(wù)信息時,通過編碼方式將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù),并發(fā)送至打包平臺;(c)通過代碼生成器將所述服務(wù)元數(shù)據(jù)進行解析,以根據(jù)不同的目標環(huán)境生成相應(yīng)的代理代碼;(d)通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件。
以下將具體說明每一步驟。
步驟s110:設(shè)置在宿主中的服務(wù)探針搜索用于進行遠程通信的服務(wù)信息。
此處,宿主是指所有受支持的語言開發(fā)的應(yīng)用程序,下文相同,不再贅述。
所述服務(wù)探針可以被稱作sdk(軟件開發(fā)包),其植入于所有受支持的語言(例如c#語言、java語言、php語言)開發(fā)的應(yīng)用程序中,并且所述服務(wù)探針跟隨所述應(yīng)用程序的啟動而啟動。每一個語言對應(yīng)于一相應(yīng)的服務(wù)探針。
在本實施例中,所述服務(wù)探針采用異步方式進行搜索操作。也就是說,在所述宿主(或者說,應(yīng)用程序)正常啟動過程中,當(dāng)所述用程序準備執(zhí)行其預(yù)先設(shè)定的操作之時(即代碼入口點),所述服務(wù)探針開始進行搜索。這樣,通過異步方式進行搜索,能夠避免當(dāng)探針發(fā)生意外時對宿主系統(tǒng)(即受支持的語言開發(fā)的應(yīng)用程序)產(chǎn)生影響,保證宿主系統(tǒng)正常的預(yù)設(shè)操作的執(zhí)行。所述服務(wù)信息是指所述應(yīng)用程序中的所有類(包括其屬性和方法)。
需注意的是,所述服務(wù)探針可以根據(jù)用戶設(shè)定條件和探針預(yù)設(shè)條件來搜索滿足條件(或規(guī)則)的服務(wù)信息。其中,所述用戶設(shè)定條件和探針預(yù)設(shè)條件可以包括但不限于:公共的,非私有的、非基本類型、方法或者類名符合包含某些字符串、指定路徑下的等。這樣,可以開放或限制某些特定類型的服務(wù)信息的使用。
步驟s120:當(dāng)搜索到所述服務(wù)信息時,通過編碼方式將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù),并發(fā)送至打包平臺。
在此步驟和上述步驟s110中,所述服務(wù)探針通過反射方式來搜索和解析所述服務(wù)信息,并且在步驟中,通過編碼方式(例如xml方式進行)將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù)。當(dāng)然,所述編碼方式包括但不限于xml格式,在其他部分實施例中也可以采用json格式或其他格式。另外,服務(wù)元數(shù)據(jù)可以被理解為一種用于對類信息(包括屬性或方法)進行定義的中間語言,其使用xml方式或其他格式編碼。中間語言不屬于任何語言,其可以通過xml或json方式來表示類的屬性及方法等信息。服務(wù)元數(shù)據(jù)包括但不限于一個或多個方法的輸入輸出信息。
另外,所述服務(wù)元數(shù)據(jù)以xml格式表示,并通過web接口發(fā)送至所述打包平臺。
步驟s140:通過代碼生成器將所述服務(wù)元數(shù)據(jù)進行解析,以根據(jù)不同的目標環(huán)境生成相應(yīng)的代理代碼。
在此步驟中,通過各種不同的代碼生成器對采用xml格式的服務(wù)元數(shù)據(jù)進行解析,從而能夠根據(jù)不同的目標環(huán)境(例如java環(huán)境、c#環(huán)境、net環(huán)境、php環(huán)境等)生成相應(yīng)的代理代碼(也可以稱為源代碼)。
所述代碼生成器可以采用諸如codedom或codemodel等技術(shù)方案實現(xiàn)服務(wù)元數(shù)據(jù)至不同環(huán)境下可執(zhí)行的源代碼的生成。
在步驟s120和步驟s140之間可以進一步包括:
步驟s130:所述打包平臺接收所述服務(wù)元數(shù)據(jù),并且判斷所述服務(wù)元數(shù)據(jù)的數(shù)據(jù)類型和方法定義是否滿足預(yù)設(shè)定的條件,若滿足預(yù)設(shè)定的條件,則執(zhí)行步驟s140。
步驟s141:若不滿足預(yù)設(shè)定的條件,則發(fā)送通知信息給用戶。
在本實施例中,所述打包平臺利用其webapi接口接收服務(wù)元數(shù)據(jù),并且通過采用xsd方式來對xml格式的服務(wù)元數(shù)據(jù)進行校驗,判斷所述服務(wù)元數(shù)據(jù)的數(shù)據(jù)類型和方法定義是否滿足預(yù)設(shè)定的條件,例如數(shù)據(jù)類型中不允許出現(xiàn)可空類型,方法定義的輸入與輸出不可以為抽象類型等等,其中xsd方式為一種針對xml格式的描述文檔,其預(yù)先定義規(guī)則框架,從而對接收到的服務(wù)元數(shù)據(jù)(包括數(shù)據(jù)類型和方法定義)進行判斷。如果滿足預(yù)設(shè)定條件,則繼續(xù)執(zhí)行后繼的步驟s140,否則,將不滿足預(yù)設(shè)定條件的特定數(shù)據(jù)類型或方法定義排除,同時通過郵件、短信等方式發(fā)送通知信息給用戶或管理人員。
步驟s150:通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件。
在此步驟中,代碼編譯器負責(zé)將所述代碼生成器生成的代理代碼進行編譯,并編譯為最終可使用的編譯文件,最終的編譯文件是根據(jù)環(huán)境不同而不同。(例如,在.net環(huán)境下,編譯為動態(tài)數(shù)據(jù)庫.dll文件,在java環(huán)境下,編譯為后綴為jar的文件)。
在本實施例中,代碼編譯模塊根據(jù)不同的目標環(huán)境,從而選擇相對應(yīng)的官方編譯器進行編譯,從而保證編譯結(jié)果正確,生成文件可用。
在步驟s150之后,進一步包括步驟:
步驟s160:將所產(chǎn)生的編譯文件打包以生成文件包,并且將所述文件包發(fā)送至一包管理器,以進行歸檔。
在此步驟中,本領(lǐng)域技術(shù)人員使用常規(guī)方法對編譯文件進行打包,以生成文件包,并且將所述文件包發(fā)送至一包管理器。
在此步驟中進一步包括步驟:對所述文件包設(shè)置相應(yīng)的版本信息。
在生成文件包后,配置一對應(yīng)的版本信息。也就是說,每一個文件包對應(yīng)一相應(yīng)的版本。在設(shè)置版本信息之后,將兩者(文件包和版本信息)一起發(fā)送至所述包管理器。其中,所述包管理器用于提供給用戶,以便于檢索所需要使用的文件包。
通過執(zhí)行該步驟,能夠有效解決現(xiàn)有技術(shù)中在使用特定工具來實現(xiàn)跨平臺的情況下且系統(tǒng)升級或業(yè)務(wù)更新變化時無法進行版本控制的問題,從而能夠?qū)ξ募M行高效地管理(包括版本控制及版本回滾),且無需人工操作。
在步驟s160之后,進一步可包括以下步驟:
a)所述包管理器接收一用戶的文件包請求,所述文件包請求包括文件包名稱和版本信息;
b)根據(jù)所述文件包名稱和版本信息在所述包管理器內(nèi)查找相應(yīng)的文件包,若查找到,則將所述文件包返回至所述用戶;
c)若查找不到,則發(fā)送通知信息給所述用戶。
當(dāng)請求者(例如為開發(fā)人員、管理人員等)需要使用某一特定文件包時,通過發(fā)送一請求至所述包管理器,該請求包括文件包名稱和版本信息。接著,所述包管理器根據(jù)所述文件包名稱和版本信息進行查找,當(dāng)查找到符合條件的文件包時,將該文件包返回至請求者。
通過上述步驟的實施,所述基于異構(gòu)環(huán)境的遠程通信打包能夠?qū)崿F(xiàn)支持多語言的接入(例如java語言系統(tǒng)、net語言系統(tǒng)、php語言系統(tǒng)及其他語言客戶端,在此不再列舉),而并非像現(xiàn)有技術(shù)僅支持單個語言系統(tǒng)。再者,所述方法的實施過程中無需人工操作,通過使用服務(wù)指針,其隨著宿主(是指所有受支持的語言開發(fā)的應(yīng)用程序)的啟動而啟動,并生成對應(yīng)不同語言環(huán)境的文件包(例如在java環(huán)境中,生成.jar文件包;在net環(huán)境中,生成.dll文件包),以供調(diào)用。借助其它包管理的產(chǎn)品(如nuget或者nexus),在打包完成并推送文件包至包管理之后,用戶不再需要針對每一語言體系進行手工操作(將中間語言轉(zhuǎn)換成本地代碼,再進一步編寫),只需通過包管理獲取到文件包,隨后即相當(dāng)于對基礎(chǔ)類庫的文件包進行直接調(diào)用即可,從而節(jié)省了大量時間并且提高工作效率。
另外,在本實施例中,在應(yīng)用程序的啟動之時實施所述方法。而在其他部分實施例中,在文件包發(fā)布之前通過執(zhí)行以下步驟(包括解析源碼;通過編譯方式轉(zhuǎn)換為xml格式的服務(wù)元數(shù)據(jù);通過代碼生成器進行解析并生成相應(yīng)的代理代碼;通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件)而達到上述相同的技術(shù)效果。
另外,本實施例中所述的方法能夠適用于異構(gòu)多語言環(huán)境,通過自動化的打包平臺,在軟件開發(fā)過程中,不需要人工干預(yù),能夠自動為任意環(huán)境生成對應(yīng)的調(diào)用代理,開發(fā)人員通過代理即可進行遠程方法調(diào)用而無需關(guān)心具體環(huán)境,從而不僅實現(xiàn)屏蔽環(huán)境障礙,而且能夠降低軟件開發(fā)復(fù)雜度,以及節(jié)約軟件開發(fā)過程中的人力與時間成本。
本發(fā)明還提供一種基于異構(gòu)環(huán)境的遠程通信打包系統(tǒng),其包括:一服務(wù)信息搜索模塊210、一服務(wù)信息轉(zhuǎn)換模塊220、一服務(wù)元數(shù)據(jù)發(fā)送模塊230、一代理代碼生成模塊250及一代理代碼編譯模塊260。
其中,所述搜索模塊用于通過設(shè)置在宿主(即指所有受支持的語言開發(fā)的應(yīng)用程序)中的服務(wù)探針搜索用于進行遠程通信的服務(wù)信息。需注意的是,在調(diào)用所述服務(wù)信息搜索模塊210中,所述服務(wù)探針隨所述應(yīng)用程序啟動而啟動,并且采用異步方式來執(zhí)行搜索操作。需注意的是,在調(diào)用所述服務(wù)信息搜索模塊210中,所述服務(wù)探針隨所述應(yīng)用程序啟動而啟動,并且通過異步方式來執(zhí)行搜索操作。
所述服務(wù)信息轉(zhuǎn)換模塊220與所述服務(wù)信息搜索模塊210相連,所述服務(wù)信息轉(zhuǎn)換模塊220用于當(dāng)搜索到所述服務(wù)信息時,通過編碼方式將所述服務(wù)信息轉(zhuǎn)換為服務(wù)元數(shù)據(jù)。在調(diào)用所述服務(wù)信息搜索模塊210以及所述服務(wù)信息轉(zhuǎn)換模塊220中,所述服務(wù)探針通過反射方式來搜索和解析所述服務(wù)信息。另外,所述服務(wù)元數(shù)據(jù)以xml格式表示,當(dāng)然也可以采用其他格式表示,例如json格式,這樣,使得轉(zhuǎn)換后的服務(wù)元數(shù)據(jù)符合數(shù)據(jù)編碼規(guī)范,加之采用反射方式能夠有助于用戶解讀例如為xml格式的服務(wù)元數(shù)據(jù),從而使得用戶能夠獲取相關(guān)的類信息(包括類屬性的類型、類方法的參數(shù)等)。
所述服務(wù)元數(shù)據(jù)發(fā)送模塊230用于將所述服務(wù)元數(shù)據(jù)發(fā)送至打包平臺。
所述代理代碼生成模塊250用于通過代碼生成器將所述服務(wù)元數(shù)據(jù)進行解析,以根據(jù)不同的目標環(huán)境生成相應(yīng)的代理代碼。通過各種不同的代碼生成器對采用xml格式的服務(wù)元數(shù)據(jù)進行解析,從而能夠根據(jù)不同的目標環(huán)境(例如java環(huán)境、c#環(huán)境、net環(huán)境、php環(huán)境等)生成相應(yīng)的代理代碼(也可以稱為源代碼)。
所述代理代碼編譯模塊260與所述代理代碼生成模塊250相連,所述代理代碼編譯模塊260用于通過代碼編譯器將所述代理代碼進行編譯,以產(chǎn)生相應(yīng)的編譯文件。所述代碼編譯器負責(zé)將所述代碼生成器生成的代理代碼進行編譯,并編譯為最終可使用的編譯文件,最終的編譯文件是根據(jù)環(huán)境不同而不同。(例如,在.net環(huán)境下,編譯為動態(tài)數(shù)據(jù)庫.dll文件,在java環(huán)境下,編譯為后綴為jar的文件)。
可選的,在本實施例中,所述系統(tǒng)進一步包括一合規(guī)性判斷模塊240,所述合規(guī)性判斷模塊240分別與所述服務(wù)元數(shù)據(jù)發(fā)送模塊230和所述代理代碼生成模塊250相連,所述合規(guī)性判斷模塊240用于通過所述打包平臺接收所述服務(wù)元數(shù)據(jù),并且判斷所述服務(wù)元數(shù)據(jù)的數(shù)據(jù)類型和方法定義是否滿足預(yù)設(shè)定的條件,若滿足預(yù)設(shè)定的條件,則調(diào)用所述代理代碼生成模塊250,否則調(diào)用通知信息發(fā)送模塊。所述通知信息發(fā)送模塊與所述合規(guī)性判斷模塊240相連,所述通知信息發(fā)送模塊用于當(dāng)不滿足預(yù)設(shè)定的條件時發(fā)送通知信息給用戶。
可選的,所述系統(tǒng)進一步包括:一編譯文件打包模塊270,所述編譯文件打包模塊270與所述代理代碼編譯模塊260相連,所述編譯文件打包模塊270用于將所產(chǎn)生的編譯文件進行打包以生成文件包,并且將所述文件包發(fā)送至一包管理器,以進行歸檔。
另外,在本實施例中,所述系統(tǒng)還可以包括:一文件包請求模塊(圖中未示)、一文件包查找模塊(圖中未示)和一文件包返回模塊(圖中未示)。其中,所述文件包請求模塊用于通過所述包管理器接收一用戶的文件包請求,所述文件包請求包括文件包名稱和版本信息。所述文件包查找模塊與所述文件包請求模塊相連,所述文件包查找模塊用于根據(jù)所述文件包名稱和版本信息在所述包管理器內(nèi)查找相應(yīng)的文件包。所述文件包模塊與所述文件包查找模塊相連,所述文件包模塊用于當(dāng)查找到相應(yīng)的文件包時,將所述文件包返回至所述用戶。
因此,通過調(diào)用上述模塊,能夠?qū)崿F(xiàn)在多語言環(huán)境中不需要人工干預(yù),自動為任意環(huán)境生成對應(yīng)的調(diào)用代理,從而使得開發(fā)人員通過代理即可進行遠程方法調(diào)用而無需關(guān)心具體環(huán)境。于是,不僅達到屏蔽環(huán)境障礙的效果,而且也降低軟件開發(fā)復(fù)雜度,以及節(jié)約軟件開發(fā)過程中的人力與時間成本。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應(yīng)視為本發(fā)明的保護范圍。