

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

# 在集装箱船队中发现集装箱
<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 地址。游戏服务器通过实例的本地网络将其指标直接发送给每个实例的收集器。
+ **拉取（指标抓取）**——相反的方法也有效。每个实例的容器不使用服务器 SDK，因此它直接调用发现服务器端点。它查找实例上所有`GAME_SERVER`容器的 IP 地址。然后，它抓取每个游戏服务器容器通过本地网络公开的指标端点。

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

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