簡體   English   中英

微服務通信

[英]Microservices communication

我正在研究微服務,我正面臨着一個問題。

上下文

我正在開發兩個微服務:

  • 用戶管理,基於Spring,帶有MySQL數據庫
  • 規划管理,基於ASP.NET的SQL Server數據庫。 此服務的唯一訪問點是列出一些RESTFUL端點的API,例如/planning/{day}/{userId} or /planning/{startDate}/{endDate}/{idUser}
  • 計費管理,Node.Js基於MongoDB。

問題

  1. 如果只允許通過用戶服務訪問規划信息而不同時使用這兩種服務,我該怎么做? 知道以后可以從其他地方訪問計划服務,但現在不能。

  2. 如何從MySQL數據庫中訪問與用戶對應的計費服務的計費信息? 我知道微服務沒有耦合,這一點是殺了我,因為它必須以某種方式耦合? 就像在計費中引用idUser一樣? 另外,我怎么知道我應該從我的API中公開哪個賬單? 更確切地說,微服務如何在它們之間進行通信而不進行耦合?

  3. 如何創建身份驗證而不從其他服務復制身份驗證服務的身份驗證請求?

這里要認識到的重要一點是,在實現用戶身份驗證,用戶授權和用戶會話管理解決方案時,微服務架構解決方案與任何其他形式的分布式系統架構之間沒有明顯的概念差異。

從概念上講,該解決方案將是Kerberos協議的實現,其中傳遞“票證”(或稱為“令牌”,因為它更常見於今天)的概念被傳遞以建立用戶的身份。

因此,在您的情況下,您的用戶管理服務將充當您的后端身份驗證和授權服務器,所有其他服務都需要注意。 您的用戶管理服務將負責頒發和驗證用戶令牌,以確定用戶的身份和角色。

如果只允許通過用戶服務訪問規划信息而不同時使用這兩種服務,我該怎么做?

當用戶嘗試訪問.Net服務時,您的服務必須依賴您的用戶管理服務來建立用戶的身份。 換句話說,您的.Net服務需要知道您的用戶管理服務在哪里(即其URL)。 您可以使用一樣的工具ETCDNATS到您的用戶管理服務的位置傳播到您的生態系統的其余部分,沒有你的微服務連接到它。

如何從Mysql數據庫中訪問與用戶對應的計費服務的計費信息?

最簡單的解決方案是將(單個?)密鑰(例如用戶ID)作為查詢服務的URL中的查詢參數傳遞。 當然,您的結算服務必須以這樣的方式實現,以期將密鑰附加到URL。 如果您需要包含其他密鑰(例如,計費日期,訂單狀態等),您可以使用memcachedredis之類的東西在運行時存儲這些信息。 當然,現在您必須考慮將這些單點故障添加到您的生態系統中的權衡:-)

如何創建身份驗證而不從其他服務復制身份驗證服務的身份驗證請求?

同樣,一旦用戶通過身份驗證,其所有身份信息都可以存儲在memcachedredis之類的內容中,以避免重復身份驗證和授權過程。

另一種方法是構建另一個微服務,通過身份驗證/授權保護對其他服務的訪問。 這與API網關模式有關,此處還有其他信息: http//microservices.io/patterns/apigateway.html 基本上,您的系統只有一個入口點,您可以使用oauth或json Web令牌來處理客戶端身份驗證。

微服務之間的安全訪問也可以使用諸如http請求上的附加頭和令牌之類的東西(一種“內部”auth)來實現。

在我看來,微服務不應該承擔這個責任,因為你可能不得不在你的應用程序中共享/復制auth邏輯。

另一方面,將ID作為“外鍵”共享是解耦相關數據的好方法。

暫無
暫無

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

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