簡體   English   中英

兩個微服務之間的通信

[英]Communication between two microservices

我正在創建一個具有微服務架構的項目。 我創建了兩個微服務。

其中一個用於產品實體,另一個用於票據實體。 他們有自己的端點,並與網關連接在一起(我使用的是 jhipster 微服務架構)。

bill-ms 應該訪問產品列表。 我想知道如何在這兩個 ms 之間進行通信。 我腦子里有三個辦法:

  1. 從 bill-ms 向隊列發送請求 - 就像rabbitMQ,從 product-ms 獲取這些帶有這些 id 的產品(我不知道這是什么瓶頸)

  2. 向網關發送產品服務請求並從那里獲取產品(由於它們之間的數據大小,我擔心延遲,這樣我不會直接接觸數據庫,所以我總是依賴於網關)

  3. 我可以在 bill-ms 中復制倉庫、服務和實體(這是一種丑陋的方式,我認為它打破了 ms-architecture 的規則,維護非常困難)

如果您有任何其他方法,我很感激您與我分享。

編輯

  1. 現在我知道瓶頸是什么:說有 3 個 bill-ms 實例,rabbitMQ 如何決定響應哪個實例? 或者我該怎么說ribbon“給我bill-ms的免費實例來訂閱來自rabbitMQ的請求”以進行負載平衡。

我不確定我要回答的是否正確。 我自己還在學習..但我可以告訴你我是如何實現我的微服務嘗試的..

首先,我使用這個博客開始了基於HTTP通信的微服務。 這工作正常,但問題是,您在服務之間創建了依賴關系。 服務 A需要知道服務 B並需要直接調用它(當然通過服務發現等)。 這是您在開發微服務時通常要避免的。

我最近開始使用的另一種方法是使用message bus 這實際上是您在問題中提到的第三個選項。

我有一個服務 A ,它存儲人員(只是一個例子)。 該服務在創建一個新人時所做的是: 它在RabbitMQ總線上發送一個eventpersonCreatedEvent 如果有任何其他服務對此類事件感興趣,他們可以訂閱它們。 這些感興趣的服務將他們感興趣的相關信息保存在他們自己的數據存儲中。

使用最后一種方法,您的服務之間並沒有真正的依賴關系,因為它們不直接相互通信。 服務 A不知道服務 B ,因為 B 只是將事件發送到RabbitMQ到任何對這些事件感興趣的服務,反之亦然。

當然,您在服務上的數據存儲之間存在重復。 但這也可以是有利可圖的,例如,服務 B 不需要使用與服務 A 相同的模式或數據存儲機制。它僅以最適合該服務的方式存儲相關信息。

您是否看過http://stytex.de/blog/2016/03/25/jhipster3-microservice-tutorial/第 2 部分:服務間通信部分。 它會引導您完成一個具體的例子,說明它是如何實現的

讓我嘗試在這個場景中添加更多細節,以強調在 Product 和 Biiling 的上下文中什么可能或可能不符合事件的條件。 Billing-MS 僅在下訂單時才需要與 Product-M 交談。 下訂單主要是針對單獨的 MS,比如說 Order-MS。 創建或下訂單時,它將包含產品信息作為行項目。

訂單的創建可以被視為一個事件。 當訂單創建事件發生時,它可以被推送到計費服務的隊列中。 Queue 應該在 RabbitMQ 中實現為 Work-queue。 這樣,Billing-MS 的多個實例可以訂閱同一個隊列,但它將由一個且只有一個 Worker 處理。 RIBBON 在將服務注冊為 Worker 到 RabbitMQ 方面沒有任何作用。 每個實例注冊到一個隊列,RabbitMQ 決定 RoundRobin 哪個計費服務實例可以處理這個事件。

為 Billing-Ms 獲取訂單中產品的詳細信息應該是通過 Ribbon 進行負載平衡的服務到服務調用(如果這是您使用的)。 獲取產品詳細信息並不是真正的事件,下訂單才是,因此有所不同。

此外,Gateway 應該用於公開您的 Edge 服務。 對於服務到服務調用,通過網關服務進行跳轉並不理想。

一種選擇是使用微服務在 eureka 注冊表上的注冊名稱發送請求以對微服務進行計費。

您可以使用以下解決方案:微服務A(即UAA-SERVICE)和微服務B。微服務B想要連接微服務A並使用Feign客戶端調用服務。

1)微服務B的這段代碼

@AuthorizedFeignClient(name = "UAA-SERVICE")

公共接口 UaaServiceClient {

@RequestMapping(method = RequestMethod.GET, path = "api/users")
public List<UserDTO> getUserList();

@RequestMapping(method = RequestMethod.PUT, path = "api/user-info")
public String updateUserInfo(@RequestBody UserDTO userDTO);

}

UAA-SERVICE :通過運行帶有注冊表的應用程序實例找到此名稱。

2)在微服務B(application.yml)中增加feign client connection Time Out------> feign:client:config:default:
connectTimeout: 10000 readTimeout: 50000在此輸入圖片描述增加 hystrix 線程超時-------->

hystrix:命令:默認:執行:隔離:線程:timeoutInMilliseconds:60000 shareSecurityContext:true

在此處輸入圖像描述3) 在主 @SpringBootApplication 類中添加 @EnableFeignClients。 -------> 這個解決方案對我來說很好用。

暫無
暫無

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

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