簡體   English   中英

重構舊版SOA系統以使用非阻塞異步微服務

[英]Refactor Legacy SOA system to use non-blocking async microservices

我剛剛開始嘗試了解RxJava,以便可以使用項目反應堆重構Legacy SOA系統來使用非阻塞異步微服務。

目前,我正在進行可行性研究,並考慮使用湯匙之類的東西來轉換遺留服務代碼(但是與此問題無關)

我想知道如何使用反應堆總線請求/回復語法來替換此同步服務代碼。 甚至我應該使用完全不同的反應堆構造。

這是一個傳統soa服務的示例,它是人為設計的,因此可能並不完美,但基本上每個服務都取決於最后一個的結果。

 public static Map<String, Object> createAccount(DispatchContext dctx, Map<String, Object> context) {
    LocalDispatcher dispatcher = dctx.getDispatcher();

    String accountPartyId = (String) context.get("partyId");

    Map<String, Object> input = UtilMisc.toMap("groupName", context.get("accountName"), "groupNameLocal", context.get("groupNameLocal"), "officeSiteName", context.get("officeSiteName"), "description", context.get("description"), "partyId", accountPartyId);

    Map<String, Object> serviceResults1 = dispatcher.runSync("createPartyGroup", input);

    Map<String, Object> serviceResults2 = dispatcher.runSync("createPartyRole", UtilMisc.toMap("partyId", (String) serviceResults1.get("partyId"), "roleTypeId", "ACCOUNT"));

    String dataSourceId = (String) context.get("dataSourceId");
    Map<String, Object> serviceResults3 = null;
    if (dataSourceId != null) {
        serviceResults3 = dispatcher.runSync("crmsfa.addAccountDataSource", UtilMisc.toMap("partyId", (String) serviceResults2.get("partyId"), "dataSourceId", dataSourceId));
    }

    String marketingCampaignId = (String) context.get("marketingCampaignId");
    Map<String, Object> serviceResults4 = null;
    if (marketingCampaignId != null) {
        serviceResults4 = dispatcher.runSync("crmsfa.addAccountMarketingCampaign", UtilMisc.toMap("partyId", (String) serviceResults3.get("partyId"), "marketingCampaignId", marketingCampaignId));

    }

    String initialTeamPartyId = (String) context.get("initialTeamPartyId");
    Map<String, Object> serviceResults5 = null;
    if (initialTeamPartyId != null) {
        serviceResults5 = dispatcher.runSync("crmsfa.assignTeamToAccount", UtilMisc.toMap("accountPartyId", (String) serviceResults4.get("partyId"), "teamPartyId", initialTeamPartyId, "userLogin", userLogin));
    }

    Map<String, Object> results = ServiceUtil.returnSuccess();
    results.put("groupId", (String) serviceResults1.get("groupId"));
    results.put("roleId", (String) serviceResults2.get("roleId"));
    results.put("dataSourceId", (String) serviceResults3.get("dataSourceId"));
    results.put("marketingCampaignId", (String) serviceResults4.get("marketingCampaignId"));
    results.put("teamPartyId", (String) serviceResults5.get("teamPartyId"));
    return results;
}

基本上,這是一個使用dispatcher.runSync調用其他服務的服務...我只是在尋找我的研究起點,以研究如何可能使用Reactor或另一個庫將這種類型的語法轉換為異步非阻塞代碼。

在這一點上,我正在用非常模糊的術語來考慮回調/某種Promise類型結構。

就像第一次撥打另一個服務是

Map<String, Object> serviceResults = dispatcher.runSync("createPartyGroup", input);

如果此方法返回一個包含serviceResults映射的Promise對象,則該方法的其余部分可以移入Promise onComplete塊中,結果將是構成該服務方法的一堆深嵌套的onComplete代碼塊。

Promise p = task {
    // createPartyGroup service call
}
p.onComplete { result ->

Promise p2 = task {
    // createPartyRole sevice call
}

p2.onComplete { result ->
//next service call
}   
}  
}

或查看類似以下內容的反應堆總線文檔,這些文檔在很多層面上都沒有意義,而我對反應堆的了解還不夠,所以我不知道為什么它沒有意義,或者我接下來要學什么才能理解它的原因沒有道理

bus.send("service.createPartyGroup", Event.wrap(input, "reply.service.createPartyGroup")); 
bus.receive($("reply.service.createPartyGroup"), ev -> {
Map<?> input2 = UtilMisc.toMap("partyId", (String) ev.get("partyId"), "roleTypeId", "ACCOUNT")
  bus.send("service.createPartyRole", Event.wrap(input2, "reply.service.createPartyRole")); 
}); 

我意識到這是開始研究反應式編程范例的一個相當奇怪的地方。 但是替換此同步服務代碼是我的最終目標,如果我至少了解語法,那么我可以從此倒退。

您只需要使用Observable,就可以在流中將一個發出的項目傳遞到流中。 檢查文檔https://github.com/ReactiveX/RxJava

這將是一個順序的流程

  Observable.just(methodThatCallFirstServiceAndReturnObservable(params))
            .flatMap(resul1 -> methodThatCallSecondAndReturnObservable(resul1))
            .flatMap(resul2 -> methodThatCallThirdAndReturnObservable(resul2))
            .subscribe(result3->"Last value emmited here:");

您可以並行運行三個服務調用,並使用Observable.zip或merge將所有值匯總在一起。 但我相信這里不是您所需要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM