服务结构中无状态服务的服务解析器

时间:2016-10-25 19:34:40

标签: c# asp.net-web-api service azure-service-fabric service-fabric-stateful

我似乎一直在"服务未找到"每当我尝试为无状态服务解析端点时。我已经尝试使用服务分区解析器和服务代理,但它们都产生相同的结果。是否对Service Fabric有限制,或者我误解了应该如何使用无状态服务?我找不到任何文件说明。

详细说明我试图做的事情。我正在构建一个Api网关。 Api网关由RegistryService和RoutingService组成。

我有多个服务架构应用程序,其中一些有"前端"使用WebApi和Owin的无状态服务。在启动时,这些服务将其路由注册到RegistryService。

网关使用Registryservices来确定将请求定向到的服务。此时我正在尝试解决所述服务的端点但未能这样做。但是,如果我将路由更改为有状态后端服务,则可以正常工作。

任何想法都会非常有用

2 个答案:

答案 0 :(得分:7)

您可以运行此代码以发现在群集内运行的所有服务端点。使用此功能,您可以通过查找服务的名称和分区策略来了解如何与您的服务进行通信。

            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}");
                        }
                    }
                }

答案 1 :(得分:0)

所以对于那些来这里的人来说。似乎这不是一个问题。重置SF群集修复了它。