

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 上的基础架构示例 AWS
<a name="examples"></a>

本节提供了为应用程序设计基础架构的示例 AWS ，您可以使用该基础架构来实现六边形架构。我们建议您从构建最低可行产品 (MVP) 的简单架构入手。大多数微服务需要一个入口点来处理客户端请求，一个计算层来运行代码，一个持久层来存储数据。以下 AWS 服务非常适合在六角形架构中用作客户端、主适配器和辅助适配器：
+ **客户：**亚马逊 API Gateway、亚马逊简单队列服务 (Amazon SQS)、Amazon Squee SQS、Elastic Load Balancing、亚马逊 EventBridge
+ **主要适配器：** AWS Lambda、亚马逊弹性容器服务 (Amazon ECS)、亚马逊 Elastic Kubernetes Service（亚马逊 EKS）、亚马逊弹性计算云（亚马逊 EC2）Amazon EC2
+ **辅助适配器：**亚马逊 DynamoDB、亚马逊关系数据库服务 (亚马逊 RDS)、亚马逊 Aurora、API Gateway、亚马逊 SQS、Elastic Load Balancing EventBridge、亚马逊简单通知服务 (Amazon SNS) Simple Notification Service

以下各节将在六角形架构的背景下更详细地讨论这些服务。

## 从简单开始
<a name="start-simple"></a>

我们建议您在使用六角形架构架构应用程序时从简单开始。在此示例中，API Gateway 用作客户端 (REST API)，Lambda 用作主适配器（计算），DynamoDB 用作辅助适配器（持久性）。网关客户端调用入口点，在本例中，入口点是 Lambda 处理程序。

![\[简单的六角形架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/hexagonal-architectures/images/simple.png)


这种架构是完全无服务器的，为架构师提供了一个良好的起点。我们建议您在域中使用命令模式，因为它可以使代码更易于维护，并且可以适应新的业务和非功能需求。这种架构可能足以通过少量操作构建简单的微服务。

## 应用 CQRS 模式
<a name="apply-cqrs"></a>

如果域上的操作数量要扩展，我们建议您切换到 CQRS 模式。您可以使用以下示例将 CQRS 模式作为完全无服务器 AWS 的架构应用于中。

![\[在六角形架构中应用 CQRS 模式\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/hexagonal-architectures/images/cqrs.png)


此示例使用两个 Lambda 处理程序，一个用于查询，一个用于命令。使用 API 网关作为客户端同步运行查询。使用 Amazon SQS 作为客户端，可以异步运行命令。

该架构包括多个客户端（API Gateway 和 Amazon SQS）和多个主适配器（Lambda），它们由相应的入口点（Lambda 处理程序）调用。所有组件都属于同一个有界上下文，因此它们位于同一个域中。

## 通过添加容器、关系数据库和外部 API 来改进架构
<a name="evolve"></a>

对于长时间运行的任务，容器是一个不错的选择。如果您有预定义的数据架构并希望从 SQL 语言的强大功能中受益，则可能还需要使用关系数据库。此外，该域必须与外部通信 APIs。您可以改进架构示例以支持这些要求，如下图所示。

![\[通过添加容器、关系数据库和外部 API 来发展六边形架构\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/hexagonal-architectures/images/evolve.png)


此示例使用 Amazon ECS 作为在域中启动长时间运行的任务的主要适配器。当特定事件发生时，亚马逊 EventBridge （客户端）会启动 Amazon ECS 任务（入口点）。该架构包括 Amazon RDS 作为另一个用于存储关系数据的辅助适配器。它还添加了另一个 API 网关作为辅助适配器，用于调用外部 API 调用。因此，该架构使用多个主适配器和辅助适配器，这些适配器依赖于一个业务域中的不同底层计算层。

*该域始终通过称为端口的抽象与所有主适配器和辅助适配器松散耦合。*该域使用端口定义了它对外界的需求。由于实现端口是适配器的责任，因此从一个适配器切换到另一个适配器不会影响域。例如，您可以通过编写新的适配器从 Amazon DynamoDB 切换到 Amazon RDS，而不会影响域。

## 添加更多域名（缩小）
<a name="zoom"></a>

六角形架构与微服务架构的原理非常吻合。到目前为止显示的架构示例包含单个域（或有界上下文）。应用程序通常包括多个域，这些域需要通过主适配器和辅助适配器进行通信。每个域代表一项微服务，并且与其他域松散耦合。

![\[向您的六角形架构中添加域名\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/hexagonal-architectures/images/domains.png)


在此架构中，每个域使用一组不同的计算环境。（每个域也可能有多个计算环境，如前面的示例所示。） 每个域都定义了通过端口与其他域通信所需的接口。端口是通过使用主适配器和辅助适配器实现的。这样，如果适配器发生变化，域名就不会受到影响。此外，域之间是相互分离的。

在上图所示的架构示例中，Lambda、Amazon EC2、Amazon ECS 和 AWS Fargate 用作主适配器。API Gateway、Elastic Load Balancing 和 Amazon SQS 用作辅助适配器。 EventBridge