使用 Service Fabric application/service 嵌入自定义元数据

Embedding custom metadata with Service Fabric application/service

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

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

您获得的 "metadata" 的主要部分是 service/application 实例名称。这就是我在另一篇 中谈到的内容。工作方式是创建每个 service/application 实例,其名称包含客户端在解析它们时可以使用的一些信息。然后,客户端可以查询 Service Fabric 以获取命名的 application/service 实例并连接到特定实例。 service/application 实例名称是 URI,因此您可以使用路径层次结构对信息进行分类。

继续 audio/video 示例:让我们扩展该示例,这样我们就有了一个可以针对音频或视频的特定媒体格式执行特定任务的应用程序。任务 + 媒体格式的每个组合都是一个唯一的命名服务实例,导致部署看起来像这样:

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 you can supply a set of key-value pairs in the application description. Then when you query Service Fabric for application instances you get back a list of Application 结果对象具有上述参数时。这也显示在您的应用程序项目中的 Visual Studio 中,您在其中具有特定于环境的应用程序参数文件。 Visual Studio 从 XML 文件中提取这些键值对,并在创建应用程序实例时在应用程序描述中使用它们。