【问题标题】:Azure Service Fabric: Using Reliable collections in ASP.NET Core Stateful Service directlyAzure Service Fabric:直接在 ASP.NET Core 有状态服务中使用可靠集合
【发布时间】:2018-03-11 18:03:01
【问题描述】:

我用两个服务构建了一个 Service Fabric 应用程序:

  1. 有状态的数据服务,将数据存储在可靠的字典中,并公开从字典中添加/删除/获取数据项的方法。
  2. 一种无状态的 Web API 服务,它充当与外界的 HTTP 接口,并使用远程处理与数据服务进行通信以获取数据并显示给用户。

在 Service Fabric 中提供了创建有状态 Web API 服务的规定。我试图摆脱数据服务,只在 Web API 服务中管理可靠的字典。但是,我无法访问控制器中的 StateManager。我无法在网上找到任何这样做的示例。

我对有状态的 ASP.NET Core API 服务的理解是否正确?也就是我可以直接在里面使用可靠的集合?

【问题讨论】:

    标签: asp.net azure-service-fabric


    【解决方案1】:

    是的 - 您可以在 asp.net 服务中使用可靠的集合。此示例与您正在构建的示例相同:https://github.com/Azure-Samples/service-fabric-dotnet-quickstart 它包含一个 asp.net 核心有状态服务。

    主要内容:

    1. 您的服务必须派生自 Microsoft.ServiceFabric.Services.Runtime.StatefulService
    2. 在 serviceListener 中,您设置了一个 ServiceReplicaListener(不是 ServiceInstanceListener)
    3. 在 WebHostbuilder 中添加一个单例 IRealibleStatemanager:.AddSingleton(this.StateManager))

    现在您的控制器将可以访问单例 StateManager:

     public MyDataController(IReliableStateManager stateManager)
        {
           this.stateManager = stateManager;
        }
    

    【讨论】:

      【解决方案2】:

      如果您需要扩展,您还应该考虑分区。 在这种情况下,单独的服务可能会更好。

      (不是真正的答案,但我无法发表评论,因为我低于 50 分:))

      【讨论】:

      • 您的观点有效。一项服务将承担多项职责,我想我也需要考虑一下。谢谢。
      【解决方案3】:

      如果您希望该服务在所有节点上可用,请允许侦听辅助副本。

      protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners(){
          return new ServiceReplicaListener[]{
              new ServiceReplicaListener(serviceContext =>
                  new KestrelCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) => {
                      EventTracer.Current.LogSystemMessage(serviceContext, $"Starting http kestrel listner on {url}");
                      return new WebHostBuilder()
                          .UseKestrel()
                          .ConfigureServices(
                               services => services
                               .AddSingleton<StatefulServiceContext>(serviceContext)
                               .AddSingleton<IReliableStateManager>(this.StateManager))
                           .UseContentRoot(Directory.GetCurrentDirectory())
                           .UseStartup<Startup>()
                           .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                           .UseUrls(url)
                           .Build();
                  }),"WebService",listenOnSecondary:true)
      
          };
      }
      

      【讨论】:

        猜你喜欢
        • 2018-09-23
        • 2016-07-23
        • 2016-12-13
        • 2017-12-01
        • 2017-12-08
        • 2016-08-09
        • 2018-09-15
        • 2017-06-22
        • 2016-04-30
        相关资源
        最近更新 更多