【问题标题】:Connecting directly to a specific instance in service fabric直接连接到服务结构中的特定实例
【发布时间】:2017-10-08 19:09:46
【问题描述】:

我有一个游戏服务器后端服务当前在 Azure 云服务上运行,并希望将其移植到在 Service Fabric 上运行。我遇到了一个我似乎无法解决的问题。

在后端的旧云服务版本中,我们可以使用以下方法直接从游戏客户端连接到特定的工作人员角色:

  1. 使用本地端口和公共端口范围配置 InstanceInputEndPoint

<InstanceInputEndpoint name="GameServer" protocol="udp" localPort="10000"> <AllocatePublicPortFrom> <FixedPortRange min="10000" max="10999" /> </AllocatePublicPortFrom> </InstanceInputEndpoint>

  1. 获取私有 ip:port 以将套接字绑定到 via:

RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["GameServer"].IPEndpoint;

  1. 通过一些额外的配置值来提供云服务的保留 IP 公共 IP 地址,我们还可以计算客户端在分配给游戏服务器实例后应连接到的公共 ip:port。

var publicAddress = IPAddress.Parse(RoleEnvironment.GetConfigurationSettingValue("PublicAddress")); var publicPort = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["GameServer"].PublicIPEndpoint.Port; return new IPEndPoint(publicAddress, publicPort);

我目前的问题只是我认为服务结构无法复制此设置,基本上是让我告诉客户端“直接连接到我的游戏服务器服务的这个特定实例”。

【问题讨论】:

  • 请问您为什么需要/想要这种行为?我们是在谈论无状态服务还是有状态服务?

标签: .net azure azure-service-fabric


【解决方案1】:

由于您正在尝试将现有应用程序迁移到服务结构,因此您可以按照下面描述的步骤进行操作。但是,如果您要创建新应用程序,则应考虑使用 reverse proxy

  1. 配置 ServiceManifest.xml 和 clustermanifest。 在 ServiceManifest.xml 文件中,您必须在资源标签内创建一个端点。注意这里不支持 udp 作为标准协议,只支持 http、https 和 tcp。通过不提供端口号,Service Fabric 将自动从可用应用程序端口中分配一个可用端口。

    <Endpoints>
        <Endpoint Name="GameServer" Protocol="http" />
    </Endpoints>
    

    应用程序端口在节点类型下的集群清单中配置:

    "applicationPorts": {
        "startPort": "10000",
        "endPort": "10999"
    }
    
  2. 创建监听地址。为了获取监听器的端口号,您可以使用服务上下文:

    int port = Context.CodePackageActivationContext.GetEndpoint("GameServer").Port;
    

    您可以使用以下格式创建您的收听地址:

    string listeningAddress = $"http://+:{port}/{applicationName}/";
    

    这是假设您使用的是无状态服务。如果您使用的是有状态服务,您应该添加:

    StatefulServiceContext ssc = (StatefulServiceContext) Context;
    listeningAddress += ssc.PartitionId + "/" + ssc.ReplicaId + "/";
    
  3. 您的发布地址应包含您的套接字协议和 IP 地址:

    string publishAddress = listeningAddress.Replace("+", FabricRuntime.GetNodeContext().IPAddressOrFQDN);
    publishAddress = publishAddress.Replace("http", "ws");
    

您可以在microsoft website 上找到有关听众的更多信息。

【讨论】:

  • 这正是我要找的@Wouter B...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多