識別微服務界限

Azure DevOps

微服務的合適大小為何? 您通常會聽到「太大且不太小」的效果,雖然這確實正確,但實際上並不有説明。 不過,如果您一開始就審慎設計領域模型,那麼您就可以更加容易地理解微服務。

限定內容的圖表。

本文使用無人機遞送服務作為執行中的範例。 您可以 在這裡深入瞭解案例和對應的參考實作。

從網域模型到微服務

上一篇文章中,我們定義了一組無人機遞送應用程式的限定內容。 接著,我們更仔細地查看了這些限界內容的其中一個 (也就是「出貨」限界內容),並找出該限界內容的一組實體、彙總和領域服務。

而現在,我們已準備好從領域模型階段進入應用程式設計階段。 以下是您可以用來從領域模型衍生微服務的方法。

  1. 從限定內容開始。 一般而言,微服務中的功能不應跨越一個以上的限定內容。 根據定義,限界內容會標示特定領域模型的界限。 如果您發現某個微服務與不同的領域模型混合在一起,這表示您可能需要回頭重新琢磨您的領域分析。

  2. 接著,查看領域模型中的彙總。 彙總通常很適合作為微服務。 設計良好的彙總會展現出擁有良好設計之微服務的許多特性,例如:

    • 彙總是衍生自商務需求而非出於技術方面的顧慮 (例如資料存取或傳訊)。
    • 彙總應該要高度銜接各個功能。
    • 彙總是持續性的界限。
    • 彙總應該是鬆散耦合的。
  3. 領域服務通常很適合作為微服務。 領域服務是跨多個彙總的無狀態作業。 典型的範例是牽涉到數個微服務的工作流程。 我們會在無人機遞送應用程式中看到這種情況的範例。

  4. 最後,請考慮非功能性需求。 審視各個因素,例如小組規模、資料類型、技術、延展性需求、可用性需求和安全性需求。 這些因素可能會讓您進一步將微服務分解成兩個以上較小的服務,或反過來將數個微服務合併成一個。

在識別應用程式中的各個微服務後,請根據下列準則驗證您的設計:

  • 每一項服務都各肩負一項責任。
  • 服務之間不會頻繁地通訊。 如果將功能分割成兩個服務會使這兩個服務頻繁通訊,便可能表示這些功能應該放在同一個服務內。
  • 每個服務都夠小,以便可由小型小組獨立工作來加以建置。
  • 沒有交互相依性,因此不必將兩個以上的服務一起部署。 在部署某項服務時,應該要永遠不必重新部署任何其他服務。
  • 服務未緊密結合,並且可以獨立進化。
  • 您的服務界限不會產生資料一致性或完整性的問題。 有時候您必須透過將功能放入單一微服務中,以保持資料一致性。 話雖如此,請考慮您是否真的需要強式一致性。 您可以找到策略來解決分散式系統的最終一致性問題,而且拆解服務所能帶來的好處,通常會勝過管理最終一致性所帶來的麻煩。

最重要的是,務必要務實,並請記得領域導向的設計是反覆不斷的程序。 當您猶豫不定時,請從更粗略的微服務來開始著手。 將微服務分割成兩個較小的服務,會比重構數個現有微服務的功能來得簡單。

範例:定義無人機遞送應用程式的微服務

回想一下,開發小組已識別出四個匯總:傳遞、套件、無人機和帳戶,以及兩個網域服務:排程器和監督員。

遞送與包裹很明顯可作為微服務。 排程器和監督員會協調其他微服務所執行的活動,因此也應該將這些領域服務當做微服務來實作。

無人機和帳戶則很有趣,因為這兩者屬於其他限界內容。 其中一個選項是讓排程器直接呼叫無人機和帳戶限界內容。 另一個選項則是在出貨限界內容中建立無人機和帳戶微服務。 這些微服務會居中協調限界內容,方法是藉由將更適合出貨內容的 API 或資料結構描述予以公開。

無人機和帳戶限界內容的詳細資料不再本指南的說明範圍內,因此我們在參考實作中為其建立了模擬服務。 但在此情況下,需要考量以下因素:

  • 直接呼叫到另一個限界內容會有何網路負荷?

  • 其他限界內容的資料結構描述是否適用於此內容,或是為此限界內容專門打造一個結構描述會更好?

  • 其他限界內容是否為繼承系統? 如果是,您可能要建立一項服務來作為防損毀層,以在繼承系統和新型應用程式之間進行轉換。

  • 小組結構為何? 是否能輕易地與負責其他限界內容的小組進行溝通? 如果不行,則建立可居中協調兩個內容的服務會有助於減輕跨小組溝通的成本。

到目前為止,我們還未考慮過任何非功能性需求。 開發小組考慮到應用程式的輸送量需求,決定要建立個別的擷取微服務,來負責擷取用戶端要求。 此微服務會藉由將內送要求放入緩衝區進行處理,來實作負載調節。 排程器會從緩衝區讀取要求,並執行工作流程。

非功能性需求導致開發小組額外建立了一項服務。 到目前為止的所有服務皆與即時排程和遞送包裹的程序有關。 但是,系統還必須將每一次遞送的記錄儲存在長期儲存體中,以便進行資料分析。 開發小組考慮由遞送服務負責這項工作。 不過,歷史分析作業和進行中之作業的資料儲存需求大不相同 (請參閱資料考量)。 因此,該小組決定另外建立一個遞送記錄服務,由其接聽遞送服務的 DeliveryTracking 事件,並將這些事件寫入長期儲存體中。

下圖顯示到目前為止的設計:

此圖顯示無人機遞送應用程式的微服務設計。

下載這個架構的 Visio 檔案

下一步

此時,您應該清楚瞭解設計中每個微服務的用途和功能。 現在您可以建構系統。