调用QueryClient.GetServiceListAsync

时间:2017-02-07 19:15:34

标签: azure-service-fabric

我正在使用Azure Service Fabric和无状态服务。我有一个在应用程序下部署的服务列表,并且有一个与这些服务名称一起使用的命名约定。我想获得一个与过滤表达式匹配的服务列表。

以下链接指向我的服务架构资源管理器的屏幕截图。我没有发布图像的声誉点。

Service Fabric Explorer screenshot

在此示例中,我的应用程序的名称是SFApp1,我的服务名称是HelloWorldStateless。我想查询服务结构集群,找到名为“HelloWorldSt *”的所有服务(当然在SFApp1应用程序下)。

我知道我可以查询以查找应用程序名称为“fabric:/ SFApp1”的所有服务,并且它将返回该应用程序下的所有服务。 GetServiceListAsync的这个重载只需要一个应用程序URI。

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1")).Result;

我也知道我可以查询以查找特定服务。此重载采用应用程序URI和服务URI,并将返回单项列表。

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldStateless")).Result;

我想知道的是,是否有办法做一些像通配符搜索的事情。

FabricClient client = new FabricClient();
ServiceList serviceList = client.QueryManager.GetServiceListAsync(new Uri("fabric:/SFApp1"), new Uri("fabric:/SFApp1/HelloWorldSt*")).Result;

指定服务名称的参数的名称是serviceNameFilter,该方法返回一个列表。我想知道为什么如果结果始终是单项列表,他们会返回此重载的列表。此外,参数名称“serviceNameFilter”建议(至少对我来说)能够提供某种表达式来缩小列表范围。

这是我已经尝试过的。我已经尝试了上面的代码,在那里我砍掉了几个字符并放了一个星号。我试过没有星号,看看它是否是一个子串匹配。我尝试过SQL风格的百分号符号。我试了一个问号。所有这些尝试都返回了一个空列表。

我目前的解决方法只是要求该应用程序下的所有服务,我将使用linq表达式在客户端代码端过滤它们。这可行,但如果我的服务列表变得非常大,我会担心性能。

如果我可以检查源代码来自己回答这个问题会很好。

有没有办法做我正在尝试做的事情,或者我只是误解了“serviceNameFilter”的意思,它只是意味着你必须把你正在寻找的整个服务URI?

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:2)

不幸的是,API参数非常有名。它根本不是一个过滤器,它只是服务的名称(因为没有其他查询只返回一个服务,这就是你如何从应用程序中的所有服务“过滤”到特别是一个)。

最接近您要找的是EnumerateSubnames。它不是通配符搜索,但您可以获取存在于给定名称“下方”的所有名称(例如,应用程序中存在的所有服务名称,或具有某些特定前缀的所有名称)。根据您创建服务名称的结构,这可能对您有用。

for ($row = 1; $row <= 30; $row++) {

}

例如:假设群集中存在以下名称:

  1. 织物:/ SomeApplication / 1区/服务1
  2. 织物:/ SomeApplication / 1区/服务2
  3. 织物:/ SomeApplication / 2区/服务1
  4. 请注意,在这种情况下,应用程序将使用名称“fabric:/ SomeApplication”创建,然后使用上面包含“Zone”段的详细名称的服务创建。

    如果您现在使用EnumerateSubnames(“fabric:/ SomeApplication / Zone1”,null,true),您将获得一个结果,该结果为您提供匹配的全名(上面的1&amp; 2)。