【问题标题】:Get the port assigned to the current service in Service Fabric获取分配给 Service Fabric 中当前服务的端口
【发布时间】:2018-05-25 13:49:42
【问题描述】:

如果您创建一个新的 Service Fabric Web Api 应用程序,PackageRoot/ServiceManifest.xml 文件有一个 ServiceManifest/Resource/Endpoints/Endpoint 节点,其属性为 Port。 Service Fabric 使用它来决定托管服务的端口。

但是如果你删除这个属性,Service Fabric 会为你动态选择一个端口。

我正在尝试找到一种方法来在应用程序运行时获取该端口。

我知道我可以向 Service Fabric API 询问我的服务的端点列表,然后通过我当前的节点限制它。这非常接近。但是如果由于某种原因我的服务在同一个节点上托管了两次,那么我将无法知道哪个是“当前”应用程序。

我希望有一种方法不涉及对集群的服务调用。

选择的端口是否存储在我可以访问的地方。 (也许在StatefulServiceContext 中?

【问题讨论】:

    标签: azure-service-fabric service-fabric-on-premises


    【解决方案1】:

    您不能在 1 个应用程序的同一节点上运行同一服务(副本)的多个实例。因此,使用类似于this 的代码,按当前应用程序名称过滤API 查询GetApplicationListAsync。您可以从ServiceContext 获取当前应用程序名称。

    【讨论】:

    • 您确定不能在一个节点上运行多个相同的服务吗?我认为,至少对于无状态服务,你可以。事实上,开发服务器在同一个节点上托管 5 个。 Service Fabric 博客有一篇关于 Citrix 在 10 个节点上托管其身份服务的 100 个实例的帖子:blogs.msdn.microsoft.com/azureservicefabric/2017/12/08/…
    【解决方案2】:

    我想我找到了获得这个值的方法。似乎服务结构为执行过程添加了一堆环境变量。其中一个有端口。

    这段代码给了我我的端口号:

    Environment.GetEnvironmentVariable("FABRIC_ENDPOINT_SERVICEENDPOINT")
    

    需要注意的重要一点是,您用作环境变量查找字符串的值取决于您的应用程序的配置。

    第一部分 (FABRIC_ENDPOINT_) 始终相同。

    但其余的取决于我在问题(ServiceManifest.xml)中提到的配置文件中的值。它必须与 ServiceManifest/Resource/Endpoints/Endpoint Name 属性中的内容匹配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2017-11-14
      • 2019-04-29
      • 2017-10-16
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多