簡體   English   中英

Service Fabric中無狀態服務的服務解析器

[英]Service Resolver for Stateless Services in Service Fabric

每當嘗試解析無狀態服務的端點時,我似乎總是會收到“找不到服務”的消息。 我嘗試使用服務分區解析器和服務代理,但是它們都產生相同的結果。 Service Fabric是否受到限制?或者我是否誤解了應如何使用無狀態服務? 我找不到任何說明這兩種方式的文檔。

詳細說明我正在嘗試做的事情。 我正在構建一個Api網關。 Api網關由RegistryService和RoutingService組成。

我有多個服務結構應用程序,其中一些具有使用WebApi和Owin的“前端”無狀態服務。 在啟動時,這些服務將其路由注冊到RegistryService。

網關使用Registryservices確定將請求定向到的服務。 在這一點上,我正在嘗試解析所述服務的端點,但未能解決。 但是,如果我將路由更改為有狀態的后端服務,則可以正常工作。

任何想法都將非常有幫助

您可以運行此代碼來發現群集中運行的服務的所有端點。 使用此功能,您可以通過查找服務的名稱和分區策略來查找如何與服務對話。

            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群集可修復它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM