サービスファブリックの環境ごとに、ランタイム構成パラメーターをどこに設定してアクセスしますか?


82

ローカルとクラウドの2つの環境では、SQLデータベース、ストレージアカウントなどのリソースのカスタム設定またはパラメーターをどのように設定しますか?理想的には、コードで呼び出される1つのパラメーター名で、DbContextを特定の方向に向けます。データベース。ローカル環境とクラウド環境のどちらの構成でも異なります。ありがとうございました。


私は、彼らが実際に設定を利用するためのアプリケーションコードを含めたいが、マイクロソフトは次の記事でそれを設定するためにあなたが表示さん:docs.microsoft.com/en-us/azure/service-fabric/...
アダムPlocher

回答:


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>、ServiceFabricプロジェクトの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. 最後に、サービス/アクターでは、これらの環境ごとの構成変数にそのようにアクセスできます。
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

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

100
「うん!」と言ってもいいですか。これは、単純な環境ベースの設定では絶望的に複雑になります。これは、SFチームによる開発努力の機が熟しています。
BrettRobi 2016年

何が欠けているのかわかりませんが、コンテキストにCodePackageActivationContextがありません。ステートレスサービスで、コンストラクターでOwinCommunicationListenerに渡されることがわかります。しかし、アクターのどこで入手できるかわかりませんか?
スティーブ

7
時期尚早に尋ねた。ここでのコメント:azure.microsoft.com/en-us/documentation/articles/…これを使用することを示します:CodePackageActivationContextactivationContext = FabricRuntime.GetActivationContext();
スティーブ

11
これは実際のドキュメントよりもはるかに優れています、ありがとうございます!また、それは非常に複雑であることに同意しました...このSFチームを修正してください!
naspinski 2016

2
これらの設定が上書きされないという問題が発生していました。上記のパラメータServiceManifestImport(の子ApplicationManifest)を定義する必要がありますが、その中ConfigOverridesに入れる必要があります(の子ServiceManifestImport)。
mardoxx 2017

42

他のアプリケーションと同じように環境変数を使用できます。これは、組み込みのサービスファブリックランタイムが必要なため、サービスファブリック内のゲスト実行可能ファイルでも機能しsettings.xmlます。

アプリケーション内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>

2
環境変数を設定するためのより
適切

2
このリンクはまた私を助け:binaryradix.com/2016/10/...
ダレルK.

7

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.