如何将一个应用程序的多个实例从 Visual Studio 发布到 Service Fabric 群集?

How do I publish multiple instances of an application to Service Fabric cluster from Visual Studio?

我在 visual studio 中创建了一个无状态服务结构应用程序,需要发布它的两个实例。第一个进展顺利,但是当我尝试发布第二个应用程序时出现错误:

2>Application Type  DevelopmentType  and Version  1.0.0  was already registered with Cluster, unregistering it...
2>Unregister-ServiceFabricApplicationType : Application type and version is still in use
2>At C:\Program Files\Microsoft SDKs\Service 
2>Fabric\Tools\PSModule\ServiceFabricSDK\Publish-NewServiceFabricApplication.ps1:224 char:20
2>+             $reg | Unregister-ServiceFabricApplicationType -Force
2>+                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2>    + CategoryInfo          : InvalidOperation: (Microsoft.Servi...usterConnection:ClusterConnection) [Unregister-Serv 
2>   iceFabricApplicationType], FabricException
2>    + FullyQualifiedErrorId : UnregisterApplicationTypeErrorId,Microsoft.ServiceFabric.Powershell.UnregisterApplicatio 
2>   nType
2> 
2>Finished executing script 'Deploy-FabricApplication.ps1'.

我希望实例具有相同的 ApplicationType,但是当我使用新的应用程序名称和新的发布配置文件进行发布时,我只会收到上述错误。

问题是您实质上是在尝试用新应用类型覆盖现有应用类型,但由于现有应用类型有与之关联的应用,您会收到此错误。为了 "overwrite" 应用程序类型,系统需要将其删除并注册新的。但它不能被删除,因为它有一个与之相关联的现有应用程序。这就是您收到此错误的原因。

有关应用程序类型和应用程序之间差异的一些背景知识。这有点像编程中 class 和实例的区别。应用程序类型表示应用程序可以是什么。它包含代码、配置和数据。但是应用程序类型只是一个定义;它不是 运行ning 应用程序。创建应用程序时,您会根据应用程序类型创建它。现在您已经有了一个 运行ning 应用程序。就像编程类比一样,您可以从一种应用程序类型创建多个应用程序,这就是您想要做的。

当您从 VS 部署时,它不知道您想要从集群上现有的应用程序类型创建新应用程序的意图。它假定您要使用您在项目中定义的代码来部署应用程序。由于 VS 不知道该代码与集群上的代码有何不同,它会继续尝试删除任何冲突的应用程序类型(具有相同名称和版本的应用程序类型),以便使用以下代码注册新的应用程序类型包含在您的项目中。那就是你 运行 进入错误的时候。

那么你是如何解决这个问题的?如果你的意图真的只是从现有的应用程序类型创建另一个应用程序,两个应用程序之间没有任何代码差异,那么你需要直接从 PowerShell 处理这个而不是使用 VS。您要做的只是集群的基本管理。您需要使用 New-ServiceFabricApplication PowerShell cmdlet(请参阅 https://docs.microsoft.com/en-us/powershell/servicefabric/vlatest/new-servicefabricapplication)。请注意,如果您没有正确配置您的应用程序,您可能 运行 进入两个应用程序之间的端口冲突。为避免这种情况,您需要在应用程序清单中参数化端口,以便在调用 New-ServiceFabricApplication.

时可以提供不同的端口值