

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

# 托管的开发路线图 亚马逊 GameLift 服务器 托管容器
<a name="gamelift-roadmap-containers"></a>

本路线图将指导您如何为容器化游戏服务器开发 Amazon GameLift Servers 托管式托管解决方案。托管容器只是 Amazon GameLift Servers 提供的一种托管解决方案。有关托管选项的更多信息，请参阅 [亚马逊 GameLift 服务器 游戏托管选项](gamelift-intro-flavors.md)。

基于 Amazon GameLift Servers 的托管容器解决方案包含下列组件：
+ 一个包含游戏服务器生成包的容器映像，需上传至 Amazon Elastic Container Registry（Amazon ECR）私有存储库。该游戏服务器生成包需与 Amazon GameLift Servers 的服务器 SDK 集成，且需构建为在 Linux 上运行。
+ 一项后端服务，代表您的游戏客户端与 Amazon GameLift Servers 服务进行交互。该后端服务需使用 Amazon GameLift Servers 的服务 API 中的功能，它是 Amazon SDK 的一部分。
+ 一个 Amazon GameLift Servers 游戏会话队列或其他放置机制，负责处理新游戏会话的创建请求，在所有实例集中搜索可用的游戏服务器，并提示游戏服务器启动游戏会话。
+ （可选）一个 FlexMatch 对战构建器，用于创建多人对战并为其设置游戏会话。
+ 一个或多个容器实例集，使用针对多人游戏托管进行了优化的 Amazon Elastic Compute Cloud（Amazon EC2）实例。

本路线图提供了一个简化的路径，让容器化游戏服务器可以通过 Amazon GameLift Servers 托管容器成功启动并运行。准备好必要的组件后，您就可以继续迭代游戏开发并自定义您的托管解决方案。临近发布时，请参阅[使用以下方法为发布做准备 亚马逊 GameLift 服务器 托管](gamelift_quickstart_customservers_checklist.md)，帮助您为生产级使用准备托管解决方案。

