2017-09-26 101 views
1

我有兩個微服務1)產品微服務2)簽出微服務都是彈簧引導項目。在Checkout Microservice中,我應該獲得所有我購買的產品,這意味着我的微服務應該STATEFUL知道以前發生了什麼。請提供關於如何通過Kafka/RabbitMQ實現與異常事件源一樣的狀態的示例。但請詳細建議架構,代碼和示例,以詳細瞭解如何在結帳服務​​中獲取產品詳細信息。如何在微服務中實現狀態

+0

不,他們不必有狀態。您是否嘗試瞭解這意味着什麼 - 有狀態和無狀態的服務? – cassandrad

+0

爲什麼你需要產品MS?爲什麼不按照會話管理用戶界面上的產品選擇,並且一旦用戶決定進行結賬,它將觸發結帳MS並將選定的產品列表發送給MS? –

+0

@Amir_Af,你能分享一個實際的例子嗎?你的意思是把所有的數據保存在用戶界面(Jsp,Angular ..但不是控制器 - Java後端)?如果這是真的,那麼如何相信這些數據是正確的。 ? –

回答

0

通過附加共享資源來製作有狀態的微服務。在你的情況下,你附加或使用一個數據庫,存儲客戶購買的所有產品。共享資源意味着數據庫應該可以訪問我的微服務的多個實例。如果一個微服務失敗並且您必須啓動另一個實例,那麼數據不會丟失。如果您想通過同時運行多個實例來擴展微服務,這也有幫助。

它可像Asyncronous與卡夫卡事件源/ RabbitMQ的

您可以使用事件的多個微服務之間同步。例如,Product microservice發佈Checkout microservice拾取的事件(ProductTitleChanged事件)以更新其狀態(命令發佈到UpdateProductTitle)。這是必要的,因爲微服務將一些數據從一個數據複製到另一個數據以實現更大的恢復能力(即,即使另一個數據庫處於關閉狀態,也可以運行)。

但請建議架構,代碼,比如詳細說明如何獲得產品細節Checkout服務

上有太多的層次太多的架構。我特別喜歡的是CQRSEvent sourcing。在這個架構中,一個微服務將事件持久存儲到事件存儲中。然後,其他微服務輪詢事件存儲並獲取新發布的事件。通過這種方式,Checkout微服務可以獲得所有與產品相關的事件(如ProductAddedToInventory,ProductChangedTitle,ProductChangedDescription等),並維護所有產品的本地列表,但僅包含與其相關的屬性。因此,當Checkout微服務需要顯示產品的標題時,它不會遠程調用Inventory microservice,而是查詢其本地數據庫;這增加了resilience以及速度。

0

首先,微服務是細粒度的服務,按照設計,它們應該是無狀態的。這有助於他們按照流程進行擴展,而不會造成任何狀態的開銷。 我的建議是:

  • 槓桿反應性微服務的方法來使用事件(在消息的形式)作爲產品&結帳服務之間的通信的裝置。例如,添加到購物車的物品會生成一個事件,Checkout服務可以通過監聽隊列來處理該事件。閱讀更多關於反應式微服務的信息:Reactive Microservices
  • 兩種產品&檢出服務應該有自己的數據庫來存儲數據,這是微服務保持數​​據存儲分離的另一個基本原則(儘管數據存儲在多個地方 - DRY原理這裏不適用)
  • 在通信方面,您可以使用服務之間的REST接口互相呼叫(藉助任何API網關或類似解決方案進行安全或任何調解)
  • 您還可以引入ShoppingCart服務,它可以擁有自己的數據存儲來存儲購物車對象。實質上,具有自己的數據存儲和共享狀態的所有服務應保持最小限度,並且只能使用服務之間的REST接口訪問。
  • 您可以使用如Couchbase,Redis的等等。通過Kbastani這裏

看樣實現共享會話的數據的緩存解決方案:Sample Microservices Code