您在哪里为服务结构在每个环境中设置和访问运行时配置参数?


82

对于本地和云这两个环境,我将如何为SQL数据库,存储帐户等资源设置自定义设置或参数...理想情况下,它将是代码中调用的一个参数名称,例如,将DbContext指向特定的数据库中,本地或云环境的配置不同。谢谢。


虽然我希望他们包括了实际利用配置的应用程序代码,微软确实显示出你将它设置在下面的文章:docs.microsoft.com/en-us/azure/service-fabric/...
亚当Plocher

Answers:


144

为了使每个环境变量都可以在本地和云中运行Service Fabric,这是您必须做的:

  1. 将自定义配置部分和参数添加到Service / Actor项目的Settings.xml文件中(从项目根目录位于\ PackageRoot \ Config \ Settings.xml中)。将参数留空,因为我们将在每个环境的其他位置进行设置。这是一个示例。
<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/2011/01/fabric">
<!-- Add your custom configuration sections and parameters here -->
    <Section Name="UserDatabase">
        <Parameter Name="UserDatabaseConnectionString" Value="" />
    </Section>
</Settings>
  1. 在Service Fabric项目的ApplicationManifest.xml文件中<ServiceManifestImport>,每个包含的项目都有元素。在该<ConfigOverrides>元素下面将是一个元素,在该元素中,我们将用Service Fabric项目中ApplicationParameters下的本地和云xml文件中的每个环境设置的值来代替配置的值。在同一ApplicationManifest.xml文件中,您需要添加将在本地和云xml文件中显示的参数,否则它们将在构建时被覆盖。

继续上面的示例,这就是设置方法。

<Parameters>
    <Parameter Name="ServiceName_InstanceCount" DefaultValue="-1" />
    <Parameter Name="UserDatabaseConnectionString" DefaultValue="" />
</Parameters>
<ConfigOverrides>
    <ConfigOverride Name="Config">
        <Settings>
            <Section Name="UserDatabase">
                <Parameter Name="UserDatabaseConnectionString" Value="[UserDatabaseConnectionString]" />
            </Section>
        </Settings>
    </ConfigOverride>
</ConfigOverrides>
  1. 在Service Fabric项目中ApplicationParameters下的local.xml和cloud.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:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="ServiceName_InstanceCount" Value="1" />
        <Parameter Name="UserDatabaseConnectionString" Value="Server=(localdb)\MsSqlLocalDb;Database=Users;User=ReadOnlyUser;Password=XXXXX;" />
    </Parameters>
</Application>
  1. 最后,在Service / Actor中,您可以像这样访问这些每个环境的配置变量。
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];

100
我可以说“糟糕!”。对于基于简单环境的设置,这毫无希望地令人费解。SF团队的一些开发工作已经成熟。
BrettRobi '16

不知道我缺少什么,但是我的上下文没有CodePackageActivationContext。我在无状态服务中看到它在构造函数中传递给OwinCommunicationListener。但我不确定在Actor中该从哪里获得?
史蒂夫(Steve)

7
过早地问。这里的注释:azure.microsoft.com/zh-cn/documentation/articles/…指向使用此代码:CodePackageActivationContext activationContext = FabricRuntime.GetActivationContext();
史蒂夫(Steve)

11
这比实际的文档要好得多,谢谢!还同意这是非常令人费解的...修复此SF团队!
naspinski

2
我遇到的一个问题是这些设置没有被覆盖。您必须定义上面的参数ServiceManifestImport(的子项ApplicationManifest),但必须在其中定义参数ConfigOverrides(的子项ServiceManifestImport)。
Mardoxx

42

您可以像使用其他任何应用程序一样使用环境变量,它也可以与服务结构中的来宾可执行文件一起使用,这与settings.xml需要内置服务结构运行时不同。

在您的应用程序中,您可以通过类GetEnvironmentVariable上的方法像访问其他任何.net应用程序一样访问环境变量Environment

var baseUri = Environment.GetEnvironmentVariable("SuperWebServiceBaseUri");

然后,我们需要设置一些默认的环境变量值,这是在服务的ServiceManifest.xml清单文件中完成的。

<?xml version="1.0" encoding="utf-8" ?>
<ServiceManifest Name="MyServicePkg" Version="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!-- snip -->
    <CodePackage Name="Code" Version="1.0.0">
        <!-- snip -->
        <EnvironmentVariables>
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="http://localhost:12345"/>
        </EnvironmentVariables>
    </CodePackage>
    <!-- snip -->
</ServiceManifest>

然后,可以ApplicationManifest.xml使用以下代码在文件中覆盖这些环境变量:

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <!-- snip -->
    </Parameters>
    <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
        <EnvironmentOverrides CodePackageRef="Code">
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="https://the-real-live-super-base-uri.com/"/>
        </EnvironmentOverrides>
    </ServiceManifestImport>
    <!-- snip -->
</ApplicationManifest>

然后,可以像其他任何应用程序清单设置一样使用local.xml和对其进行参数化cloud.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:/AppFabricName.ServiceFabric" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="MyService_SuperWebServiceBaseUri" Value="https://another-base-uri.com/" />
    </Parameters>
</Application>

然后,我们必须更新ApplicationManifest.xml来支持这些参数;

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="ChileTargetType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
    <Parameters>
        <Parameter Name="MyService_SuperWebServiceBaseUri" DefaultValue="https://the-real-live-super-base-uri.com/" />
    </Parameters>
    <ServiceManifestImport>
        <ServiceManifestRef ServiceManifestName="MyServicePkg" ServiceManifestVersion="1.0.0" />
        <EnvironmentOverrides CodePackageRef="Code">
            <EnvironmentVariable Name="SuperWebServiceBaseUri" Value="[MyService_SuperWebServiceBaseUri]"/>
        </EnvironmentOverrides>
    </ServiceManifestImport>
    <!-- snip -->
</ApplicationManifest>

2
更整洁的方法来设置环境变量
hungryMind 17'Nov 10'17

2
此链接还帮我:binaryradix.com/2016/10/...
达雷尔K.

7

上面的答案很好地解释了它是如何完成的。我要添加一个标记,为什么它是“令人费解的”:

由于服务旨在独立存在,因此必须采用这种方式。默认情况下,它们应在链接到的任何应用程序中运行。独立于应用程序的清单。因此,该服务只能依赖至少在其自己的配置中预定义的参数。

这些预设然后可以被应用程序覆盖。这是唯一的通用方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.