【问题标题】:Single Service Fabric application referencing multiple external Web API's引用多个外部 Web API 的单个 Service Fabric 应用程序
【发布时间】:2017-10-29 07:27:21
【问题描述】:

我的问题与this question有些相似,但答案对我没有帮助,除非我遗漏了什么。

如果我想将 10 多个无状态服务(基于 OWIN 的 Web API)部署到 Service Fabric 集群中,根据我对 ASF 的理解,我会:

  1. 在 Visual Studio 中创建新的 Service Fabric 应用程序(称为“MyBackendServices”)
  2. 创建 10 多个无状态 Web API
  3. 将它们添加到 Service Fabric 应用程序
  4. 部署到集群。

但这不涉及在与 Service Fabric 应用程序相同的 Visual Studio 解决方案中创建所有 Web API 吗?

我担心的是,如果我们希望团队完全自治,那么理想情况下他们不应该需要共享相同的 Visual Studio 解决方案吗?

目前每个“团队”都有自己的 GitHub 存储库和 Visual Studio 解决方案,每个 API 都独立部署。

我希望将此设置移植到 ASF,其中每个 Web API 都是它自己的解决方案,并且它们以某种方式被打包到一个 Service Fabric 应用程序中。

谁能帮我解决这个问题?

谢谢

【问题讨论】:

  • 您为什么不能将每一个都放在自己的应用程序中?这就是我正在做的事情。似乎工作得很好。
  • @mardoxx 你能详细说明一下吗?您如何决定何时在应用程序中将它们组合在一起?
  • 情况是否需要;)我不完全确定!我想如果您需要一个简单的可部署多租户解决方案,那么您将在一个应用程序中拥有一切。应用的服务可以独立升级,但是每个服务在自己的错误源代码库中独立开发不是很友好。

标签: azure-service-fabric


【解决方案1】:

我将每个服务都保存在自己的解决方案(和存储库)中,并且仅在部署时将它们整合到一个应用程序中。构建和部署通过 PowerShell 进行,可以作为 CI/CD 过程的一部分触发。只有更新的服务被修改,我让它使用当前日期/时间自动更新清单版本。

对于具有其他服务依赖项的服务,我在解决方案中引用了他们的项目,以便我可以轻松调试,但只部署了主服务。

在答案中添加更多细节,评论块太小了。

我创建了一个目录以将发布版本放置在正确的 SF 目录结构中。我将发布的 ApplicationManifest.xml 复制到该目录,尽管您可以将其设为 repo 并仅检查该文件。我有一个 buildrelease.ps1 枚举 repos 并为发布配置运行 msbuild。对于该配置,除了要部署的服务之外,我没有构建任何东西(没有用于调试目的的单元测试或其他测试应用程序)。版本是根据日期和时间自动生成的,例如2017_05_31_1702。这是在服务清单和最终在应用程序清单中更新的内容。成功构建后,服务清单会更新回解决方案目录,如下所示:

    $serviceManifestPath = "$solutionDir\src\${ServiceName}Service\PackageRoot\ServiceManifest.xml"
Set-ItemProperty $serviceManifestPath -name IsReadOnly -value $false

$serviceManifestXml = [xml](Get-Content $serviceManifestPath)
$ns = New-Object System.Xml.XmlNamespaceManager($serviceManifestXml.NameTable)
$ns.AddNamespace("ns", $serviceManifestXml.DocumentElement.NamespaceURI)

$serviceManifestXml.ServiceManifest.Version = $NewVersion
$serviceManifestXml.ServiceManifest.CodePackage.Version = $NewVersion
$serviceManifestXml.ServiceManifest.ConfigPackage.Version = $NewVersion
$serviceManifestXml.Save($serviceManifestPath)

再次调用下一个 msbuild 以打包 SFProj。

$buildResult = & $msBuild $sfproj /p:Configuration=Release /nologo /v:M /fl /flp:LogFile="msbuild.log;Verbosity=Normal" /nr:false /target:package

今天我只构建具有修改的服务清单的服务,因此您必须记住在修改代码/配置时修改清单。我想改进一下,只是时间不够。

打包后,将解决方案的release{service name}Service.pkg复制到release文件夹中。脚本完成后,生成的目录会以正确的格式包含所有更改的服务。

下一个脚本是每个集群的部署脚本。我确信可以创建一个数据驱动的。这将连接到远程集群,测试包,将包上传到图像存储,并根据应用程序是否已经存在进行新的或升级。我有一个可以部署到我的一体机的版本,这样我就可以使用本地配置测试/调试所有一起运行的服务。

【讨论】:

  • 谢谢,这就是我要找的。你有没有机会分享一些关于你如何实现这一点的代码 sn-ps 或文档?您是否有一个仅包含服务结构应用程序清单的存储库/sln?然后您的 CI 将 所有 各种存储库克隆到一个文件夹,然后运行部署脚本,就好像它们总是在一个地方等等?
  • 我真的很想看到你对此的回应,托德
  • 是的,我有一个应用程序包含在一个具有单个 ApplicationManifest 的单个目录结构中。然后我的 CI 脚本将源的 ServiceManifest 与相应发布目录中的当前版本进行比较,如果有任何变化,我会更新清单中所有内容的版本并复制代码、配置和数据。我为版本使用生成日期格式,例如2017-11-13-1700。这是放入清单中的内容。
猜你喜欢
  • 2019-03-28
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2021-09-14
  • 2018-09-12
  • 2018-09-12
  • 2017-09-10
  • 2016-09-11
相关资源
最近更新 更多