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