我目前在Azure云服务上运行游戏服务器后端服务,并希望将其移植到Service Fabric上运行。我遇到了一个我似乎无法解决的问题。
在后端的旧Cloud Service版本中,我们可以使用以下内容直接从我们的游戏客户端连接到特定的辅助角色:
<InstanceInputEndpoint name="GameServer" protocol="udp" localPort="10000">
<AllocatePublicPortFrom>
<FixedPortRange min="10000" max="10999" />
</AllocatePublicPortFrom>
</InstanceInputEndpoint>
RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["GameServer"].IPEndpoint;
var publicAddress = IPAddress.Parse(RoleEnvironment.GetConfigurationSettingValue("PublicAddress"));
var publicPort = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["GameServer"].PublicIPEndpoint.Port;
return new IPEndPoint(publicAddress, publicPort);
我目前的问题很简单,我认为服务架构无法复制此设置,基本上是让我告诉客户端&#34;直接连接到我的游戏服务器服务的特定实例&#34;。
答案 0 :(得分:2)
由于您尝试将现有应用程序迁移到服务结构,因此可以按照下述步骤进行操作。但是,如果要创建新应用程序,则应考虑使用reverse proxy。
配置ServiceManifest.xml和clustermanifest。 在ServiceManifest.xml文件中,您必须在resouces标记中创建端点。请注意,此处不支持udp作为标准协议,但仅支持http,https和tcp。通过不提供端口号,Service Fabric将自动从可用的应用程序端口分配可用端口。
<Endpoints>
<Endpoint Name="GameServer" Protocol="http" />
</Endpoints>
应用程序端口在nodetypes下的群集清单中配置:
"applicationPorts": {
"startPort": "10000",
"endPort": "10999"
}
创建收听地址。为了获取侦听器的端口号,您可以使用服务上下文:
int port = Context.CodePackageActivationContext.GetEndpoint("GameServer").Port;
您可以使用以下格式创建收听地址:
string listeningAddress = $"http://+:{port}/{applicationName}/";
这假设您正在使用无状态服务。如果您使用的是有状态服务,则应添加:
StatefulServiceContext ssc = (StatefulServiceContext) Context;
listeningAddress += ssc.PartitionId + "/" + ssc.ReplicaId + "/";
您的发布地址应包含您的套接字协议和IP地址:
string publishAddress = listeningAddress.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
publishAddress = publishAddress.Replace("http", "ws");
您可以在microsoft website上找到有关听众的更多信息。