

# REL03-BP02 建置專注於特定業務領域和功能的服務
<a name="rel_service_architecture_business_domains"></a>

服務導向架構 (SOA) 會定義服務，具有依商業需求定義的明訂功能。微型服務使用領域模型和有界限的環境，沿著業務環境界限繪製服務界限。專注於業務領域和功能，有助於團隊為其服務定義獨立的可靠性要求。有界限的環境可隔離和封裝商業邏輯，讓團隊更適切地推論如何處理失敗。

 **預期成果：**工程師和業務利益相關者共同定義有界限的環境，並將其用來設計系統，作為滿足特定業務功能的服務。這些團隊使用既定的做法 (如事件風暴) 來定義要求。新的應用程式設計為服務妥善定義的界限和鬆散耦合。現有的整合型服務被分解為[有界限的環境](https://martinfowler.com/bliki/BoundedContext.html)，系統設計轉向 SOA 或微服務架構。整合型服務重構時，會套用已建立的方法 (如 Bubble 環境) 和整合型分解模式。

 領域導向服務會以一或多個不共用狀態的程序執行。它們會單獨回應需求的波動，並根據領域的特定要求來處理錯誤情境。

 **常見的反模式：**
+  團隊是依據特定技術領域 (例如 UI 和 UX、中介軟體或資料庫) 組成的，而不是特定的業務領域。
+  應用程式跨多個領域責任。跨有界限環境的服務可能更難以維護，需要較大量的測試工作，且需要多個領域團隊參與軟體更新。
+  領域相依性 (例如領域實體程式庫) 會跨服務共用，因此一個服務領域出現變更時，需要變更其他服務領域 
+  服務合約和商業邏輯無法以通用且一致的領域語言來表達實體，因此會導致翻譯層級使系統複雜化，並增加偵錯工作。

 **建立此最佳實務的優勢：**應用程式設計為獨立的服務，受到業務領域限制，並使用共同的商務語言。服務可以單獨測試和部署。服務符合實作領域的特定恢復能力要求。

 **未建立此最佳實務時的曝險等級：**高 

## 實作指引
<a name="implementation-guidance"></a>

 領域驅動設計 (DDD) 是依據業務領域設計和建置軟體的基礎方法。在建置專注於業務領域的服務時，使用現有架構將有所幫助。使用現有的整合型應用程式時，您可以利用分解模式提供已建立的技術，將應用程式現代化為服務。

![\[此流程圖描述領域驅動設計的方法。\]](http://docs.aws.amazon.com/zh_tw/wellarchitected/latest/framework/images/domain-driven-decision.png)


 

## 實作步驟
<a name="implementation-steps"></a>
+  團隊可舉行[事件風暴](https://serverlessland.com/event-driven-architecture/visuals/event-storming)研討會，以便箋格式快速識別事件、命令、彙總和領域。
+  在網域環境中形成網域實體和函數之後，可以使用[有界限的環境](https://martinfowler.com/bliki/BoundedContext.html)將網域劃分為服務，其中共用相似特徵和屬性的實體會分組在一起。隨著此模型劃分成多個環境，如何界定微型服務界限的範本便會浮現。
  +  例如，Amazon.com 網站實體可能包括包裝、交付、排程、價格、折扣和貨幣。
  +  包裝、交付和排程會分組到出貨環境中，而價格、折扣和貨幣則分組到訂價環境中。
+  [將整合型服務分解為微型服務](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-decomposing-monoliths/welcome.html)概述了重構微型服務的模式。按業務功能、子領域或交易使用分解的模式，會與領域驅動的方法保持一致。
+  諸如 [bubble 環境](https://www.domainlanguage.com/wp-content/uploads/2016/04/GettingStartedWithDDDWhenSurroundedByLegacySystemsV1.pdf)等戰術可讓您在現有或舊版應用程式中導入 DDD，而無須預先重寫和對 DDD 完整承諾。在 bubble 環境方法中，使用服務映射和協調或[防損毀層](https://serverlessland.com/event-driven-architecture/visuals/messages-between-bounded-context)來建立一個小的有界限環境，可保護新定義的網域模型免受外部影響。

 在團隊執行領域分析並定義實體和服務合約之後，他們可以利用 AWS 服務將其領域導向設計實作為雲端架構服務。
+  藉由定義執行領域商務規則的測試來起始您的開發。測試驅動的開發 (TDD) 和行為驅動的開發 (BDD) 可協助團隊將服務著重於解決業務問題上。
+  選取最符合您的企業網域需求和[微服務架構](https://docs.aws.amazon.com/whitepapers/latest/microservices-on-aws/microservices-on-aws.html)的 [AWS 服務](https://aws.amazon.com/microservices/)：
  +  [AWS Serverless](https://aws.amazon.com/serverless/) 讓您的團隊專注於特定的領域邏輯，而不是管理伺服器和基礎設施。
  +  [AWS 的容器](https://aws.amazon.com/containers/)可簡化基礎設施的管理，讓您得以專注在您的網域要求上。
  +  [專用資料庫](https://aws.amazon.com/products/databases/)協助您根據領域要求找出最適合的資料庫類型。
+  [在 AWS 上建置六邊形架構](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/welcome.html)，它概述了一個框架，用以將業務邏輯建置到從業務領域回溯運作的服務中，以滿足功能要求，然後附加整合適配器。使用 AWS 服務將介面詳細資訊與商業邏輯分開的模式，可協助團隊專注於領域功能及改善軟體品質。

## 資源
<a name="resources"></a>

 **相關的最佳實務：**
+  [REL03-BP01 選擇如何分割工作負載](rel_service_architecture_monolith_soa_microservice.md) 
+  [REL03-BP03 提供每個 的服務合約 API](rel_service_architecture_api_contracts.md) 

 **相關文件：**
+ [AWS 微型服務](https://aws.amazon.com/microservices/)
+  [實作 AWS 上的微型服務](https://docs.aws.amazon.com/whitepapers/latest/microservices-on-aws/introduction.html) 
+  [如何將整合型服務分成微型服務](https://martinfowler.com/articles/break-monolith-into-microservices.html) 
+  [在置身於舊式系統時開始使用 DDD](https://domainlanguage.com/wp-content/uploads/2016/04/GettingStartedWithDDDWhenSurroundedByLegacySystemsV1.pdf) 
+ [網域驅動設計：解決軟體核心的複雜性](https://www.amazon.com/gp/product/0321125215)
+ [在 AWS 上建置六邊形架構](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/welcome.html)
+ [將整合型服務分解為微型服務](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-decomposing-monoliths/welcome.html)
+ [事件風暴](https://serverlessland.com/event-driven-architecture/visuals/event-storming)
+ [有界限的環境之間的訊息](https://serverlessland.com/event-driven-architecture/visuals/messages-between-bounded-context)
+ [微型服務](https://www.martinfowler.com/articles/microservices.html)
+ [測試驅動的開發](https://en.wikipedia.org/wiki/Test-driven_development)
+ [行為驅動的開發](https://en.wikipedia.org/wiki/Behavior-driven_development)

 **相關範例：**
+ [在 AWS 上設計雲端原生微型服務 (從 DDD/EventStormingWorkshop)](https://github.com/aws-samples/designing-cloud-native-microservices-on-aws/tree/main)

 **相關工具：**
+ [AWS 雲端 資料庫](https://aws.amazon.com/products/databases/)
+ [AWS 上的無伺服器](https://aws.amazon.com/serverless/)
+ [AWS 上的容器](https://aws.amazon.com/containers/)