Service Fabric 中无状态服务的服务解析器
Service Resolver for Stateless Services in Service Fabric
每当我尝试解析无状态服务的端点时,我似乎总是得到 "Service Not Found"。我尝试过使用服务分区解析器和服务代理,但它们都产生相同的结果。 Service Fabric 是否有限制,或者我误解了应该如何使用无状态服务?我找不到任何说明这两种方式的文档。
详细说明我正在尝试做什么。我正在构建一个 Api 网关。 Api 网关由 RegistryService 和 RoutingService 组成。
我有多个服务结构应用程序,其中一些具有 "front-end" 使用 WebApi 和 Owin 的无状态服务。在启动时,这些服务将它们的路由注册到 RegistryService。
网关使用注册表服务来确定将请求定向到的服务。在这一点上,我试图解决上述服务的端点但未能这样做。但是,如果我将路由更改为有状态的后端服务,它就可以正常工作。
任何想法都会很有帮助
您可以运行此代码来发现集群内运行的所有服务端点。使用它,您可以通过找出服务的名称和分区策略来了解如何与您的服务对话。
var resolver = ServicePartitionResolver.GetDefault();
var fabricClient = new FabricClient();
var apps = fabricClient.QueryManager.GetApplicationListAsync().Result;
foreach (var app in apps)
{
Console.WriteLine($"Discovered application:'{app.ApplicationName}");
var services = fabricClient.QueryManager.GetServiceListAsync(app.ApplicationName).Result;
foreach (var service in services)
{
Console.WriteLine($"Discovered Service:'{service.ServiceName}");
var partitions = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result;
foreach (var partition in partitions)
{
Console.WriteLine($"Discovered Service Partition:'{partition.PartitionInformation.Kind} {partition.PartitionInformation.Id}");
ServicePartitionKey key;
switch (partition.PartitionInformation.Kind)
{
case ServicePartitionKind.Singleton:
key = ServicePartitionKey.Singleton;
break;
case ServicePartitionKind.Int64Range:
var longKey = (Int64RangePartitionInformation)partition.PartitionInformation;
key = new ServicePartitionKey(longKey.LowKey);
break;
case ServicePartitionKind.Named:
var namedKey = (NamedPartitionInformation)partition.PartitionInformation;
key = new ServicePartitionKey(namedKey.Name);
break;
default:
throw new ArgumentOutOfRangeException("partition.PartitionInformation.Kind");
}
var resolved = resolver.ResolveAsync(service.ServiceName, key, CancellationToken.None).Result;
foreach (var endpoint in resolved.Endpoints)
{
Console.WriteLine($"Discovered Service Endpoint:'{endpoint.Address}");
}
}
}
对于来到这里的其他人来说。似乎这不是问题。重置 SF 集群修复了它。
每当我尝试解析无状态服务的端点时,我似乎总是得到 "Service Not Found"。我尝试过使用服务分区解析器和服务代理,但它们都产生相同的结果。 Service Fabric 是否有限制,或者我误解了应该如何使用无状态服务?我找不到任何说明这两种方式的文档。
详细说明我正在尝试做什么。我正在构建一个 Api 网关。 Api 网关由 RegistryService 和 RoutingService 组成。
我有多个服务结构应用程序,其中一些具有 "front-end" 使用 WebApi 和 Owin 的无状态服务。在启动时,这些服务将它们的路由注册到 RegistryService。
网关使用注册表服务来确定将请求定向到的服务。在这一点上,我试图解决上述服务的端点但未能这样做。但是,如果我将路由更改为有状态的后端服务,它就可以正常工作。
任何想法都会很有帮助
您可以运行此代码来发现集群内运行的所有服务端点。使用它,您可以通过找出服务的名称和分区策略来了解如何与您的服务对话。
var resolver = ServicePartitionResolver.GetDefault();
var fabricClient = new FabricClient();
var apps = fabricClient.QueryManager.GetApplicationListAsync().Result;
foreach (var app in apps)
{
Console.WriteLine($"Discovered application:'{app.ApplicationName}");
var services = fabricClient.QueryManager.GetServiceListAsync(app.ApplicationName).Result;
foreach (var service in services)
{
Console.WriteLine($"Discovered Service:'{service.ServiceName}");
var partitions = fabricClient.QueryManager.GetPartitionListAsync(service.ServiceName).Result;
foreach (var partition in partitions)
{
Console.WriteLine($"Discovered Service Partition:'{partition.PartitionInformation.Kind} {partition.PartitionInformation.Id}");
ServicePartitionKey key;
switch (partition.PartitionInformation.Kind)
{
case ServicePartitionKind.Singleton:
key = ServicePartitionKey.Singleton;
break;
case ServicePartitionKind.Int64Range:
var longKey = (Int64RangePartitionInformation)partition.PartitionInformation;
key = new ServicePartitionKey(longKey.LowKey);
break;
case ServicePartitionKind.Named:
var namedKey = (NamedPartitionInformation)partition.PartitionInformation;
key = new ServicePartitionKey(namedKey.Name);
break;
default:
throw new ArgumentOutOfRangeException("partition.PartitionInformation.Kind");
}
var resolved = resolver.ResolveAsync(service.ServiceName, key, CancellationToken.None).Result;
foreach (var endpoint in resolved.Endpoints)
{
Console.WriteLine($"Discovered Service Endpoint:'{endpoint.Address}");
}
}
}
对于来到这里的其他人来说。似乎这不是问题。重置 SF 集群修复了它。