我的目标是运行多个应用程序,并将某些元数据嵌入到应用程序/服务中,以便我可以使用元数据查询应用程序/服务。这可能吗?
我正在看下面的帖子,答案暗示了这种可能性,但是没有关于如何获得结果的具体细节。
您获得的“元数据”的主要部分是服务/应用程序实例名称。这就是我在另一篇文章中谈到的。工作方式是通过创建每个服务/应用程序实例的名称来包含客户端在解析它们时可以使用的一些信息。然后,客户端可以在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();
地址解析部分还有更多内容(请参阅此处),但这是一般的想法。
应用程序实例还允许您设置可在创建时为每个实例设置的自定义应用程序参数(键-值对)。它们不会显示在应用程序名称中,但是当您向Service Fabric询问正在运行的应用程序实例的列表时,您会获得该信息。当客户端需要决定要连接到哪个应用程序时,也可以将其用作元数据。
更新:有关应用程序实例参数的更多信息:
当你创建一个新的应用程序实例,您可以在提供一组键-值对应用程序描述。然后,当您查询Service Fabric的应用程序实例时,您将获得具有所述参数的应用程序结果对象的列表。这也会显示在Visual Studio的应用程序项目中,在该项目中具有特定于环境的应用程序参数文件。Visual Studio在创建应用程序实例时从XML文件中提取这些键值对,并在应用程序描述中使用它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句