2016-06-16 25 views
1

例如,一旦用戶到達我們工作流中的付款步驟,需要調用許多不同的服務(例如付款,電子郵件生成,內容生成)。前端是否應該或應該設計一個服務來處理這種類型的請求?如果是這樣,該服務應該如何設計,以便它可以處理複合請求,而不用特別硬編碼這些請求的組成部分?在微服務體系結構中,您如何處理必須進行次要數據處理和調用其他服務的複合請求?

回答

1

您正在尋找的東西沿線BPEL來抽象您的業務邏輯。除非您明確需要將此外部化,否則我強烈建議您不要。測試更加困難,並且增加了服務的複雜性。

這就是說,你可能想要將你的其他服務與外觀包裝起來,這樣你就可以與呼叫細節隔離了。這允許您的邏輯是可測試的,並允許這些服務實現獨立於應用程序的其餘部分進行更改。

1

這真的取決於你指的是什麼。

複合UI

在用戶界面中,你應該建立一個複合的UI。 (微)服務應該負責垂直層面,而不是水平層面。例如,業務層或數據層應該被金融,銷售等垂直行業所取代,在這些行業中,您可以構建更小的組件。這些組件在技術上負責從存儲到用戶界面的業務問題。我主要使用AngularJS這樣的框架,其中一部分UI需要一些數據,各種服務可以添加到數據中。例如亞馬遜推薦的書籍列表。您從映射到單個產品ID的url開始。您從ServiceA獲取書籍信息,ServiceB的價格,ServiceC的運輸成本,ServiceD的折扣等。還有一些推薦書籍的列表。該列表包含來自ServiceB的多個產品ID(例如),並且這些產品會再次向ServiceA發送多個請求以獲取圖書信息,如名稱&圖像網址。

現在發票可以是相同的,也可以是電子郵件。創建它就好像它是一個複合UI。

集成

當你想要檢索的數據能夠傳送到外部系統,例如,沒有用戶界面。它不屬於財務或銷售或任何其他。例如,創建一個新的邊界,如果您願意,則稱爲IT/Ops。例如,它的責任是與第三方整合。它擁有這個問題。

然後它可以定義幾個接口,如IProvideBookInformationIProvideBookPriceIProvideBookInformation可以有一個像BookInfo ProvideBook(Guid id)這樣的方法,其中BookInfo是DTO,它也屬於此IT/Ops服務。

然後SalesFinance負責實現這個接口。所以他們依賴於這個接口。然後以任何你喜歡的方式部署,例如在.NET世界中你可以使用NuGet。然後,在部署此IT/Ops服務時,您還可以部署來自實現這些接口的其他服務的組件。這就像Composite UI示例,其中一個網站部署了多個其他組件,爲用戶界面提供數據。但現在它是後端集成服務,而不是具有用戶界面的東西。 IT/Ops服務對實施沒有直接的依賴關係。但是當它需要實現服務時,它會加載它可以找到的所有組件,並搜索其所需接口的實現。一旦找到實現,它就會執行它並獲取數據。組件可能直接進入數據庫,這很簡單,我們都很喜歡簡單。但它也可能通過某些REST API或任何您最喜歡的方式請求數據。它以這種方式收集所有數據,通過它所擁有的接口,但是由其他服務提供的實現。一旦收集完所有數據後,它會向第三方發出呼叫,並執行任何應有的操作。

1

我認爲微服務必須使用隊列來與其他人進行通信。

前端可以生成調用,但後端必須保存一個操作發生後需要通知隊列的邏輯。

我認爲RabbitMq是這些類型的設計的一個很好的工具。例如:在結帳

  • 用戶通階段1
    • 發送 - 用戶標識,電子郵件到emailqueue_standby隊列
    • 發送 - 用戶ID,項emailcontent_standby隊列
    • 發送 - 用戶標識,paymentdata到paymentchecking隊列
  • 用戶在結帳時完成第2階段
    • 消耗味精從emailqueue_standby隊列 - >激活發送電子郵件
    • 消耗味精從paymentchecking Queue代碼 - >激活代碼檢查付款數據 - >發表回覆approve_payment_data - >值USER_ID,DEAL_ID
    • 消耗從approve_payment_data味精隊列 - >如果用戶支付被批准繼續,否則回到停止階段1

所以這個流程可以讓您一次更新多級無碼阻塞,也允許分配之間的負載後端服務器。