**借助以下托管容器工具加快入门速度：**  
[容器入门工具包](https://github.com/aws/amazon-gamelift-toolkit/tree/main/containers-starter-kit)可简化集成和实例集设置。它为游戏服务器添加核心游戏会话管理功能，并通过预配置的模板构建容器实例集和游戏服务器的自动化部署管道。部署完成后，可通过 Amazon GameLift Servers 控制台和 API 工具监控实例集性能、管理游戏会话并分析指标。
对于 Unreal Engine 和 Unity 开发人员，可使用 [Amazon GameLift Servers 插件](https://github.com/amazon-gamelift/)在游戏引擎的开发环境内集成游戏服务器并构建容器实例集。该插件提供的引导式工作流程可帮助您借助托管容器创建基于云的快速、简单的托管解决方案。后续可在此基础上扩展，为游戏创建自定义托管方案。

## 第 1 步：准备游戏服务器以供使用 亚马逊 GameLift 服务器
<a name="gamelift-roadmap-containers-step1"></a>

为您的游戏服务器添加功能，使其在为托管进行部署时能与 Amazon GameLift Servers 服务进行通信。
+ **为您的游戏项目获取 Amazon GameLift Servers（5.2 或更高版本）的服务器 SDK。**服务器 SDK 支持 C\+\+、C\# 和 Go 语言。[下载 Amazon GameLift Servers 的服务器 SDK](https://www.amazonaws.cn/gamelift/servers/getting-started-sdks/)。服务器 SDK 支持 C\+\+、C\# 和 Go 语言。
+ **修改游戏服务器代码以添加服务器 SDK 功能。**有关指南，请参阅[准备使用 Amazon GameLift Servers 托管游戏](integration-intro.md)。至少执行以下操作：
  + 添加代码以初始化 Amazon GameLift Servers SDK 并与Amazon GameLift Servers服务建立 WebSocket连接。使用服务器 SDK 操作 `InitSdk()`。
  + 添加代码，以在服务器进程准备好托管游戏会话时向 Amazon GameLift Servers 服务报告。使用服务器 SDK 操作 `ProcessReady()`。
  + 实现所需的回调函数 `OnStartGameSession()` 和 `OnProcessTerminate()`。借助这些函数，游戏服务器进程可以保持与 Amazon GameLift Servers 服务的连接、在 Amazon GameLift Servers 提示时启动游戏会话，以及响应结束游戏服务器进程的请求。
  + 添加代码，以在服务器进程结束游戏会话时向 Amazon GameLift Servers 服务报告。使用服务器 SDK 操作 `ProcessEnding()`。
+ **打包游戏服务器生成包。**构建您的游戏服务器以在 Linux 上运行。准备运行游戏服务器所需的生成包和其他文件。如果您要在 Windows 上进行开发，则此步骤可能涉及设置单独的 Linux WorkSpace 或使用适用于 Linux 的 Windows 子系统（WSL）等工具。您需要一种 Linux 环境来测试游戏服务器生成包，以及构建和测试容器映像。
+ **测试游戏服务器集成。**确认您的集成游戏服务器可以连接到 Amazon GameLift Servers 服务并对提示做出响应。我们建议设置一个简单的 Amazon GameLift Servers Anywhere 实例集，将本地工作站作为测试主机，如中[使用设置本地测试 亚马逊 GameLift 服务器 Anywhere](integration-testing.md)所述。将游戏服务器生成包安装到测试主机上，然后启动服务器进程。使用 Amazon CLI 请求新的游戏会话，并验证该Amazon GameLift Servers服务是否成功提示您的服务器进程启动游戏会话。

## 步骤 2：创建游戏服务器容器映像
<a name="gamelift-roadmap-containers-step2"></a>

成功集成游戏服务器后，使用游戏服务器可执行文件创建容器映像。将映像存储到 Amazon Elastic Container Registry（Amazon ECR）存储库中以与 Amazon GameLift Servers 搭配使用。有关详细说明，请参阅[为构建容器镜像 亚马逊 GameLift 服务器](containers-prepare-images.md)。
+ **获取游戏服务器容器的 Dockerfile 模板（由 Amazon GameLift Servers 提供）。**修改游戏服务器生成包文件的文件。
+ **构建游戏服务器容器映像。**在 Linux 环境中操作时，使用 Docker 工具创建您的映像。
+ **将容器映像推送到 Amazon ECR。**在 Amazon ECR 中创建公共或私有存储库，使用该存储库 Amazon Web Services 账户 以及您计划部署容器队列 Amazon Web Services 区域 的位置。随后将容器映像推送至该存储库。
+ **使用 Anywhere 实例集测试您的容器映像（可选）。**在将容器映像部署到云托管的容器实例集之前，您可能需要在本地对其进行测试。您可将现有的 Amazon GameLift Servers Anywhere 实例集与本地工作站搭配使用以进行测试。安装并运行游戏服务器容器后，需验证以下两项内容：（1）Amazon GameLift Servers 服务是否成功提示您的服务器进程启动游戏会话；（2）游戏客户端能否连接到该游戏会话。

## 步骤 3：创建基于云的容器实例集
<a name="gamelift-roadmap-containers-step3"></a>

到目前为止，您已经使用自管理式 Anywhere 实例集来测试和迭代游戏组件。当您拥有可正常运行且已集成 Amazon GameLift Servers 的游戏服务器生成包后，即可开始设置基于云的 Amazon GameLift Servers 托管式容器实例集托管资源，这些资源是您搭建生产环境所需的核心托管资源。
+ **创建容器组定义。**容器组定义描述了舰队的容器架构，并确定要部署哪些容器镜像。请参阅[为... 创建容器组定义 亚马逊 GameLift 服务器 集装箱舰队](containers-create-groups.md)。在存储容器映像的相同 Amazon Web Services 区域 位置创建容器组定义。有关选择实例集位置的更多信息，请参阅[地理位置](gamelift-compute.md#gamelift-compute-location)。至少执行以下操作：
  + 创建游戏服务器容器组定义。
  + 在游戏服务器生成包中添加带有容器映像的容器定义。
  + 为容器的游戏服务器进程配置端口范围。
+ **创建托管式容器实例集。**创建实例集时，Amazon GameLift Servers 会立即开始部署游戏服务器生成包进行托管。您可以配置托管式实例集的许多方面。有关指南，请参阅[创建一个 亚马逊 GameLift 服务器 托管集装箱舰队](containers-build-fleet.md)。至少执行以下操作：
  + 为容器队列设置 Amazon Identity and Access Management (IAM) 服务角色。请参阅[为 Amazon GameLift Servers 设置 IAM 服务角色](setting-up-role.md)。
  + 指定要部署到实例集实例的游戏服务器容器组定义。
  + 对于所有其他参数，如有可用默认值，可直接使用。Amazon GameLift Servers 会计算部分参数以实现最优配置。
+ **将容器实例集添加到队列。**在游戏会话队列中，将 Anywhere 测试实例集替换为添加您的托管式容器实例集。
+ **使用容器实例集测试游戏托管。**此时您应能对整个解决方案进行测试。启动游戏客户端，并通过后端服务请求游戏会话。获取连接信息后，连接至容器实例集上的游戏会话。
+ **迭代实例集部署。**您可以更新容器组定义和实例集配置，然后将更新部署到现有实例集中。

## 第 4 步：准备游戏客户端以加入托管的游戏会话
<a name="gamelift-roadmap-containers-step4"></a>

为您的游戏客户端创建一种方法，使其能够请求加入游戏会话、获取连接信息，然后直接连接到托管的游戏会话。最常见的方法是设置后端服务功能，作为游戏客户端和 Amazon GameLift Servers 服务之间的桥梁。此方法可以保护您的托管资源，并让您更好地控制玩家进入游戏会话的方式。
+ **构建用于托管的后端服务功能。**后端服务会与 Amazon GameLift Servers 服务通信并向游戏客户端提供连接信息。此功能包括启动游戏会话、将玩家放入游戏以及检索游戏会话信息。有关指南，请参阅[准备使用 Amazon GameLift Servers 托管游戏](integration-intro.md)。至少执行以下操作：
  + 获取的 Amazon SDK Amazon GameLift Servers 并将其添加到您的后端服务项目中。请参阅[面向客户端服务的 Amazon GameLift Servers SDK 资源](gamelift-supported.md#gamelift-supported-clients)。
  + 添加代码以初始化 Amazon GameLift Servers 客户端并存储键设置。请参阅[设置 亚马逊 GameLift 服务器 API](gamelift-sdk-client-api.md#gamelift-sdk-client-api-initialize)。
  + 添加调用 Amazon SDK 操作`CreateGameSession()`并向游戏客户端提供游戏会话连接信息的功能。请参阅 [Create a game session on a specific fleet](gamelift-sdk-client-api.md#gamelift-sdk-client-api-create)。

    拨打电话`CreateGameSession()`是申请新游戏会话的便捷起点。在你建立了游戏会话放置系统（参见步骤 3）后，你会将此代码替换为调用`StartGameSessionPlacement()`（或者`StartMatchmaking()`如果你正在使用FlexMatch）。

    有关设计后端服务的指导，请参阅[为构建后端服务 亚马逊 GameLift 服务器](gamelift_quickstart_customservers_designbackend.md)。
+ **向游戏客户端添加允许玩家加入托管游戏会话的功能。**游戏客户端将向您的后端服务发出请求，而不是直接向 Amazon GameLift Servers 发出请求。在后端服务提供游戏会话连接信息后，游戏客户端会直接连接到游戏会话来玩游戏。
+ **测试游戏客户端集成。**您可将现有的 Amazon GameLift Servers Anywhere 实例集与本地工作站搭配使用以进行测试。使用新的后端服务请求一个新的游戏会话，并验证以下两项内容：（1）Amazon GameLift Servers 服务是否成功提示您的服务器进程启动游戏会话；（2）游戏客户端能否连接到该游戏会话。

## 第 5 步：设置游戏会话布局
<a name="gamelift-roadmap-containers-step5"></a>

您可自定义 Amazon GameLift Servers 处理新游戏会话请求的方式，并找到可用的游戏服务器来托管这些请求。Amazon GameLift Servers 会自动跟踪所有实例集上的所有游戏服务器的可用性。当游戏客户端发送加入游戏会话的请求时，Amazon GameLift Servers 会根据一组已定义的优先级（如最低延迟、成本和可用性）寻找“最佳”放置。
+ **创建游戏会话队列，用于将新的游戏会话与可用的游戏服务器一起放置。**队列是游戏会话放置的主要机制。有关指南，请参阅[创建游戏会话队列](queues-creating.md)。
  + 至少在队列中将您的 Anywhere 实例集添加为目标。所有其他设置都是可选自定义项。
+ **在后端服务代码中，将 `CreateGameSession()` 调用转换为 `StartGameSessionPlacement()`。**请参阅 [Create a game session in a multi-location queue](gamelift-sdk-client-api.md#gamelift-sdk-client-api-create)。
+ **创建一个机制，用于在游戏会话准备好加入时通知游戏客户端。**在开发过程中，您可以使用对 `DescribeGameSessionPlacement` 的调用来轮询游戏会话状态。但是，在使用队列处理大量数据之前，您需要启用事件通知。请参阅[请参阅设置游戏会话置放通知。](queue-notification.md)。
+ **添加 FlexMatch 对战（可选）。**构建对战规则集并创建对战配置以与您的游戏会话队列协同工作。有关设置对战系统的指导，请参阅《[Amazon GameLift Servers FlexMatch 开发人员指南](https://docs.amazonaws.cn/gameliftservers/latest/flexmatchguide/match-intro.html)》。
+ **测试放置系统。**您可将现有的 Amazon GameLift Servers Anywhere 实例集与本地工作站搭配使用以进行测试。使用后端服务请求一个新的游戏会话，并验证 Amazon GameLift Servers 服务是否成功提示您的服务器进程启动游戏会话。

## 步骤 6：自定义托管容器解决方案
<a name="gamelift-roadmap-containers-step6"></a>

在为游戏发布做准备时，您需要对托管式托管资源进行微调。需要考虑的决策包括：
+ 优化您的容器实例集配置。请参阅[自定义 亚马逊 GameLift 服务器 集装箱船队](containers-design-fleet.md)。
+ 考虑添加竞价型实例集以节省成本。请参阅[借助竞价型实例集降低游戏托管成本](fleets-spot.md)。
+ 如果您的游戏服务器需要与其他 Amazon 资源通信，请设置 IAM 角色来管理访问权限。请参阅[连接你的 亚马逊 GameLift 服务器 将游戏服务器托管给其他人 Amazon 资源](gamelift-sdk-server-resources.md)。
+ 确定要将游戏服务器放置在哪个地理位置。将偏远位置添加到您的托管式实例集。请参阅[托管资源自定义](fleets-design.md)。
+ 试验适用于托管式实例集的游戏会话放置选项，包括自定义优先级设置。请参阅[自定义游戏会话队列](queues-design.md)。
+ 设置自动容量扩展以满足预期的玩家需求。请参阅[利用 Amazon GameLift Servers 扩展游戏托管容量](fleets-manage-capacity.md)。
+ 在其他队列中创建队列 Amazon Web Services 区域 ，修改队列和自动缩放以根据需要处理故障转移。
+ 设置托管可观测性工具，包括分析和日志记录。请参阅[监控 亚马逊 GameLift 服务器](monitoring-overview.md)。
+ 使用[基础设施即代码（IaC）](https://docs.amazonaws.cn/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)自动执行实例集部署。请参阅[管理 亚马逊 GameLift 服务器 使用托管资源 Amazon CloudFormation](resources-cloudformation.md)。

  Amazon GameLift Servers支持将 Amazon CloudFormation 模板用于任何特定部署的配置。您也可以使用 Amazon Cloud Development Kit (Amazon CDK) 来定义Amazon GameLift Servers资源。有关的更多信息 Amazon CDK，请参阅[Amazon Cloud Development Kit (Amazon CDK) 开发者指南](https://docs.amazonaws.cn/cdk/v2/guide/)。

  要管理 Amazon CloudFormation 堆栈的部署，我们建议使用持续集成和持续交付 (CI/CD) 工具和服务，例如 Amazon CodePipeline。这些工具可以帮助您在构建游戏服务器二进制文件时自动部署或在获得批准的情况下进行部署。使用 CI/CD 工具或服务，新游戏服务器版本的资源部署可能如下所示：
  + 构建和测试游戏服务器二进制文件。
  + 将二进制文件上传到 Amazon GameLift Servers。
  + 部署具有新生成包的新实例集。
  + 将新实例集添加到游戏会话队列，并删除具有先前生成包版本的实例集。
  + 当之前版本的舰队不再托管活跃的游戏会话时，删除这些舰 Amazon CloudFormation 队的堆栈。