在运行时

时间:2017-02-22 23:32:36

标签: azure-service-fabric

是否可以在运行时将服务实例ID(int值)传递给guest虚拟机可执行文件?我查看了<ExeHost><Arguments>,但它只对预先提供的静态数据有用。

2 个答案:

答案 0 :(得分:2)

环境变量提供服务包实例ID ,它与实例/副本ID不同。一般而言,SF的环境变量可以使用FabricRuntime提供相同的可用信息,即节点上下文和代码包激活上下文。在本机SF服务中,实例ID在运行时由Fabric(在ServiceContext类中)提供,因为单个进程可以托管多个分区和实例/副本。

在不使用SF API的guest虚拟机可执行文件中,唯一的选项AFAIK是在单独的可执行文件中查询Fabric以获取此信息,将其作为SetupEntryPoint运行(每次在guest虚拟机可执行文件之前运行) )并将信息写入文件。

例如(将代码编译为GetFabricData.exe并将其添加到代码包中):

private static async Task MainAsync(string[] args)
{
    var serviceTypeName = args.FirstOrDefault();
    if (string.IsNullOrEmpty(serviceTypeName)) throw new ArgumentNullException(nameof(serviceTypeName));

    using (var client = new FabricClient())
    {
        var activationContext = FabricRuntime.GetActivationContext();
        var nodeContext = FabricRuntime.GetNodeContext();
        var nodeName = nodeContext.NodeName;
        var applicationName = new Uri(activationContext.ApplicationName);

        var replicas = await client.QueryManager.GetDeployedReplicaListAsync(nodeName, applicationName);
        // usually taking the first may not be correct
        // but in a guest executable it's unlikely there would be multiple partitions/instances
        var instance = replicas.OfType<DeployedStatelessServiceInstance>()
            .FirstOrDefault(c => c.ServiceTypeName == serviceTypeName);

        if (instance == null)
        {
            throw new InvalidOperationException($"Unable to find a service instance for {serviceTypeName}");
        }

        File.WriteAllText("FabricData", instance.InstanceId.ToString());
    }
}

在服务清单中:

<SetupEntryPoint>
  <ExeHost>
    <Program>GetFabricData.exe</Program>
    <Arguments>Guest1Type</Arguments>
  </ExeHost>
</SetupEntryPoint>

然后,guest虚拟机可执行文件可以只读取FabricData文件。

答案 1 :(得分:1)

它在环境变量中可用。请参阅此处以获取服务可用的环境变量的完整列表:https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-manage-multiple-environment-app-configuration

请注意,您要求的 Fabric_ServicePackageInstanceId 通常仅供内部使用,并且它标识整个服务包。这意味着如果您的服务包中有多个代码包(可执行文件),它们将获得相同的ID。