Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure service fabric 在服务启动时获取所有活动服务实例_Azure Service Fabric_Service Discovery - Fatal编程技术网

Azure service fabric 在服务启动时获取所有活动服务实例

Azure service fabric 在服务启动时获取所有活动服务实例,azure-service-fabric,service-discovery,Azure Service Fabric,Service Discovery,我正在Azure服务结构中创建一个无状态服务。然而,一旦服务启动(或在自定义通信侦听器启动时),我需要获取该服务的所有其他实例/分区的地址 我通过创建新的FabricClient并调用FabricClient.QueryManager.GetPartitionListAsync(serviceUri)来实现。但是,我得到的消息服务不存在的FabricServiceNotFoundException。当第一个服务实例开始运行时 我在文档中找不到,所以我的问题是:如何获得在Azure service

我正在Azure服务结构中创建一个无状态服务。然而,一旦服务启动(或在自定义通信侦听器启动时),我需要获取该服务的所有其他实例/分区的地址

我通过创建新的
FabricClient
并调用
FabricClient.QueryManager.GetPartitionListAsync(serviceUri)
来实现。但是,我得到的消息服务不存在的
FabricServiceNotFoundException
。当第一个服务实例开始运行时


我在文档中找不到,所以我的问题是:如何获得在Azure service Fabric中运行的特定服务的所有活动实例的侦听端点地址列表,当该服务的新实例开始运行时?

端点地址实际上位于服务副本和实例上—这些是实际放置在节点上的内容。在调用的中有一个用于此的特殊方法

在Reliable Services SDK(位于Microsoft.ServiceFabric.Services.Client命名空间中)中,我们提供了一个解析器实用程序,使其更容易实现:

ServicePartitionResolver resolver = ServicePartitionResolver.GetDefault();

ResolvedServicePartition partition =
    await resolver.ResolveAsync(new Uri("fabric:/MyApp/MyService"), new ServicePartitionKey(), cancellationToken);
ResolvedServicePartition的Endpoints属性是分区中每个副本/实例的列表。Address属性将包含一个JSON对象,它是一个键值对列表,包含复制副本/实例打开的每个侦听器:

{
  "Endpoints" :
      { "mylistener1" : "some-address" },
      { "mylistener2" : "some-address" }
      ...
}
请记住,复制副本/实例出现的顺序没有保证,因此您可能需要重试几次。此外,复制副本和实例在服务的整个生命周期中会不时移动,因此您需要使列表保持最新。基本上,你不可能一次就得到所有这些信息,因为这是一个非常动态的系统

有关概述,请参见此处:


这里有更详细的信息:

我对StackOverflow的评论还不熟悉,但下面是我如何进行服务解析的。我最终建立了一个小图书馆来管理它

ResolvedServicePartition partition = await fabricClient.ServiceManager.ResolveServicePartitionAsync("fabric:/Application1/Service1");

// This "endpoint" looks something like this: {\"Endpoints\":{\"\":\"http:\/\/localhost:8448\/\"}}
string randomConfigStoreEndpointJson = partition.GetEndpoint().Address;

// Use Newtonsoft.Json to parse this mess, since JavaScriptSerializer isn't up to the job
JObject endpointObject = JObject.Parse(randomConfigStoreEndpointJson);

// This is the only way I could actually extract the baseUrl without regular expressions
string actualEndpointBaseUrl = endpointObject["Endpoints"].First.First.ToString();
@DannyMeister这负责解析奇怪的端点JSON语法


这也可以用来解析只有一个分区的有状态服务。要解析具有多个分区的有状态服务,您必须计算出客户端上的分区密钥,然后调用
wait fabricClient.ServiceManager.ResolveServicePartitionAsync(“结构:/Application1/Service1”,statefulPartitionKey)取而代之

很抱歉,您的解决方案最终也会出现
System.Fabric.FabricServiceNotFoundException
:服务不存在消息。我猜这就是服务结构的工作方式。您在服务生命周期的什么时候尝试获取每个实例或副本的地址?这些信息在互联网站的其他任何地方都找不到……谢谢,序列化奇怪端点json语法的最佳方法是什么?我尝试过的所有linter和解析器都无法验证json。如果端点是一个列表,它实际上应该有方括号。