Служебная структура: как вызвать службу с помощью ServiceFabricIntegrationOptions.UseUniqueServiceUrl? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь установить связь службы ASP.NET Core без сохранения состояния с базовой службой ASP.NET с поддержкой состояния с помощью следующей конфигурации службы с отслеживанием состояния:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
        {
            return new ServiceReplicaListener[]
            {
                new ServiceReplicaListener(serviceContext =>
                    new KestrelCommunicationListener(serviceContext, (url, listener) =>
                    {
                        ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

                        return new WebHostBuilder()
                            .UseKestrel()
                            .ConfigureServices(
                                services => services
                                    .AddSingleton<StatefulServiceContext>(serviceContext)
                                    .AddSingleton<IReliableStateManager>(this.StateManager))
                            .UseContentRoot(Directory.GetCurrentDirectory())
                            .UseStartup<Startup>()
                            .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.UseUniqueServiceUrl)
                            .UseUrls(url)
                            .Build();
                    }))
            };
        }

Я знаю, как использоватьОбратный прокси-сервер, используя следующий URL http://localhost:19081/App/Service/api/events?PartitionKey=0&PartitionKind=Int64Range, но я не понимаю, как использовать его без обратного прокси-сервера.Если я попытаюсь использовать fabric:/App/Service, как мне указать раздел?Кроме того, я не могу сделать это с классом HttpClient, так как он принимает только HTTP или HTTP.

1 Ответ

0 голосов
/ 28 января 2019

Связь с сервисом с отслеживанием состояния из кластера обычно осуществляется с помощью Service Fabric Remoting . Он использует прокси-объект, который обрабатывает соединения, разрешает и повторяет попытки.

Вот пример проекта , который демонстрирует службу без сохранения состояния, которая взаимодействует со службой с контролем состояния. Он использует ServicePartitionKey для выбора правильного раздела и TargetReplicaSelector для выбора реплики; первичный для чтения / записи или вторичный для доступа для чтения.

long partitionKey = PartitionAddressFromWord(word);
var proxy = _dictionaryServiceProxyFactory.CreateServiceProxy<IDictionaryService>(DictionaryServiceUri, new ServicePartitionKey(partitionKey), TargetReplicaSelector.PrimaryReplica, DictionaryServiceListenerSettings.RemotingListenerName);
return proxy.Lookup(word);

Обратите внимание, что код для определения используемого ключа секционирования - это то, что вам нужно создать на основе способа, которым вы разбили данные сервиса. Подробнее здесь .

...