Azure Service Fabric:直接在ASP.NET核心状态服务中使用可靠集合

时间:2017-09-29 19:08:35

标签: asp.net azure-service-fabric

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

  1. 有状态数据服务,用于将数据存储在可靠的字典中,并公开从字典中添加/删除/获取数据项的方法。
  2. 无状态Web API服务,它为外部世界提供HTTP接口,并使用远程处理与数据服务进行通信,以获取数据并显示给用户。
  3. 可以在Service Fabric中创建有状态的Web API服务。我试图摆脱数据服务并仅在Web API服务中管理可靠的字典。但是,我无法访问控制器中的 StateManager 。我无法在网上找到任何这样的样本。

    我对有状态的ASP.NET核心API服务的理解是否正确?也就是说,我可以直接在其中使用可靠的集合吗?

3 个答案:

答案 0 :(得分:4)

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

(不是真正的答案,但我不能发表评论,因为我不到50分:))

答案 1 :(得分:3)

是的 - 您可以在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))
  4. 现在您的控制器可以访问单例StateManager:

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

答案 2 :(得分:1)

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

   Path directory = Paths.get("P:\Java\Test\backups\test.zip");
   // path to the world;
   Path world = Paths.get("P:\Java\Test\world");

   [...]

    // Create a map which tells the file system to create a new file if it doesn't exist
    ImmutableMap immutableMap = ImmutableMap.of("create", String.valueOf(Files.notExists(this.directory)));

    // Get a file system provider which is capable of creating a ZIP file
    FileSystemProvider zipProvider = FileSystemProvider.installedProviders().stream()
            .filter(provider -> provider.getScheme().equals("jar")).findFirst().get();

    // Create the file system
    try (FileSystem fs = zipProvider.newFileSystem(this.directory, immutableMap)) {

        try {
            Files.walk(this.world).forEach((Path sourcePath) -> {
                try {
                CopyOption[] option = new CopyOption[] {
                        StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES
                };
                Path destination = this.directory.resolve(this.world.relativize(sourcePath));
                Files.copy(sourcePath, destination,option);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }