【问题标题】:How do I publish multiple instances of an application to Service Fabric cluster from Visual Studio?如何从 Visual Studio 将应用程序的多个实例发布到 Service Fabric 群集?
【发布时间】:2017-06-04 07:32:16
【问题描述】:

我在 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,但是当我使用新的应用程序名称和新的发布配置文件发布时,我只会收到上述错误。

【问题讨论】:

    标签: visual-studio powershell azure azure-service-fabric


    【解决方案1】:

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

    关于应用程序类型和应用程序之间区别的一点背景知识。这有点像编程中类和实例之间的区别。应用程序类型代表应用程序可以是什么。它包含代码、配置和数据。但是应用类型只是一个定义;它不是一个正在运行的应用程序。创建应用程序时,您会根据应用程序类型创建它。现在你有一个正在运行的应用程序。就像编程类比一样,您可以从一种应用类型创建多个应用程序,这就是您正在尝试做的事情。

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

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

    【讨论】:

    • 哇,真快!我有多个客户需要相同的应用程序,但代码略有不同。我对每个都有一个构建配置。所以不可能有两个不同代码包的applicationType实例?
    • 如果你有不同的代码,你需要有不同的应用程序类型。因此,在这种情况下,您可能需要更改应用类型的版本。
    • @MattThalman,您是否有一个示例,说明如何以可以从 PS 脚本调用的方式参数化清单中服务的端口?
    • @MattThalman - 因此,在创建新的应用程序实例时,在 powershell 中是否需要指向包含应用程序包的文件夹?如果是,那么它必须确保具有正确版本的代码..如果不是,在执行您提供的链接的 powershell 命令时应该指向哪个目录?谢谢:)
    猜你喜欢
    • 2017-04-07
    • 2016-11-24
    • 2016-12-06
    • 2019-03-07
    • 2018-07-03
    • 2018-06-18
    • 2019-06-05
    • 2017-09-03
    • 2018-06-23
    相关资源
    最近更新 更多