本發(fā)明涉及分布式系統(tǒng)技術(shù)領(lǐng)域,特別涉及基于微服務(wù)的協(xié)作處理方法、系統(tǒng)及服務(wù)器。
背景技術(shù):
微服務(wù)是一個(gè)新興的軟件架構(gòu),把一個(gè)大型的單個(gè)應(yīng)用程序和服務(wù)拆分為數(shù)十個(gè)的支持微服務(wù),一個(gè)微服務(wù)的策略可以讓工作變得更為簡(jiǎn)便,它可擴(kuò)展單個(gè)組件而不是整個(gè)的應(yīng)用程序堆棧,從而滿足服務(wù)等級(jí)協(xié)議。
然而,各個(gè)服務(wù)之間的協(xié)作會(huì)因?yàn)楦鞣N原因而變的不同步,比如A服務(wù)請(qǐng)求B服務(wù)完成一個(gè)任務(wù),并且這個(gè)服務(wù)的操作不具備冪等性。那么如果在請(qǐng)求后出現(xiàn)錯(cuò)誤,A服務(wù)就不清楚服務(wù)是否完成,由于B服務(wù)功能不具備冪等性,所以A服務(wù)不能向B服務(wù)重新發(fā)請(qǐng)操作。比如,B服務(wù)是一個(gè)扣費(fèi)操作,如果先前的操作是成功的,但只是在返回給A服務(wù)時(shí)出現(xiàn)了估障導(dǎo)致A服務(wù)沒有收到成功消息,如果A服務(wù)再次向B服務(wù)發(fā)出同樣請(qǐng)求那么就會(huì)出現(xiàn)多扣費(fèi)的現(xiàn)情況。因此微服務(wù)中的非冪等與冪等操作還存在協(xié)作問題亟需解決。
因而現(xiàn)有技術(shù)還有待改進(jìn)和提高。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述現(xiàn)有技術(shù)的不足之處,本發(fā)明的目的在于提供基于微服務(wù)的協(xié)作處理方法、系統(tǒng)及服務(wù)器,通過查詢的方式將處理失敗的微服務(wù)交給查詢接口處理,并將功能操作與數(shù)據(jù)返回進(jìn)行拆分,存在非冪等操作時(shí)可避免由于重復(fù)操作導(dǎo)致的數(shù)據(jù)不一致,在冪等操作中則可減少服務(wù)請(qǐng)求次數(shù),減輕負(fù)載壓力。
為了達(dá)到上述目的,本發(fā)明采取了以下技術(shù)方案:
一種基于微服務(wù)的協(xié)作處理方法,其包括如下步驟:
A、服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;
B、所述服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù);
C、查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù),若是,則執(zhí)行步驟D;若否,則執(zhí)行步驟E;
D、向處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;
E、整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟A之前還包括步驟:
A01、服務(wù)接口進(jìn)行數(shù)據(jù)預(yù)處理,并獲取一預(yù)設(shè)標(biāo)識(shí)符作為密鑰,將所述密鑰、每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果一并存入數(shù)據(jù)庫(kù)中。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟A01之后、步驟A之前還包括步驟:
A02、將所有微服務(wù)的初始請(qǐng)求狀態(tài)數(shù)據(jù)設(shè)置為處理中,初始處理結(jié)果設(shè)置為空,并存入數(shù)據(jù)庫(kù)中;
A03、判斷存入數(shù)據(jù)庫(kù)時(shí)是否出錯(cuò),若是,則直接返回處理錯(cuò)誤至請(qǐng)求端;若否,則繼續(xù)執(zhí)行步驟A。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟A具體包括:
所述服務(wù)接口選擇后臺(tái)微服務(wù)中的一個(gè)微服務(wù),向其工作接口發(fā)起請(qǐng)求,并將所述密鑰一并發(fā)送至該微服務(wù)。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟B包括步驟:
B1、所述服務(wù)接口接收該被選擇的微服務(wù)的處理結(jié)果;
B2、所述服務(wù)接口根據(jù)接收的處理結(jié)果更新該被選擇的微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并返回步驟A,繼續(xù)向下一個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有微服務(wù)都執(zhí)行完畢。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟C包括步驟:
C1、通過所述密鑰請(qǐng)求調(diào)用所述服務(wù)接口的查詢接口;
C2、所述查詢接口查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理失敗的微服務(wù);
C3、若存在處理狀態(tài)為失敗的微服務(wù),根據(jù)所述密鑰查詢所有處理狀態(tài)為失敗的微服務(wù),并執(zhí)行步驟D;若不存在處理狀態(tài)為失敗的微服務(wù),則執(zhí)行步驟E。
所述的基于微服務(wù)的協(xié)作處理方法中,所述步驟D包括步驟:
D1、向其中一個(gè)處理狀態(tài)為失敗的微服務(wù)的工作接口重新發(fā)起請(qǐng)求;
D2、所述服務(wù)接口接收該處理狀態(tài)為失敗的微服務(wù)返回的處理結(jié)果;
D3、返回步驟D1,繼續(xù)向下一個(gè)處理狀態(tài)為失敗的微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有處理狀態(tài)為失敗的微服務(wù)都執(zhí)行完畢。
一種基于微服務(wù)的協(xié)作處理系統(tǒng),其包括:
第一請(qǐng)求發(fā)起模塊,用于控制服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;
第一接收更新模塊,用于控制服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù);
查詢模塊,用于查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù);
第二請(qǐng)求發(fā)起模塊,用于當(dāng)存在處理狀態(tài)為失敗的微服務(wù)時(shí),向各個(gè)處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,以及控制所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;
數(shù)據(jù)返回模塊,用于整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端。
所述的基于微服務(wù)的協(xié)作處理系統(tǒng)中,還包括:
預(yù)處理模塊,用于控制服務(wù)接口進(jìn)行數(shù)據(jù)預(yù)處理,并獲取一預(yù)設(shè)標(biāo)識(shí)符作為密鑰,將所述密鑰、每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果一并存入數(shù)據(jù)庫(kù)中;
初始化模塊,用于將所有微服務(wù)的初始請(qǐng)求狀態(tài)數(shù)據(jù)設(shè)置為處理中,初始處理結(jié)果設(shè)置為空,并存入數(shù)據(jù)庫(kù)中;
判斷模塊,用于判斷存入數(shù)據(jù)庫(kù)時(shí)是否出錯(cuò),若是,則直接返回處理錯(cuò)誤至請(qǐng)求端,若否則控制服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求。
一種服務(wù)器,其包括如上所述的基于微服務(wù)的協(xié)作處理系統(tǒng)。
相較于現(xiàn)有技術(shù),本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法、系統(tǒng)及服務(wù)器中,所述基于微服務(wù)的協(xié)作處理方法通過服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;之后所述服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù),若是,則向處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;之后整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端,通過查詢的方式將處理失敗的微服務(wù)交給查詢接口處理,并將功能操作與數(shù)據(jù)返回進(jìn)行拆分,存在非冪等操作時(shí)可避免由于重復(fù)操作導(dǎo)致的數(shù)據(jù)不一致,在冪等操作中則可減少服務(wù)請(qǐng)求次數(shù),減輕負(fù)載壓力。
附圖說明
圖1 為本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法的流程圖。
圖2 為本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法中步驟S101、S102、S103的流程圖。
圖3 為本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法中步驟S20的流程圖。
圖4 為本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法中步驟S30的流程圖。
圖5 為本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法中步驟S40的流程圖。
圖6為本發(fā)明提供的基于微服務(wù)的協(xié)作處理系統(tǒng)的結(jié)構(gòu)框圖。
圖7為本發(fā)明提供的基于微服務(wù)的協(xié)作處理中第一接收更新模塊的結(jié)構(gòu)框圖。
圖8為本發(fā)明提供的基于微服務(wù)的協(xié)作處理中查詢模塊的結(jié)構(gòu)框圖。
圖9為本發(fā)明提供的基于微服務(wù)的協(xié)作處理中第二請(qǐng)求發(fā)起模塊的結(jié)構(gòu)框圖。
具體實(shí)施方式
鑒于現(xiàn)有技術(shù)中多個(gè)服務(wù)之間非冪等操作與冪等操作間無法協(xié)作等缺點(diǎn),本發(fā)明的目的在于提供基于微服務(wù)的協(xié)作處理方法、系統(tǒng)及服務(wù)器,通過查詢的方式將處理失敗的微服務(wù)交給查詢接口處理,并將功能操作與數(shù)據(jù)返回進(jìn)行拆分,存在非冪等操作時(shí)可避免由于重復(fù)操作導(dǎo)致的數(shù)據(jù)不一致,在冪等操作中則可減少服務(wù)請(qǐng)求次數(shù),減輕負(fù)載壓力。
為使本發(fā)明的目的、技術(shù)方案及效果更加清楚、明確,以下參照附圖并舉實(shí)施例對(duì)本發(fā)明進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
請(qǐng)參閱圖1,本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法包括如下步驟:
S10、服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;
S20、所述服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù);
S30、查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù),若是,則執(zhí)行步驟S40;若否,則執(zhí)行步驟S50;
S40、向處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;
S50、整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端。
在微服務(wù)概念提出之后,通常將單個(gè)應(yīng)用程序拆分成多個(gè)微服務(wù),進(jìn)行獨(dú)立橫線擴(kuò)展,使得工作更加簡(jiǎn)便,當(dāng)一個(gè)操作涉及到多個(gè)后臺(tái)微服務(wù)是,本發(fā)明通過服務(wù)接口向多個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,其中所述工作接口為提供服務(wù)的接口,例如扣費(fèi)接口、訂單接口、顯示接口等等,多個(gè)微服務(wù)在接收到請(qǐng)求后處理各自的請(qǐng)求工作并將相應(yīng)的處理結(jié)果返回至服務(wù)接口,即每個(gè)微服務(wù)根據(jù)各自的請(qǐng)求內(nèi)容進(jìn)行處理,例如第一微服務(wù)接收的請(qǐng)求內(nèi)容為生成訂單、第二微服務(wù)接收的請(qǐng)求內(nèi)容為進(jìn)行支付扣費(fèi)、第三微服務(wù)接收的請(qǐng)求內(nèi)容為顯示支付結(jié)果等等,并將相應(yīng)的處理結(jié)果返回至服務(wù)接口,服務(wù)接口根據(jù)處理結(jié)果更新各個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),該請(qǐng)求狀態(tài)數(shù)據(jù)根據(jù)返回的處理結(jié)果可更新為成功success、失敗failed或者根據(jù)實(shí)際情況可或者其他請(qǐng)求狀態(tài)數(shù)據(jù)。
之后通過利用查詢接口查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),來判斷是否存在處理失敗的微服務(wù),若不存在,即所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)均為success,則直接整合所有微服務(wù)的處理結(jié)果(也可稱為請(qǐng)求結(jié)果數(shù)據(jù))返回至用戶請(qǐng)求端,例如當(dāng)?shù)谝晃⒎?wù)、第二微服務(wù)和第三微服務(wù)均處理成功時(shí),直接將訂單數(shù)據(jù)、扣費(fèi)數(shù)據(jù)以及支付結(jié)果顯示數(shù)據(jù)返回至用戶請(qǐng)求端,例如某購(gòu)物app等等,告知用戶此次操作已成功;而當(dāng)存在處理失敗的微服務(wù)時(shí),此時(shí)處理成功的微服務(wù)無需再次執(zhí)行,僅僅向所有處理狀態(tài)為失敗的微服務(wù)重新發(fā)送請(qǐng)求,處理失敗的微服務(wù)再次處理各自的請(qǐng)求工作并返回相應(yīng)的處理結(jié)果至服務(wù)接口,再整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端,例如當(dāng)?shù)谝晃⒎?wù)和第二微服務(wù)均處理成功,第三微服務(wù)處理失敗時(shí),則單獨(dú)向第三微服務(wù)再次發(fā)起請(qǐng)求,而不向第一微服務(wù)和第二微服務(wù)發(fā)起請(qǐng)求,以避免重復(fù)生成訂單和重復(fù)扣費(fèi),第三微服務(wù)再次執(zhí)行處理完畢后返回處理結(jié)果至服務(wù)接口,此時(shí)整合三個(gè)微服務(wù)兩次請(qǐng)求處理的結(jié)果數(shù)據(jù)返回至用戶請(qǐng)求端,即訂單數(shù)據(jù)、扣費(fèi)數(shù)據(jù)以及支付結(jié)果顯示失敗數(shù)據(jù),則用戶可得知此時(shí)已經(jīng)扣費(fèi)僅僅為支付結(jié)果顯示失敗,無需再次發(fā)起支付操作。通過查詢的方式獲取狀態(tài)數(shù)據(jù),將處理失敗的微服務(wù)交給查詢接口處理,在存在非冪等操作時(shí)可避免由于重復(fù)操作導(dǎo)致的數(shù)據(jù)不一致,加強(qiáng)了分布式系統(tǒng)的魯棒性,同時(shí)當(dāng)操作涉及的均為冪等操作的微服務(wù)時(shí),通過查詢也可在用戶不重發(fā)請(qǐng)求的情況下再次執(zhí)行處理失敗的微服務(wù),減少服務(wù)請(qǐng)求次數(shù),降低重復(fù)請(qǐng)求帶來的負(fù)載壓力。
進(jìn)一步地,請(qǐng)一并參閱圖2,所述步驟S10之前還包括步驟:
S101、服務(wù)接口進(jìn)行數(shù)據(jù)預(yù)處理,并獲取一預(yù)設(shè)標(biāo)識(shí)符作為密鑰,將所述密鑰、每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果一并存入數(shù)據(jù)庫(kù)中。
當(dāng)需進(jìn)行某項(xiàng)操作時(shí),從用戶請(qǐng)求端會(huì)傳輸數(shù)據(jù)至服務(wù)接口,或者根據(jù)傳輸數(shù)據(jù)讀取系統(tǒng)中的其他數(shù)據(jù),例如進(jìn)行支付操作時(shí),用戶請(qǐng)求端會(huì)傳輸支付數(shù)額、支付卡號(hào)等數(shù)據(jù)至服務(wù)接口,服務(wù)接口對(duì)這些數(shù)據(jù)進(jìn)行如清洗、過濾等預(yù)處理,準(zhǔn)備請(qǐng)求微服務(wù)工作接口所需要的前期工作。并且服務(wù)接口還獲取一預(yù)設(shè)標(biāo)識(shí)符作為密鑰,本實(shí)施例中,所述預(yù)設(shè)標(biāo)識(shí)符為保存在本地的全局唯一標(biāo)識(shí)符,其為一個(gè)128位整數(shù),此標(biāo)識(shí)符重復(fù)的可能性極小,用于分配具有唯一性的標(biāo)識(shí)符,結(jié)合所述全局唯一標(biāo)識(shí)符、每個(gè)微服務(wù)請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果存入數(shù)據(jù)庫(kù)中,作為核心數(shù)據(jù),當(dāng)然也可擴(kuò)展其他數(shù)據(jù)一同存入數(shù)據(jù)庫(kù)中。
更進(jìn)一步地,所述步驟S101之后、步驟S10之前還包括步驟:
S102、將所有微服務(wù)的初始請(qǐng)求狀態(tài)數(shù)據(jù)設(shè)置為處理中,初始處理結(jié)果設(shè)置為空,并存入數(shù)據(jù)庫(kù)中;
S103、判斷存入數(shù)據(jù)庫(kù)時(shí)是否出錯(cuò),若是,則直接返回處理錯(cuò)誤至請(qǐng)求端;若否,則繼續(xù)執(zhí)行步驟S10。
當(dāng)服務(wù)接口進(jìn)行了數(shù)據(jù)預(yù)處理并且獲取了全局唯一標(biāo)識(shí)符作為密鑰后,在將每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果一同存入數(shù)據(jù)庫(kù)中時(shí),此時(shí)還未發(fā)起請(qǐng)求,則需將所有微服務(wù)的初始請(qǐng)求狀態(tài)數(shù)據(jù)均設(shè)置為處理中processing,而將初始處理結(jié)果設(shè)置為空null,并存入數(shù)據(jù)庫(kù)中,此時(shí)若存入數(shù)據(jù)庫(kù)出錯(cuò),則直接返回處理錯(cuò)誤的信息至請(qǐng)求端,不進(jìn)行任何后續(xù)處理,若沒有出錯(cuò)則正常執(zhí)行后續(xù)的發(fā)起請(qǐng)求流程,這個(gè)請(qǐng)求開始之前的點(diǎn)稱為事務(wù)點(diǎn),由于有可能會(huì)發(fā)生處理數(shù)據(jù)丟失,因此在每個(gè)真實(shí)請(qǐng)求開始之前必需有事務(wù)點(diǎn)記錄,避免數(shù)據(jù)丟失導(dǎo)致的未知情況,后續(xù)的狀態(tài)數(shù)據(jù)檢測(cè)等都與事務(wù)點(diǎn)相關(guān)。
優(yōu)選地,所述步驟10具體包括:所述服務(wù)接口選擇后臺(tái)的微服務(wù)中的一個(gè)微服務(wù),向其工作接口發(fā)起請(qǐng)求,并將所述密鑰一并發(fā)送至該微服務(wù)。
同時(shí),請(qǐng)一并參閱圖3,所述步驟S20包括步驟:
S21、所述服務(wù)接口接收該被選擇的微服務(wù)的處理結(jié)果;
S22、所述服務(wù)接口根據(jù)接收的處理結(jié)果更新該被選擇的微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并返回步驟S10,繼續(xù)向下一個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有微服務(wù)都執(zhí)行完畢。
當(dāng)完成上述的請(qǐng)求工作接口所需前期工作,并將初始數(shù)據(jù)包括請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果存入數(shù)據(jù)庫(kù)后,服務(wù)接口向其中一個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,例如對(duì)第一微服務(wù)的訂單接口發(fā)起請(qǐng)求,請(qǐng)求生成訂單,此時(shí)一并將所述密鑰即全局唯一標(biāo)識(shí)符發(fā)送至第一微服務(wù),便于后續(xù)查詢工作,之后第一微服務(wù)處理生成訂單的請(qǐng)求工作,并在處理完成后將結(jié)果返回至服務(wù)接口,服務(wù)接口根據(jù)處理結(jié)果更新第一微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),即步驟S102中的初始請(qǐng)求狀態(tài)數(shù)據(jù),根據(jù)處理結(jié)果將初始值processing更新為success或者failed或者其他狀態(tài)數(shù)據(jù),用于表示事務(wù)點(diǎn)處理狀態(tài),之后返回步驟S11,即繼續(xù)向下一個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,例如繼續(xù)向第二微服務(wù)的扣費(fèi)接口發(fā)起請(qǐng)求,請(qǐng)求扣費(fèi)支付,第二微服務(wù)處理該請(qǐng)求工作并返回結(jié)果,服務(wù)接口同樣在接收到處理結(jié)果后更新第二微服務(wù)的狀態(tài)數(shù)據(jù),以此類推,重復(fù)上述請(qǐng)求、處理、返回結(jié)果、更新狀態(tài)數(shù)據(jù)過程,直到所有的微服務(wù)都執(zhí)行完畢,此時(shí)可得到所有微服務(wù)更新后的請(qǐng)求狀態(tài)數(shù)據(jù)和返回的處理結(jié)果。
在所有的微服務(wù)均執(zhí)行完畢后,采用查詢的方式查詢事務(wù)點(diǎn)狀態(tài),即每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),具體地,請(qǐng)參閱圖4,所述步驟S30包括步驟:
S31、通過所述密鑰請(qǐng)求調(diào)用所述服務(wù)接口的查詢接口;
S32、所述查詢接口查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理失敗的微服務(wù);
S33、若存在處理狀態(tài)為失敗的微服務(wù),根據(jù)所述密鑰查詢所有處理狀態(tài)為失敗的微服務(wù),并執(zhí)行步驟S40;若不存在處理狀態(tài)為失敗的微服務(wù),則執(zhí)行步驟S50。
當(dāng)所有的微服務(wù)都執(zhí)行完畢,并且所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)均已更新后,通過所述密鑰即全局唯一標(biāo)識(shí)符請(qǐng)求服務(wù)接口的查詢接口,查詢接口查詢各個(gè)事務(wù)點(diǎn),并讀取事務(wù)點(diǎn)狀態(tài),如上所述在向每個(gè)微服務(wù)請(qǐng)求發(fā)起之前均有事務(wù)點(diǎn)記錄,各個(gè)微服務(wù)在處理完成后會(huì)更新各自的請(qǐng)求狀態(tài)數(shù)據(jù),即各個(gè)事務(wù)點(diǎn)的狀態(tài),本發(fā)明通過在返回實(shí)際數(shù)據(jù)之前,先查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),判斷是否存在處理失敗的微服務(wù),將請(qǐng)求操作的狀態(tài)與實(shí)際數(shù)據(jù)返回進(jìn)行分割,避免由于處理錯(cuò)誤導(dǎo)致的數(shù)據(jù)改變。
當(dāng)不存在處理失敗的微服務(wù)時(shí),即所有事務(wù)點(diǎn)狀態(tài)均為success,則直接整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端;當(dāng)存在處理狀態(tài)為失敗的微服務(wù)時(shí),根據(jù)先前發(fā)送請(qǐng)求時(shí)一并發(fā)送的全局唯一標(biāo)識(shí)符查詢來所有的處理失敗的微服務(wù),并向所有處理失敗的微服務(wù)重新發(fā)送請(qǐng)求,例如通過查詢接口以所述密鑰查詢到第二微服務(wù)和第三微服務(wù)均處理失敗,即扣費(fèi)失敗同時(shí)支付結(jié)果顯示失敗,而第一微服務(wù)處理的生成訂單成功,此時(shí)向第二微服務(wù)和第三微服務(wù)重新發(fā)起請(qǐng)求,使第二微服務(wù)和第三微服務(wù)重新執(zhí)行一遍各自的請(qǐng)求工作并返回結(jié)果,最后整合兩次請(qǐng)求處理的結(jié)果數(shù)據(jù)返回至用戶請(qǐng)求端,無論第二微服務(wù)和第三微服務(wù)在二次請(qǐng)求時(shí)處理成功或失敗,第一微服務(wù)的訂單數(shù)據(jù)也只改變一次,不會(huì)因?yàn)榈诙⒎?wù)和第三微服務(wù)的重新執(zhí)行而改變第一微服務(wù)的返回?cái)?shù)據(jù),導(dǎo)致重復(fù)生成訂單,并且用戶也可通過最終返回的數(shù)據(jù)判斷具體是哪個(gè)微服務(wù)執(zhí)行出錯(cuò),例如扣費(fèi)錯(cuò)誤,此時(shí)用戶可再發(fā)起扣費(fèi)請(qǐng)求即可,無需再次生成重復(fù)訂單,提高處理效率。
類似地,在存在處理失敗的微服務(wù)需要對(duì)其重新發(fā)起請(qǐng)求時(shí),如圖5所示,所述步驟S40包括步驟:
S41、向其中一個(gè)處理狀態(tài)為失敗的微服務(wù)的工作接口重新發(fā)起請(qǐng)求;
S42、所述服務(wù)接口接收該處理狀態(tài)為失敗的微服務(wù)返回的處理結(jié)果;
S43、返回步驟S41,繼續(xù)向下一個(gè)處理狀態(tài)為失敗的微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有處理狀態(tài)為失敗的微服務(wù)都執(zhí)行完畢。
通過查詢接口查詢到所有請(qǐng)求處理失敗的微服務(wù),并向其中一個(gè)處理失敗的微服務(wù)重新發(fā)起請(qǐng)求,例如重新向第二微服務(wù)的工作接口即扣費(fèi)接口重新發(fā)起請(qǐng)求,第二微服務(wù)在二次接收到扣費(fèi)請(qǐng)求時(shí)再次執(zhí)行扣費(fèi)請(qǐng)求工作,由于前一次處理為失敗狀態(tài)因此二次執(zhí)行時(shí)扣費(fèi)的數(shù)據(jù)并沒有改變,不會(huì)由于重復(fù)操作導(dǎo)致該非冪等操作的數(shù)據(jù)不一致,第二微服務(wù)在處理完成后再次返回處理結(jié)果至服務(wù)接口,根據(jù)處理結(jié)果服務(wù)接口選擇保持或更新第二微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),之后繼續(xù)向下一個(gè)處理失敗的第三微服務(wù)的工作接口發(fā)起請(qǐng)求,重復(fù)上述過程,直到所有處理失敗的微服務(wù)均執(zhí)行完畢,得到二次請(qǐng)求后的所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)以及處理結(jié)果。通過單獨(dú)將失敗的微服務(wù)交給查詢接口處理,有效避免了由于微服務(wù)中存在非冪等操作,在重復(fù)操作時(shí)導(dǎo)致的數(shù)據(jù)錯(cuò)誤,解決了多個(gè)服務(wù)之間非冪等操作與冪等操作的協(xié)同處理,保證數(shù)據(jù)正確性。同時(shí)在冪等操作中則可減少服務(wù)請(qǐng)求次數(shù),減輕負(fù)載壓力。
根據(jù)如上所述的基于微服務(wù)的協(xié)作處理方法,本發(fā)明還相應(yīng)提供基于微服務(wù)的協(xié)作處理系統(tǒng),如圖6所示,所述基于微服務(wù)的協(xié)作處理系統(tǒng)包括第一請(qǐng)求發(fā)起模塊10、第一接收更新模塊20、查詢模塊30、第二請(qǐng)求發(fā)起模塊40、數(shù)據(jù)返回模塊50、預(yù)處理模塊60、初始化模塊70和判斷模塊80,所述第一請(qǐng)求發(fā)起模塊10、第一接收更新模塊20、查詢模塊30、第二請(qǐng)求發(fā)起模塊40、數(shù)據(jù)返回模塊50依次連接,所述查詢模塊40還連接數(shù)據(jù)返回模塊50,所述預(yù)處理模塊60、初始化模塊70和判斷模塊80依次連接,所述判斷模塊80還連接第一請(qǐng)求發(fā)起模塊10。
其中,所述第一請(qǐng)求發(fā)起模塊10用于控制服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;所述第一接收更新模塊20用于控制服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù);具體用于控制服務(wù)接口選擇后臺(tái)多個(gè)微服務(wù)中的其中一個(gè)微服務(wù),向其工作接口發(fā)起請(qǐng)求,并將所述密鑰一并發(fā)送至該微服務(wù);所述查詢模塊30用于查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù);所述第二請(qǐng)求發(fā)起模塊40用于當(dāng)存在處理狀態(tài)為失敗的微服務(wù)時(shí),向各個(gè)處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,以及控制所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;所述數(shù)據(jù)返回模塊50用于整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端;所述預(yù)處理模塊60用于控制服務(wù)接口進(jìn)行數(shù)據(jù)預(yù)處理,并獲取一預(yù)設(shè)標(biāo)識(shí)符作為密鑰,將所述密鑰、每個(gè)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù)和處理結(jié)果一并存入數(shù)據(jù)庫(kù)中;所述初始化模塊70用于將所有微服務(wù)的初始請(qǐng)求狀態(tài)數(shù)據(jù)設(shè)置為處理中,所述初始處理結(jié)果設(shè)置為空,并存入數(shù)據(jù)庫(kù)中;所述判斷模塊80用于判斷存入數(shù)據(jù)庫(kù)時(shí)是否出錯(cuò),若是,則直接返回處理錯(cuò)誤至請(qǐng)求端,若否則控制服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求。由于上述方法實(shí)施例中已詳細(xì)描述該部分具體實(shí)施例,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。
進(jìn)一步地,請(qǐng)一并參閱圖7,所述第一接收更新模塊20包括第一接收單元201和第一更新單元202,所述第一接收單元201連接第一更新單元202,所述第一接收單元201用于控制服務(wù)接口接收該被選擇的微服務(wù)的處理結(jié)果;所述第一更新單元202用于控制服務(wù)接口根據(jù)接收的處理結(jié)果更新該被選擇的微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并繼續(xù)向下一個(gè)微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有微服務(wù)都執(zhí)行完畢。由于上述方法實(shí)施例中已詳細(xì)描述該部分具體實(shí)施例,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。
進(jìn)一步地,請(qǐng)參閱圖8,所述查詢模塊30包括請(qǐng)求單元301、查詢判斷單元302和處理單元303,所述請(qǐng)求單元301、查詢判斷單元302和處理單元303依次連接,所述請(qǐng)求單元301用于通過所述密鑰請(qǐng)求調(diào)用所述服務(wù)接口的查詢接口;所述查詢判斷單元302用于控制查詢接口查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理失敗的微服務(wù);所述處理單元303用于若存在處理狀態(tài)為失敗的微服務(wù),根據(jù)所述密鑰查詢所有處理狀態(tài)為失敗的微服務(wù),并向處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求;若不存在處理狀態(tài)為失敗的微服務(wù),則整合所有微服務(wù)的處理結(jié)果返回至請(qǐng)求端。由于上述方法實(shí)施例中已詳細(xì)描述該部分具體實(shí)施例,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。
更進(jìn)一步地,請(qǐng)一并參閱圖9,所述第二請(qǐng)求發(fā)起模塊40包括發(fā)起單元401、第二接收單元402和第二更新單元403,所述發(fā)起單元401、第二接收單元402和第二更新單元403依次連接,所述發(fā)起單元401用于向其中一個(gè)處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求;所述第二接收單元402用于控制服務(wù)接口接收該處理狀態(tài)為失敗的微服務(wù)返回的處理結(jié)果;所述第二更新單元403用于控制服務(wù)接口接收到處理結(jié)果后更新該微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),繼續(xù)向下一個(gè)處理狀態(tài)為失敗的微服務(wù)的工作接口發(fā)起請(qǐng)求,直到所有處理狀態(tài)為失敗的微服務(wù)都執(zhí)行完畢。由于上述方法實(shí)施例中已詳細(xì)描述該部分具體實(shí)施例,具體請(qǐng)參閱上述方法對(duì)應(yīng)的實(shí)施例。
根據(jù)如上所述的基于微服務(wù)的協(xié)作處理系統(tǒng),本發(fā)明還相應(yīng)提供一種服務(wù)器,其包括如上所述的基于微服務(wù)的協(xié)作處理系統(tǒng),由于上文已對(duì)所述基于微服務(wù)的協(xié)作處理系統(tǒng)進(jìn)行了詳細(xì)描述,此處不作詳述。
綜上所述,本發(fā)明提供的基于微服務(wù)的協(xié)作處理方法、系統(tǒng)及服務(wù)器中,所述基于微服務(wù)的協(xié)作處理方法通過服務(wù)接口向后臺(tái)的微服務(wù)的工作接口發(fā)起請(qǐng)求;之后所述服務(wù)接口接收所述微服務(wù)的處理結(jié)果,并根據(jù)處理結(jié)果更新對(duì)應(yīng)微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),查詢所有微服務(wù)的請(qǐng)求狀態(tài)數(shù)據(jù),并判斷是否存在處理狀態(tài)為失敗的微服務(wù),若是,則向處理狀態(tài)為失敗的微服務(wù)重新發(fā)起請(qǐng)求,所述服務(wù)接口接收所有處理狀態(tài)為失敗的微服務(wù)的處理結(jié)果;之后整合所有微服務(wù)的處理結(jié)果返回至用戶請(qǐng)求端,通過查詢的方式將處理失敗的微服務(wù)交給查詢接口處理,并將功能操作與數(shù)據(jù)返回進(jìn)行拆分,存在非冪等操作時(shí)可避免由于重復(fù)操作導(dǎo)致的數(shù)據(jù)不一致,在冪等操作中則可減少服務(wù)請(qǐng)求次數(shù),減輕負(fù)載壓力。
可以理解的是,對(duì)本領(lǐng)域普通技術(shù)人員來說,可以根據(jù)本發(fā)明的技術(shù)方案及其發(fā)明構(gòu)思加以等同替換或改變,而所有這些改變或替換都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。