

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 探索容器機群上的容器
<a name="containers-discovery"></a>

在Amazon GameLift Servers容器機群上，每個執行個體都可以執行多個容器。例如，您可以執行遊戲伺服器容器群組的多個複本。您也可以執行每個執行個體容器群組，提供共用的全執行個體服務。

容器探索伺服器可讓您的遊戲伺服器程序探索在相同執行個體上執行的其他容器。然後，容器可以透過執行個體的本機網路，跨容器群組定義彼此通訊。

探索伺服器是一種輕量型 HTTP 服務。 Amazon GameLift Servers 會在本機在每個容器機群執行個體上執行。服務會針對在該執行個體上執行的每個容器提供下列網路資訊：
+ 您在容器群組定義中定義的容器名稱。
+ 容器的唯一識別符。
+ 執行個體上的容器本機 IP 地址。
+ 容器群組類型 `GAME_SERVER`（遊戲伺服器容器群組的複本） 或 `PER_INSTANCE`（每個執行個體容器群組）。

**注意**  
容器探索伺服器僅適用於受管容器機群。

## 擷取容器網路資訊
<a name="containers-discovery-retrieve"></a>

您可以透過兩種方式擷取容器網路資訊：從使用Amazon GameLift Servers伺服器 SDK 的遊戲伺服器程序，或從任何容器直接透過 HTTP 呼叫探索伺服器。

### 使用伺服器 SDK 擷取容器資訊
<a name="containers-discovery-retrieve-sdk"></a>

如果您的遊戲伺服器程序使用Amazon GameLift Servers伺服器 SDK，請呼叫 `ListContainersNetworkInfo()`動作來擷取容器網路資訊。伺服器開發套件會尋找探索伺服器，並為您提出請求。動作會傳回在相同執行個體上執行之每個容器的網路資訊。在任何其他運算類型上， 動作會傳回不支援的運算類型錯誤。

`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\#)

動作也可在 Unreal Engine 和 Unity 的Amazon GameLift Servers外掛程式中使用。

### 直接呼叫 探索伺服器來擷取容器資訊
<a name="containers-discovery-retrieve-direct"></a>

有些容器不使用伺服器 SDK，例如每個執行個體容器。這些容器會透過 HTTP 直接呼叫探索伺服器。 會在這些容器中Amazon GameLift Servers預先設定 `GAMELIFT_CONTAINER_DISCOVERY_SERVER_ENDPOINT_V1`環境變數。此變數會保留探索伺服器的地址，包括 API 版本路徑，並在遊戲伺服器和每個執行個體容器群組定義中設定。

若要擷取容器網路資訊，請將 HTTP `GET`請求傳送至此端點。以下範例使用 `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>
+ [使用伺服器 SDK 將 Amazon GameLift Servers新增至您的遊戲伺服器](gamelift-sdk-server-api.md)
+ [建立容器機群的Amazon GameLift Servers容器群組定義](containers-create-groups.md)
+ [自訂Amazon GameLift Servers容器機群](containers-design-fleet.md)
+ [容器在 中的運作方式 Amazon GameLift Servers](containers-howitworks.md)