2017-09-29 27 views
0

我建立了一個服務光纖應用有兩個服務:Azure的服務織物:在ASP.NET核心狀態服務使用可靠的集合直接

    ,在一個可靠的字典中存儲的數據和公開方法來添加
  1. 全狀態數據服務/從字典中刪除/獲取數據項。
  2. 無狀態的Web API服務,作用於外部世界的HTTP接口,並使用遠程處理與數據服務進行通信以獲取數據並向用戶顯示。

有一項規定可以在Service Fabric中創建有狀態的Web API服務。我試圖擺脫數據服務,只管理Web API服務中的可靠字典。但是,我無法訪問我的控制器中的StateManager。我無法在網上找到任何樣品。

我的理解對有狀態的ASP.NET Core API服務是否正確?也就是說,我可以直接在其中使用可靠的集合?

回答

2

是的 - 你可以在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))

現在您的控制器將有權訪問單身StateMana ger:

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

如果需要縮放,還應該考慮分區。 在這種情況下,單獨的服務可能會更好。

(不是一個真正的答案,但我無法評論,因爲我在50點:))如果您希望該服務適用於所有節點允許監聽輔助副本

+0

您的觀點是有效的。一項服務將承擔多重責任,我想我也需要考慮。謝謝。 – vmn

1

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) 

    }; 
} 
相關問題