web-dev-qa-db-de.com

Wo legen Sie Laufzeitkonfigurationsparameter für die Service Fabric pro Umgebung fest und greifen darauf zu?

Wie würde ich für zwei Umgebungen (lokal und Cloud) benutzerdefinierte Einstellungen oder Parameter für Ressourcen wie SQL-Datenbanken, Speicherkonten usw. einrichten? Im Idealfall ist dies ein Parametername, der im Code als Hinweis auf einen bestimmten DbContext bezeichnet wird Datenbank, die in Konfigurationen für eine lokale oder Cloud-Umgebung unterschiedlich sein kann. Vielen Dank.

75
StampyTurtle

Um Umgebungsvariablen für die Ausführung von Service Fabric lokal und in der Cloud zu haben, müssen Sie folgende Schritte ausführen:

  1. Fügen Sie der Datei Settings.xml des Service/Actor-Projekts (im Stammverzeichnis des Projekts unter\PackageRoot\Config\Settings.xml) Ihren benutzerdefinierten Konfigurationsabschnitt und Ihre benutzerdefinierten Parameter hinzu. Lassen Sie die Parameter leer, da diese an anderer Stelle pro Umgebung festgelegt werden. Hier ist ein Beispiel.
<?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. In der ApplicationManifest.xml-Datei Ihres Service Fabric-Projekts befindet sich <ServiceManifestImport> Elemente für jedes Ihrer enthaltenen Projekte. Darunter wird ein <ConfigOverrides> Element, in dem wir deklarieren, welche Werte für unsere Konfigurationen durch Werte ersetzt werden, die pro Umgebung in den lokalen und Cloud-XML-Dateien unter ApplicationParameters in unserem Service Fabric-Projekt festgelegt wurden. In derselben ApplicationManifest.xml-Datei müssen Sie den Parameter hinzufügen, der in der lokalen XML-Datei und der Cloud-XML-Datei enthalten sein soll. Andernfalls werden sie beim Erstellen überschrieben.

Fahren Sie mit dem obigen Beispiel fort, und stellen Sie es so ein.

<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. In den Dateien local.xml und cloud.xml unter ApplicationParameters in Ihrem Service Fabric-Projekt geben Sie Ihre umgebungsspezifischen Variablen wie folgt an.
<?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. Schließlich können Sie in Ihrem Service/Actor auf diese umgebungsspezifischen Konfigurationsvariablen zugreifen.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

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

Sie können mgebungsvariablen genau wie jede andere Anwendung verwenden. Dies funktioniert auch mit ausführbaren Gastdateien innerhalb der Service Fabric im Gegensatz zu settings.xml da dies die integrierte Service Fabric-Laufzeit erfordert.

Innerhalb Ihrer Anwendung können Sie auf Umgebungsvariablen wie auf jede andere .NET-Anwendung zugreifen, indem Sie die GetEnvironmentVariable -Methode für die Environment -Klasse verwenden:

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

Dann müssen wir einige Standardwerte für Umgebungsvariablen festlegen. Dies erfolgt in der Manifestdatei ServiceManifest.xml des Dienstes.

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

Diese Umgebungsvariable kann dann mit dem folgenden Code in der Datei ApplicationManifest.xml überschrieben werden:

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

Dies kann dann wie jede andere Einstellung des Anwendungsmanifests mit den Zeichen local.xml und cloud.xml parametriert werden.

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

Dann müssen wir den ApplicationManifest.xml aktualisieren, um diese Parameter zu unterstützen.

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

Die obigen Antworten erklären gut, wie es gemacht wird. Ich möchte eine Seitenmarkierung hinzufügen, warum ist das 'verschachtelt':

Dies muss so sein, da die Dienste in sich geschlossen sein sollen. Sie sollten standardmäßig in jeder Anwendung ausgeführt werden, mit der sie verknüpft sind. Unabhängig vom Manifest der Anwendung. Der Dienst kann sich also nur auf Parameter verlassen, die zumindest in seiner eigenen Konfiguration vordefiniert sind.

Diese Voreinstellungen können dann von der Anwendung überschrieben werden. Dies ist der einzige universelle Ansatz.

6
BaluJr.