

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

# 借助 Amazon GameLift Servers 进行混合托管的开发路线图
<a name="gamelift-roadmap-hybrid"></a>

本路线图将指导您如何为多人游戏开发托管解决方案。Amazon GameLift Servers 提供多个游戏托管选项；有关这些选项的更多信息，请参阅 [Amazon GameLift Servers 游戏托管方案](gamelift-intro-flavors.md)。

混合解决方案使用托管资源的组合，包括由 Amazon GameLift Servers 管理的基于云的资源以及您自己的自管理式托管资源。有关混合托管的更详细讨论，请参阅以下文章：[借助 Amazon GameLift Servers Anywhere 实现混合游戏服务器托管](https://aws.amazon.com/blogs/gametech/hybrid-game-server-hosting-with-amazon-gamelift-anywhere/)。借助 Amazon GameLift Servers，您可以设置一个使用通用组件和流程的混合解决方案，这样就能集中管理全球实例集，并在所有类型的资源之间轻松转移负载。

混合架构包含以下组件：
+ 单个与 Amazon GameLift Servers 的服务器 SDK 集成的游戏服务器生成包，可在所有实例集中部署。
+ 单个与 AWS SDK 集成的游戏客户端和后端服务，用于与 Amazon GameLift Servers 服务交互和请求游戏会话。
+ 一个共享的 Amazon GameLift Servers 队列，用于放置在所有实例集中都有可用游戏服务器和均衡负载的新游戏会话。
+ （可选）与 Anywhere 实例集一起部署的进程管理器代理，用于简化所有实例集中跨计算的服务器进程管理任务。
+ （可选）一个 FlexMatch 对战构建器，用于创建多人对战并为其设置游戏会话。
+ 一个或多个 Amazon GameLift Servers 托管式实例集，使用针对多人游戏托管进行了优化的 Amazon Elastic Compute Cloud（Amazon EC2）实例。
+ 一个或多个 Amazon GameLift Servers Anywhere 实例集，使用您现有的本地或其他托管资源，包括您的配置管理和部署工具。（您可以选择使用 AWS Systems Manager。）

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

**借助 Amazon GameLift Servers 插件快速上手开发**  
如果您正在使用 Unreal Engine 或 Unity 开发项目，请借助 Amazon GameLift Servers 插件开始设置游戏进行托管。使用该插件，您可以将Amazon GameLift Servers SDKs 添加到您的游戏项目中，并使用指导式工作流程来构建混合托管解决方案的简单工作版本，该解决方案包含 Anywhere 队列和托Amazon GameLift Servers管队列。然后，您可以在这些基础上进行构建和按需自定义。

## 步骤 1：让游戏服务器准备好使用 Amazon GameLift Servers
<a name="gamelift-roadmap-hybrid-step1"></a>

为您的游戏服务器添加功能，使其在为托管进行部署时能与 Amazon GameLift Servers 服务进行通信。如果游戏服务器在 Amazon GameLift Servers 托管式实例集或 Anywhere 实例集上运行，则也需要这项功能。
+ **为您的游戏项目获取 Amazon GameLift Servers（版本 5.x）的服务器 SDK。**服务器 SDK 支持 C\$1\$1、C\$1 和 Go 语言。[下载 Amazon GameLift Servers 的服务器 SDK](https://aws.amazon.com/gamelift/servers/getting-started-sdks/)。
+ **修改游戏服务器代码以添加服务器 SDK 功能。**有关指南，请参阅[准备使用 Amazon GameLift Servers 托管游戏](integration-intro.md)。至少执行以下操作：
  + 添加代码以初始化 Amazon GameLift Servers SDK 并与Amazon GameLift Servers服务建立 WebSocket 连接。使用服务器 SDK 操作 `InitSdk()`。在 Anywhere 实例集计算上运行时，加入指定服务器参数的代码。
  + 添加代码，以在服务器进程准备好托管游戏会话时向 Amazon GameLift Servers 服务报告。使用服务器 SDK 操作 `ProcessReady()`。
  + 实现所需的回调函数 `OnProcessTerminate()` 和 `OnStartGameSession()`。借助这些函数，游戏服务器进程可以保持与 Amazon GameLift Servers 服务的连接、在 Amazon GameLift Servers 提示时启动游戏会话，以及响应结束游戏服务器进程的提示。
  + 添加代码，以在服务器进程结束游戏会话时向 Amazon GameLift Servers 服务报告。使用服务器 SDK 操作 `ProcessEnding()`。
+ **打包游戏服务器生成包。**使用生成包文件、依赖项和支持软件创建安装脚本。请参阅[打包游戏生成包文件](gamelift-build-packaging.md)。我们建议使用 Amazon Simple Storage Service（Amazon S3）存储桶来存储游戏生成包的版本。
+ **测试游戏服务器集成。**对于这项任务，我们建议为本地工作站设置 Amazon GameLift Servers Anywhere 实例集，如[使用 Amazon GameLift Servers Anywhere 设置本地测试](integration-testing.md)中所述。在此步骤中，手动将游戏服务器生成包安装到测试设备上，然后启动服务器进程。使用 AWS CLI 请求一个新的游戏会话，并验证 Amazon GameLift Servers 服务是否成功提示您的服务器进程启动游戏会话。

## 步骤 2：让游戏客户端准备好加入托管的游戏会话
<a name="gamelift-roadmap-hybrid-step2"></a>

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

    调用 `CreateGameSession()` 是请求新游戏会话的一个方便的入手点。在部署游戏会话放置系统（请参阅“步骤 3”）后，您需要将此代码替换为对 `StartGameSessionPlacement()`（如果您使用的是 FlexMatch，则为 `StartMatchmaking()`）的调用。

    有关设计后端服务的指导，请参阅[为 Amazon GameLift Servers 构建后端服务](gamelift_quickstart_customservers_designbackend.md)。
+ **向游戏客户端添加允许玩家加入托管游戏会话的功能。**游戏客户端将向您的后端服务发出请求，而不是直接向 Amazon GameLift Servers 发出请求。在后端服务提供游戏会话连接信息后，游戏客户端会直接连接到游戏会话来玩游戏。
+ **测试游戏客户端集成。**您可将同一 Amazon GameLift Servers Anywhere 实例集与本地工作站搭配使用以进行测试。

  在开发阶段，如果您想测试您的游戏生成包在 Amazon GameLift Servers 托管式实例集中的行为方式，我们建议您还设置一个[基于云的测试环境](integration-dev-iteration-cloud.md)。此 Amazon GameLift Servers Toolkit 解决方案可模拟托管式实例集的行为，而且让您能够以最短的周转时间更新游戏服务器生成包。

## 步骤 3：设置游戏会话放置
<a name="gamelift-roadmap-hybrid-step3"></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.aws.amazon.com/gameliftservers/latest/flexmatchguide/match-intro.html)》。

## 步骤 4：设置 Anywhere 实例集和 Amazon GameLift Servers 代理
<a name="gamelift-roadmap-hybrid-step4"></a>

到目前为止，您一直在使用本地设备（注册为 Anywhere 实例集计算）来测试和迭代游戏组件。下一步是设置生产系统所需的实例集类型。首先配置一个 Anywhere 实例集，然后添加 Amazon GameLift Servers 代理来管理一些关键的计算主机管理任务。有关更多详细信息，请参阅[使用 Amazon GameLift Servers 代理](integration-dev-iteration-agent.md)。
+ **获取 Amazon GameLift Servers 代理并将其添加到游戏服务器安装包。**获取并构建 Agent 源代码，该源代码可在[Amazon GameLift Servers代理 GitHub 存储库](https://github.com/aws/amazon-gamelift-agent)中找到。将生成的 JAR 文件可执行文件放在与游戏生成包可执行文件相同的目录中。
+ **根据需要修改代理的启动脚本。**确保在计算开始运行后立即启动代理可执行文件。如需获取在托管计算上安装和运行代理方面的帮助，请参阅代理存储库中的自述文件。您的启动命令应包括至少指定 Anywhere 队列 ID AWS 区域、自定义位置和计算名称的选项。

  代理会自动为您处理以下任务，因此，如果您一直使用脚本处理这些任务，则可以将脚本删除：
  + 调用 `RegisterCompute()`，将计算添加到 Anywhere 实例集。
  + 调用 `GetComputeAuthToken()`，在游戏服务器连接到 Amazon GameLift Servers 服务时对该服务器进行身份验证。代理负责管理身份验证令牌的获取和刷新，在计算上运行的所有游戏服务器进程都可以使用该令牌。
  + 根据一组运行时指令在计算上启动新的服务器进程。
+ **为 Anywhere 实例集中的计算创建运行时配置。**至少为游戏服务器可执行文件指定启动路径。您可以使用Amazon GameLift Servers控制台或 AWS CLI 来创建或修改队列的运行时指令。代理将执行这些指令并定期从 Amazon GameLift Servers 服务请求更新。
+ **根据需要设置或修改游戏会话队列。**创建新队列（或更新现有队列），并为随 Amazon GameLift Servers 代理部署的 Anywhere 实例集指定目标。
+ **测试代理与 Anywhere 实例集的集成。**检查代理是否根据运行时配置正确启动服务器进程。

## 步骤 5：创建基于云的托管式实例集
<a name="gamelift-roadmap-hybrid-step5"></a>

创建 Amazon GameLift Servers 托管式 EC2 实例集，以补充您的 Anywhere 实例集。如果您在步骤 2 中设置了基于云的测试环境以加快开发速度，请计划在完成大部分游戏开发和测试后创建托管式实例集。您需要一个完全托管式实例集来配置和测试其他设置，如自动容量扩展。
+ **打包游戏服务器生成包并上传到 Amazon GameLift Servers。**使用生成包文件、依赖项和支持软件创建安装脚本。您可以对 Anywhere 和托管式实例集使用相同的生成包软件。请参阅[为 Amazon GameLift Servers 创建游戏服务器生成包](gamelift-build-cli-uploading.md)。您可以使用控制台或 AWS CLI 将您的版本上传到Amazon GameLift Servers。

  在上传生成包之前，请确定要在哪个 AWS 区域 中创建托管式实例集。您必须将生成包上传到同一区域。有关选择实例集位置的更多信息，请参阅[地理位置](gamelift-compute.md#gamelift-compute-location)。
+ **创建托管式 EC2 实例集。**您可以使用Amazon GameLift Servers控制台或 AWS CLI 创建托管队列。创建实例集时，Amazon GameLift Servers 会立即开始部署游戏服务器生成包进行托管。您可以配置托管式实例集的许多方面。有关指南，请参阅[创建Amazon GameLift Servers托管 EC2 舰队](fleets-creating.md)。至少执行以下操作：
  + 为实例集命名并指定要部署的已上传游戏生成包。
  + 为实例集选择按需型实例，并选择在实例集所在位置可用的实例类型。竞价型实例集是一个很有价值的选择，但需要额外的设计和配置。
  + 使用与 Anywhere 实例集相似的设置创建运行时配置。至少为游戏服务器可执行文件指定启动路径。
  + 指定端口设置以允许入站流量访问游戏服务器。
+ **将托管式实例集添加到共享游戏会话队列。**更新步骤 4 中的队列，使其包含一些针对托管式实例集和随 Amazon GameLift Servers 代理部署的 Anywhere 实例集的目标。
+ **使用托管式实例集测试游戏托管。**此时，您应该能够测试整个托管周期，即游戏客户端请求游戏会话、获取连接信息和成功连接到游戏会话。

## 步骤 6：自定义实例集
<a name="gamelift-roadmap-hybrid-step6"></a>

在为游戏发布做准备时，您需要对托管解决方案进行微调。需要考虑的决策包括：
+ 对于 Anywhere 实例集，根据需要自动启动和关闭计算，包括安装和运行游戏服务器软件。回收计算有助于确保计算定期更新，而关闭不需要的计算则可以节约成本。
+ 如果您的游戏服务器需要与其他 AWS 资源通信，请设置 IAM 角色来管理访问。请参阅[将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](gamelift-sdk-server-resources.md)。
+ 确定要将游戏服务器放置在哪个地理位置。将偏远位置添加到您的托管式实例集。请参阅[托管资源自定义](fleets-design.md)。
+ 对于托管式实例集，考虑使用竞价型实例集来节省成本。请参阅[借助竞价型实例集降低游戏托管成本](fleets-spot.md)。
+ 通过选择计算资源配置来优化实例集性能，然后配置运行时指令，使每个计算运行最优数量的服务器进程。请对 Anywhere 实例集和托管式实例集执行此操作。请参阅[在托管式 Amazon GameLift Servers 上优化游戏服务器运行时配置](fleets-multiprocess.md)。
+ 试验适用于托管式实例集的游戏会话放置选项，包括自定义优先级设置。请参阅[自定义游戏会话队列](queues-design.md)。
+ 对于托管式实例集，设置自动容量扩展以满足预期的玩家需求。请参阅[利用 Amazon GameLift Servers 扩展游戏托管容量](fleets-manage-capacity.md)。
+ 对于 Anywhere 实例集，创建处理手动或自动容量扩展的机制，以满足预期的玩家需求。
+ 根据需要设计并实施到其他资源的失效转移。在其他 AWS 区域 中设置备用实例集，并修改队列和自动扩缩，以便在需要时处理失效转移。
+ 设置托管可观测性工具，包括分析和日志记录。请参阅[监控 Amazon GameLift Servers](monitoring-overview.md)。创建指标组以汇总所有托管资源的分析。
+ 使用[基础设施即代码（IaC）](https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/infrastructure-as-code.html)自动执行部署。请参阅[使用管理Amazon GameLift Servers托管资源 CloudFormation](resources-cloudformation.md)。

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

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