web-dev-qa-db-ja.com

Service Fabricの環境ごとに実行時構成パラメーターをどこで設定し、アクセスしますか?

ローカルとクラウドの2つの環境では、SQLデータベース、ストレージアカウントなどのリソースのカスタム設定またはパラメーターをどのように設定しますか。データベース、ローカル環境またはクラウド環境の構成が異なること。ありがとうございました。

75
StampyTurtle

Service Fabricをローカルおよびクラウドで実行するための環境変数ごとに、これを行う必要があります。

  1. Service/Actorプロジェクト(プロジェクトルートから\ PackageRoot\Config\Settings.xmlにある)の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"];
136
StampyTurtle

環境変数を他のアプリケーションと同じように使用できます。これは、settings.xmlとは異なり、サービスファブリック内のguest executableでも機能します。組み込みのService Fabricランタイム。

アプリケーション内では、GetEnvironmentVariableクラスのEnvironmentメソッドを使用して、他の.netアプリケーションと同様に環境変数にアクセスできます。

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>
36
Kevin Smith

上記の回答は、それがどのように行われるかをよく説明しています。私はサイドマークを追加したいのですが、なぜそれが「畳み込み」なのか:

サービスは自己完結型であることが意図されているため、このようにする必要があります。デフォルトでは、リンク先のアプリケーションで実行する必要があります。アプリケーションのマニフェストに依存しません。したがって、サービスは、少なくとも独自の構成で事前定義されているパラメーターのみに依存できます。

これらのプリセットは、アプリケーションによって上書きできます。これが唯一の普遍的なアプローチです。

6
BaluJr.