2017-01-13 99 views
3

我正在開發一個將單一的web應用程序轉換爲微服務的個人項目(每個服務都有自己的數據庫)。互通微服務 - 如何?

此時整體後端由NodeJS製成並能夠回覆REST請求。 當我開始將應用程序分成多個服務時,我遇到了下一個問題:如何使它們之間的通信很好?

首先我試圖用REST調用下一個例子: 「註冊服務」,以堅持它插入有趣的事情到它的數據庫,然後向前(HTTP POST)的用戶信息的「用戶服務」進入「用戶」數據庫。 從這個例子我們有2個服務,因此2個數據庫。

我意識到在這個時刻這不是一個好選擇。因爲我的「註冊服務」取決於「用戶服務」。它們有些耦合,這是微服務概念的反模式(從我讀到的內容來看)。

第二個想法是使用類似RabbitMQ的消息中介。 「註冊服務」仍將有趣的事情插入到自己的數據庫中,並將用戶信息作爲數據發佈在隊列中。 「用戶服務」使用此消息並將數據保存到其「用戶」數據庫中。通過使用這個概念,這兩種服務都是完全孤立的,並且可能是一個好主意。

但是,如何將響應發送給客戶端(誰提出了「註冊服務」的請求)。有了第一個想法,我們可以發送「200,一切都好!」或400.這不是問題。有了第二個想法,我們不知道消費者(「用戶服務」)是否堅持用戶數據,那麼我需要回復客戶端?

我有與Web應用程序的商店端相同的問題。客戶將他想購買的產品發佈到「訂購服務」。如果用戶有足夠的錢,這個人需要檢查他已經進入「用戶服務」的虛擬貨幣,然後將產品細節轉發到「交付服務」。如何用完全隔離的服務做到這一點?

我不想使用客戶端的http請求時間在消息代理上進行異步請求/回覆。

我希望你們中的一些人能夠啓發我。

+0

閱讀此:http://stackoverflow.com/questions/30213456/transactions-across-rest-microservices –

回答

0

Tom建議pretty good link,其中推理和解決方案的頂級答案是你可以依賴的答案。您的具體問題可能源於註冊服務和用戶服務是分開的事實。也許他們不應該?

理想情況下,註冊服務應該將「UserRegistered」事件發佈到總線並返回200,僅此而已。它不應該關心(知道)關於該事件的任何訂閱者。

0

謝謝你這個鏈接,

我的問題變成了一個新的架構。對於遇到同樣問題的人,我有這樣的感謝:

  • 把註冊服務和用戶服務放在一起。爲什麼?因爲這一切都取決於用戶信息(相同的數據庫要求)這就是IlliakaillI給出的解決方案。

  • 將用戶資金的管理分爲僅存在於「訂購服務」中的「錢包」。由於這一點,我們不需要在執行訂單時檢索用戶信息,我們只需要檢查錢包信息。 (I編碼在JWT的用戶名當用戶進行認證,因此我可以在錢包使用的用戶名作爲外鍵識別哪個錢包被供應,或使用等)

正如你可以看到,我不再使用消息代理,因爲現在我不需要消息代理。但是我可以將郵件邏輯分解成一個新的微服務,然後使用消息代理通過我所有的微服務發送郵件,如果需要的話。

如果我錯了,告訴我,但這聽起來很棒。