Service Fabric 中无状态服务的服务解析器

Posted

技术标签:

【中文标题】Service Fabric 中无状态服务的服务解析器【英文标题】:Service Resolver for Stateless Services in Service Fabric 【发布时间】:2017-03-07 23:46:46 【问题描述】:

每当我尝试解析无状态服务的端点时,我似乎不断收到“未找到服务”。我曾尝试使用服务分区解析器和服务代理,但它们都产生相同的结果。 Service Fabric 是否有限制,或者我是否误解了应该如何使用无状态服务?我找不到任何说明任何一种方式的文档。

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

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

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

任何想法都会很有帮助

【问题讨论】:

首先要检查的是您使用了正确的服务名称(fabric:/yourapp/yourservice)。第二件事是分区类型。无状态服务通常使用 Singleton 分区方案创建,因此请确保 ResolveAsync() 请求相同的分区方案。您说当您切换到有状态服务时它可以工作的事实让我认为您在调用 ResolveAsync 时传递了一个 Int64 分区键。 感谢@VaclavTurecek。我在为无状态分配单例和用于有状态服务的 int64 分区键中有一个案例语句。在过去的两天里,我已经检查了很多东西。以 3/4 种不同的方式重写中间件。 我使用的是默认解析器。这有关系吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

所以对于其他来这里的人。似乎这不是问题。重置 SF 集群修复了它。

【讨论】:

以上是关于Service Fabric 中无状态服务的服务解析器的主要内容,如果未能解决你的问题,请参考以下文章

单个节点上的 Service Fabric 无状态服务部署

Service Fabric 对无状态服务的远程调用未返回、卡住

是否可以添加或删除 Service Fabric 有状态服务命名分区

在 Service Fabric 无状态服务中配置默认​​异常处理程序

如何访问 Azure Service Fabric 有状态/无状态服务中的 settings.xml?

Service Fabric 无状态服务项目类型中缺少文件嵌套选项