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.xmlYourApplication\ApplicationPackageRoot\ApplicationManifest.xml

有一个部分&lt;Parameters&gt; 为您要在部署时设置的每个值添加一个参数。

<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>

方括号中的值,是被&lt;Parameters&gt;标签中定义的参数替换的值。

环境特定配置

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

Azure Service Fabric:无法运行本地 Service Fabric 群集

Azure Service Fabric 群集端点不可访问

Azure App Service 与 Azure Service Fabric [关闭]

为 Service Fabric 配置 Azure 部署

Azure Service Fabric