【问题标题】:Azure Service Fabric - different publish settings for different environmentsAzure Service Fabric - 针对不同环境的不同发布设置
【发布时间】:2021-03-10 12:03:58
【问题描述】:

这似乎是一个简单的问题,但我仍然没有找到答案,尽管我花了很多时间阅读互联网上的文档和相关文章。我有一个 SF 应用程序,其中包含多个服务,我希望能够(从 Visual Studio)为不同的环境打包:dev、test、prod。这些环境需要不同的设置,例如应用程序将运行的用户、到数据库的连接字符串等。我已经设法使用 Start-ServiceFabricApplicationUpgrade 命令更改特定集群上的环境变量,但这样我不能设置我需要的一切,无论如何我更希望在应用程序包中拥有我需要的所有配置。我该怎么办?在重要的情况下,我使用 Windows 独立集群(开发环境除外,它是本地开发集群)。

【问题讨论】:

    标签: visual-studio azure-service-fabric


    【解决方案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

    有一个部分&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 中的滚动升级策略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 2018-10-26
    • 2019-04-23
    • 1970-01-01
    • 2017-06-26
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多