2016-11-02 157 views
8

我是微軟服務的新手,我試圖把我的項目變成一個基於微服務的項目。我的問題是弄清楚每種服務是如何相互通信的。微服務通信

首先,我探索了REST風格的服務,但是如果每個服務都基於HTTP REST,他們究竟怎麼相互「交談」?

然後我試着學習Spring集成,但後來變得更清楚,他們應該如何溝通,因爲現在我想到,也許我需要使用RabbitMQ作爲前端和微服務後端之間的中間件。

我也遇到了雲和Docker技術,所以我猜每個服務都應該在雲上,但是它並沒有說明服務如何通信。

我正在使用Java,Spring技術。

我會很高興,如果有人會給我一個更好的圖片應該怎麼樣。

回答

4

你走向正確的道路。使用REST體系結構公開服務功能強大且簡單。每個微服務都暴露出一些可以被其他微服務調用的功能。你可以用SpingMVC和註解@RestController來做到這一點。要調用REST API,您可以使用Spring類RestTemplate。

您可能還需要一個網關,將請求重定向到正確的服務。我建議你試試Netflix Cloud Stack:

  • Zuul。這是您的應用程序的入口點。每個請求都發給它。它應該協調整個生態系統。
  • 尤里卡客戶端 - 尤里卡服務器。所有的微服務都應該以某種方式告訴某人他們已經啓動並運行,並且可以接受請求。因此,您可以使用Eureka服務器接受來自您的服務的註冊並將您的微服務標記爲客戶端。
  • 絲帶。另一個重要的事情是請求的負載平衡。使用Ribbon可以輕鬆完成此操作。

如果您使用的是Spring Boot,您可以使用一些註釋快速設置此體系結構。

你可以在這裏找到一個簡單的例子:https://cloud.spring.io/spring-cloud-netflix/

2

微服務的通信或傳輸機制沒有標準。通常,微服務使用廣泛採用的輕量級協議(例如HTTP和REST)或消息傳遞協議(如JMS或AMQP)相互通信。在特定情況下,可以選擇更優化的通信協議,例如Thrift,ZeroMQ,Protocol Buffers或Avro。

微服務之間的通信可以設計爲同步(請求響應)或異步(消除和遺忘)樣式。兩種方法都有其優點和限制。僅用一種方法開發系統是不可能的。基於用例需要兩種方法的組合。

根據您的使用情況和要求,您應該選擇最適合您的項目的項目。

2

我曾親自使用的尤里卡發現服務。如果您願意,這基本上就是微服務的「木偶大師」。每個微服務在啓動時將自己註冊到單獨的微服務(發現服務)。發現服務因此知道每個微服務的地址和端口,並且每個微服務可以詢問發現服務哪些(其他)微服務被註冊。另外,每個微服務可以簡單地向發現服務詢問關於另一微服務的信息。所有的溝通(在我的情況下)都是使用REST完成的,但這是一個選擇,因爲具有Eureka發現服務依賴項的Spring Boot會促進它。

非常少的配置,你可以得到這個整個框架的功能。

這是基於Netflix使用的框架。我相信尤里卡甚至是這方面的netflix庫。

2

我不太喜歡從服務A到服務B的直接API調用,反之亦然,原因有兩個。首先,它創建服務A和B之間的依賴關係。其次,隨着服務數量的增長,它可以輕鬆地創建一個意大利麪的混亂關係。我想看到的是一個酒吧/子模式,例如服務A向傳輸層發佈消息(RabbitMQ不是一個不錯的選擇),然後繼續。解析消息的訂閱和業務邏輯很好地封裝在服務B中。通過這樣做,服務B根本不需要知道關於服務A的任何信息,但它們可以很好地相互交流。

0

有微服務做同步相互溝通是一個風險,大問題是耦合,它意味着服務現在耦合到對方,如果其中一個失敗它的依賴項將完全或部分禁用/崩潰,更好的解決方案是使用異步通信進行狀態更改操作。

您想清楚區分狀態更改操作和讀取操作(CQS命令查詢分隔)。對於狀態更改操作,您可以使用某種消息傳遞基礎結構並着火併忘記通信。對於查詢,您可以使用同步請求響應通信,並可以使用http API或直接轉到數據存儲。

如果您使用消息傳遞,那麼您還可以查看發佈訂閱以提高服務之間的事件。

如果您暴露了內部狀態,讀者可能會得到錯誤的數據狀態或錯誤的版本,並且可能會鎖定您的數據(另請參見「數據共享」數據?

最後但並非最不重要的一點,儘量做到讓服務保持自治(至少在邏輯層面上)。

希望這是有道理的。