Azure Service Fabric - 针对不同环境的不同发布设置
Posted
技术标签:
【中文标题】Azure Service Fabric - 针对不同环境的不同发布设置【英文标题】:Azure Service Fabric - different publish settings for different environments 【发布时间】:2021-03-10 12:03:58 【问题描述】:这似乎是一个简单的问题,但我仍然没有找到答案,尽管我花了很多时间阅读互联网上的文档和相关文章。我有一个 SF 应用程序,其中包含多个服务,我希望能够(从 Visual Studio)为不同的环境打包:dev、test、prod。这些环境需要不同的设置,例如应用程序将运行的用户、到数据库的连接字符串等。我已经设法使用 Start-ServiceFabricApplicationUpgrade 命令更改特定集群上的环境变量,但这样我不能设置我需要的一切,无论如何我更希望在应用程序包中拥有我需要的所有配置。我该怎么办?在重要的情况下,我使用 Windows 独立集群(开发环境除外,它是本地开发集群)。
【问题讨论】:
【参考方案1】:服务水平
在位于YourService\PackageRoot\ServiceManifest.xml
下的ServiceManifest.xml 中。
您将有一个条目 CodePackage
添加标签 EnvironmentVariables
在它下面加上您想要使用的 EnvironmentVariables 和一个空值。
<CodePackage Name="Code" Version="1.0.0">
<EntryPoint>
<!--...-->
</EntryPoint>
<EnvironmentVariables>
<EnvironmentVariable Name="Connectionstring" Value=""/>
</EnvironmentVariables>
</CodePackage>
要在您的代码中访问它,您可以使用
Environment.GetEnvironmentVariable("Connectionstring", EnvironmentVariableTarget.Process);
应用层
在您的ApplicationManifest.xml
YourApplication\ApplicationPackageRoot\ApplicationManifest.xml
下
有一个部分<Parameters>
为您要在部署时设置的每个值添加一个参数。
<Parameters>
<Parameter Name="Connectionstring" DefaultValue="your connectionstring" />
</Parameters>
在同一个文件(应用程序清单)中有ServiceManifestImport
,您需要为每个服务使用EnvironmentOverrides
扩展它。
<ServiceManifestImport>
<ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
<ConfigOverrides />
<EnvironmentOverrides CodePackageRef="code">
<EnvironmentVariable Name="Connectionstring" Value="[Connectionstring]" />
</EnvironmentOverrides>
</ServiceManifestImport>
方括号中的值,是被<Parameters>
标签中定义的参数替换的值。
环境特定配置
在YourApplication\ApplicationParameters
文件夹下。为每个环境创建一个文件。以Test.xml
为例,并指定一个带有环境值的参数。
<?xml version="1.0" encoding="utf-8"?>
<Application xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Name="fabric:/YourApplication" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<Parameters>
<Parameter Name="Connectionstring" Value="Your test connection string" />
</Parameters>
</Application>
创建设置文件后,您需要创建使用此设置文件的发布配置文件。 Uner YourApplication\PublishProfiles\
为环境创建一个文件。示例Test.xml
<?xml version="1.0" encoding="utf-8"?>
<PublishProfile xmlns="http://schemas.microsoft.com/2015/05/fabrictools">
<ClusterConnectionParameters ConnectionEndpoint="YourEndpoint" />
<!--Reference the settings file-->
<ApplicationParameterFile Path="..\ApplicationParameters\Test.xml" />
<UpgradeDeployment Mode="UnmonitoredAuto" Enabled="true">
<!--Specify additonal upgrade parameters here-->
<Parameters />
</UpgradeDeployment>
</PublishProfile>
完成此操作后,只需使用正确的发布配置文件部署应用程序即可。
【讨论】:
感谢您的详细回答。这种方法是否也适用于必须更改其他设置(除了环境变量)的情况。就像应用程序的 RunAs 用户一样,这在环境之间是不同的。或者在 DEV 上为 Web 应用程序提供 HTTP 端口,为 TEST/PROD 环境提供受证书保护的 HTTPS? 您可以使用resource overrides 来控制端口。尚未尝试过 RunAs 策略。但我猜同样的语法应该可以工作。 我想知道每个服务存在的 PackageRoot\Config\Settings.xml 文件如何集成到上述场景中?他们的目的是什么,他们带来了什么额外的好处? 发件人:docs.microsoft.com/en-us/azure/service-fabric/…:Config 包是 PackageRoot 下 Config 目录的内容,其中包含一组可独立更新和版本化的服务自定义配置设置。 有一个 API 可以访问配置文件:docs.microsoft.com/en-us/dotnet/api/… - 主要好处是它们是版本化的并且遵循 Service Fabric 中的滚动升级策略。以上是关于Azure Service Fabric - 针对不同环境的不同发布设置的主要内容,如果未能解决你的问题,请参考以下文章
Azure Service Fabric:无法运行本地 Service Fabric 群集