服务结构:如何使用ServiceFabricIntegrationOptions.UseUniqueServiceUrl调用服务?

时间:2019-01-25 21:48:26

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

我正在尝试通过在有状态服务上使用以下配置,使无状态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 :(得分:0)

通常通过使用Service Fabric Remoting与群集中的有状态服务进行通信。 它使用一个代理对象来处理连接,解析和重试。

Here's a sample project演示了无状态服务与有状态服务的对话。 它使用ServicePartitionKey选择正确的分区,并使用TargetReplicaSelector选择副本。主要用于读取/写入,次要用于读取访问。

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

请注意,您需要根据对服务数据进行分区的方式来创建用于确定要使用的分区键的代码。 更多信息here