

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

# 在集装箱船队中发现集装箱
<a name="containers-discovery"></a>

在一个Amazon GameLift Servers容器队列上，每个实例可以运行多个容器。例如，您可以运行游戏服务器容器组的多个副本。您还可以运行按实例计算的容器组，该容器组提供实例范围的共享服务。

容器发现服务器使您的游戏服务器进程能够发现同一实例上运行的其他容器。然后，容器可以通过实例的本地网络跨容器组定义相互通信。

发现服务器是一种轻量级 HTTP 服务。 Amazon GameLift Servers在每个集装箱舰队实例上本地运行它。该服务为在该实例上运行的每个容器提供以下网络信息：
+ 您在容器组定义中定义的容器名称。
+ 容器的唯一标识符。
+ 实例上容器的本地 IP 地址。
+ 容器组类型，可以是`GAME_SERVER`（游戏服务器容器组的副本）或`PER_INSTANCE`（每个实例的容器组）。

**注意**  
容器发现服务器仅在托管容器舰队上可用。

## 检索容器网络信息
<a name="containers-discovery-retrieve"></a>

您可以通过两种方式检索容器网络信息：使用服务器 SDK 从游戏服务器进程中检索容器网络信息，或者通过直接通过 HTTP 调用发现服务器从任何容器中检索信息。Amazon GameLift Servers

### 使用服务器 SDK 检索容器信息
<a name="containers-discovery-retrieve-sdk"></a>

如果您的游戏服务器进程使用Amazon GameLift Servers服务器 SDK，请调用`ListContainersNetworkInfo()`操作来检索容器网络信息。服务器 SDK 会找到发现服务器并为您发出请求。该操作返回在同一实例上运行的每个容器的网络信息。对于任何其他计算类型，该操作都会返回不支持的计算类型错误。

`ListContainersNetworkInfo()`在服务器 SDK 版本 5.5 或更高版本中可用，适用于以下语言：
+ [ListContainersNetworkInfo()](integration-server-sdk-go-actions.md#integration-server-sdk-go-listcontainersnetworkinfo)（走）
+ [ListContainersNetworkInfo()](integration-server-sdk5-cpp-actions.md#integration-server-sdk5-cpp-listcontainersnetworkinfo)(C\+\+)
+ [ListContainersNetworkInfo()](integration-server-sdk5-csharp-actions.md#integration-server-sdk5-csharp-listcontainersnetworkinfo)(C\#)

该动作也可在虚幻引擎和Unity的Amazon GameLift Servers插件中找到。

### 通过直接调用发现服务器来检索容器信息
<a name="containers-discovery-retrieve-direct"></a>

有些容器不使用服务器 SDK，例如每个实例的容器。这些容器直接通过 HTTP 调用发现服务器。 Amazon GameLift Servers在这些容器中预先设置`GAMELIFT_CONTAINER_DISCOVERY_SERVER_ENDPOINT_V1`环境变量。此变量保存发现服务器的地址，包括 API 版本路径，并且在游戏服务器和每个实例的容器组定义中都设置了该变量。

要检索容器网络信息，`GET`请向此端点发送 HTTP 请求。以下示例使用 `curl`：

```
curl "$GAMELIFT_CONTAINER_DISCOVERY_SERVER_ENDPOINT_V1"
```

发现服务器返回一个 JSON 数组，实例上运行的每个容器都有一个条目：

```
[
  {
    "containerName": "game-server",
    "ipAddress": "172.17.0.3",
    "containerId": "b896159563df43736e5e93ad0547a24fa572648d55b70c70747642afca398b18",
    "containerGroupType": "GAME_SERVER"
  },
  {
    "containerName": "per-instance",
    "ipAddress": "172.17.0.4",
    "containerId": "3c239ae037aec28bb42212ffa2b9e02524c0c4c361db9bc31dd4c5aecc0b7943",
    "containerGroupType": "PER_INSTANCE"
  }
]
```

## 请求速率限制
<a name="containers-discovery-throttling"></a>

发现服务器将实例上的每个容器限制为每秒 10 个请求。它会限制超过此限制的请求并返回错误。要保持在此限制范围内，请在启动时查询发现服务器一次。或者，仅在需要刷新实例视图时才对其进行查询。将结果缓存在容器中并重复使用缓存的值，而不是重复查询发现服务器。

定期刷新缓存以使其保持最新状态。如果容器崩溃或退出（例如，当其游戏会话结束时），容器的本地 IP 地址可能会发生变化。

## 示例：从游戏服务器容器中收集指标
<a name="containers-discovery-example"></a>

发现服务器的常见用途是在不离开实例的本地网络的情况下在同一实例上的容器之间发送遥测数据。假设一个运行多个游戏服务器容器 (`GAME_SERVER`) 和一个每个实例的容器 (`PER_INSTANCE`) 的队列。每个实例的容器运行一个指标收集器，该实例上的所有游戏服务器都共享该收集器。

您可以使用推模型或拉取模型来实现指标收集：
+ **推送（指标发布）**— 启动时，每个游戏服务器容器都会调用`ListContainersNetworkInfo()`。容器会找到具有`PER_INSTANCE`容器组类型的条目。然后，它会从该条目中读取本地 IP 地址。游戏服务器通过实例的本地网络将其指标直接发送给每个实例的收集器。
+ P@@ **ull（指标抓取）**— 反向方法也适用。每个实例的容器不使用服务器 SDK，因此它会直接调用发现服务器端点。它会查找实例上所有`GAME_SERVER`容器的 IP 地址。然后，它会抓取每个游戏服务器容器通过本地网络公开的指标端点。

在这两种情况下，通信都保持在实例的本地网络上。每个容器仅偶尔查询发现服务器，而不是重复查询。

## 相关主题
<a name="containers-discovery-related"></a>
+ [借助服务器 SDK 将 Amazon GameLift Servers 添加到游戏服务器](gamelift-sdk-server-api.md)
+ [为 Amazon GameLift Servers 容器实例集创建容器组定义](containers-create-groups.md)
+ [自定义 Amazon GameLift Servers 容器实例集](containers-design-fleet.md)
+ [容器是如何工作的 亚马逊 GameLift 服务器](containers-howitworks.md)