4

我在 Service Fabric 6 上有一个 Asp.net Core 2.0 无状态服务和一个 Asp.net Core 2.0 有状态服务,分区数为 10。

我跟着这个教程

https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-add-a-web-frontend

我遵循了所有步骤,除了我在 Visual Studio 中使用了 CreateServiceReplicaListeners 使用 KestrelCommunicationListener 的模板

 protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
    {
        return new ServiceReplicaListener[]
        {
            new ServiceReplicaListener(serviceContext =>
                new KestrelCommunicationListener(serviceContext, (url, listener) =>
                {
                    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();
                }))
        };
    }

当我使用以下代码在 Asp.net Core 2.0 Stateless 服务中调用我的服务时:

var service = ServiceProxy.Create<IStorageService>(new Uri("fabric:/MyCluster/Storage"), new ServicePartitionKey(Fnv1aHashCode.Get64bitHashCode(User.Id)));
await service.MyMethod();

调用“MyMethod”时引发异常

客户端正在尝试连接到无效地址http://localhost:58352/etc ..

异常中存在的 url 存在于 Service Fabric Explorer 中,并且 Port 和 PartitionKey 是正确的。ServiceManifest 中没有设置端点,因为有状态服务基本上只是添加了 IService 接口和 MyMethod 方法的模板,如上面的教程。

我在这里缺少什么?Asp.net Core 2.0 的文档不是最新的。

我试图不使用分区,设置 ServicePartitionKey(0)但结果相同。

我不知道该怎么做。

4

1 回答 1

5

您正在混合两个完全不同的通信堆栈:

你不能把两者混在一起。您需要使用 HTTP 客户端与服务的 HTTP 端点通信。Service Fabric 中有一个 HTTP反向代理,它将执行服务发现和请求转发,让您更轻松。还有一个DNS 服务允许您使用简单的 DNS 名称来寻址其他服务。

在您参考的教程中,后端服务使用一个 Service Remoting 侦听器,该侦听器公开一个 RPC 端点以供 ServiceProxy 连接到:

protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new List<ServiceReplicaListener>()
    {
        new ServiceReplicaListener(
            (context) =>
                this.CreateServiceRemotingListener(context))
    };
}
于 2017-10-12T04:37:19.270 回答