使用Service Fabric应用程序/服务嵌入自定义元数据

时间:2016-06-08 05:19:56

标签: azure-service-fabric

我的目标是运行多个应用程序,其中一些元数据嵌入到应用程序/服务中,以便我可以使用元数据查询应用程序/服务。这可能吗?

我正在查看以下post,答案暗示了这种可能性,但没有具体细节如何实现结果。

1 个答案:

答案 0 :(得分:2)

"元数据的主要部分"你得到的是服务/应用程序实例名称。这就是我在其他post中谈到的内容。可行的方法是创建每个服务/应用程序实例,其名称包含客户端在解析它们时可以使用的一些信息。然后,客户端可以查询Service Fabric以查找指定的应用程序/服务实例并连接到特定的实例。服务/应用程序实例名称是URI,因此您可以使用路径层次结构对信息进行分类。

继续音频/视频示例:让我们扩展该示例,以便我们拥有一个可以针对音频或视频的特定媒体格式执行特定任务的应用程序。任务+媒体格式的每种组合都是一个唯一的命名服务实例,从而产生如下所示的部署:

Application:
fabric:/avapp
  Services:
  fabric:/avapp/video/encoding/mp4
  fabric:/avapp/video/encoding/h264
  fabric:/avapp/video/captioning/english
  fabric:/avapp/video/captioning/czech
  fabric:/avapp/audio/encoding/aac
  fabric:/avapp/audio/encoding/mp3
  etc.

现在,客户可以查询Service Fabric以了解可用的服务:

FabricClient fabricClient = new FabricClient();

System.Fabric.Query.ServiceList services = await fabricClient.QueryManager.GetServiceListAsync(new Uri("fabric:/avapp"));

然后您可以使用LINQ查询服务列表。例如,如果我想查看所有进行视频编码的服务:

services.Where(x => x.ServiceName.AbsolutePath.Contains("video/encoding"));

然后您可以解析特定服务的地址以连接到它:

ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();
ResolvedServicePartition servicePartition = await resolver.ResolveAsync(new Uri("fabric:/avapp/video/encoding/h264"), new ServicePartitionKey(1), cancellationToken);
ResolvedServiceEndpoint endpoint = servicePartition.GetEndpoint();

地址解析部分(see here)还有一点,但这是一般的想法。

应用程序实例还允许您设置可在创建时为每个实例设置的自定义应用程序参数(键值对)。它们不会显示在应用程序名称中,但是当您向Service Fabric请求正在运行的应用程序实例列表时,您会收到该信息。当客户需要决定连接哪个应用程序时,它也可能被客户端用作元数据。

更新:有关应用程序实例参数的更多信息:

当您create a new application instance时,您可以在application description中提供一组键值对。然后当你query Service Fabric for application instances时,你会得到一个包含所述参数的Application个结果对象列表。这也显示在Visual Studio中,在您的应用程序项目中,您具有特定于环境的应用程序参数文件。 Visual Studio从XML文件中提取这些键值对,并在创建应用程序实例时在应用程序描述中使用它们。

enter image description here