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

81

Wie würde ich für zwei Umgebungen, lokal und Cloud, benutzerdefinierte Einstellungen oder Parameter für Ressourcen wie SQL-Datenbanken, Speicherkonten usw. einrichten? Idealerweise wäre es ein Parametername, der im Code aufgerufen wird, um beispielsweise einen DbContext auf einen bestimmten zu verweisen Datenbank, die in Konfigurationen für eine lokale oder Cloud-Umgebung unterschiedlich sein kann. Danke dir.

StampyTurtle
quelle
Obwohl ich wünschte, sie hätten den Anwendungscode für die tatsächliche Verwendung der Konfiguration enthalten, zeigt Microsoft Ihnen im folgenden Artikel, wie Sie ihn einrichten können: docs.microsoft.com/en-us/azure/service-fabric/…
Adam Plocher

Antworten:

143

Um Umgebungsvariablen für die lokale und in der Cloud ausgeführte Ausführung von Service Fabric zu haben, müssen Sie Folgendes tun:

  1. Fügen Sie Ihren benutzerdefinierten Konfigurationsabschnitt und Ihre Parameter zur Datei Settings.xml des Service / Actor-Projekts hinzu (unter \ PackageRoot \ Config \ Settings.xml im Projektstamm). Lassen Sie die Parameter leer, da wir diese an anderer Stelle pro Umgebung festlegen 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 befinden sich <ServiceManifestImport>Elemente für jedes Ihrer enthaltenen Projekte. Darunter befindet sich ein <ConfigOverrides>Element, in dem angegeben wird, 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 den lokalen und Cloud-XML-Dateien vorhanden ist. Andernfalls werden sie beim Erstellen überschrieben.

Wenn Sie mit dem obigen Beispiel fortfahren, wird dies so eingestellt.

<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 Dienst / Akteur wie folgt auf diese Konfigurationsvariablen pro Umgebung zugreifen.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

var connectionStringParameter = configurationPackage.Settings.Sections["UserDatabase"].Parameters["UserDatabaseConnectionString"];
StampyTurtle
quelle
98
Kann ich nur "yuck!" Sagen. Dies ist hoffnungslos kompliziert für eine einfache umgebungsbasierte Einstellung. Dies ist reif für einige Entwicklungsanstrengungen des SF-Teams.
BrettRobi
Ich bin nicht sicher, was ich vermisse, aber mein Kontext hat keinen CodePackageActivationContext. Ich sehe in meinen zustandslosen Diensten, dass es an den Konstruktor an OwinCommunicationListener übergeben wird. Aber ich bin mir nicht sicher, wo ich es im Schauspieler bekommen soll?
Steve
7
Vorzeitig gefragt. Die Kommentare hier: azure.microsoft.com/en-us/documentation/articles/… Verweisen Sie darauf, dies zu verwenden: CodePackageActivationContext activityContext = FabricRuntime.GetActivationContext ();
Steve
10
Dies ist viel besser als die eigentliche Dokumentation, danke! Auch vereinbart, dass es sehr verworren ist ... reparieren Sie dieses SF-Team!
Naspinski
2
Ich hatte ein Problem, bei dem diese Einstellungen nicht überschrieben wurden. Sie müssen die Parameter oben definieren ServiceManifestImport(Kind von ApplicationManifest), aber die ConfigOverridesmüssen darin gehen (Kind von ServiceManifestImport).
Mardoxx
41

Sie können wie jede andere Anwendung auch Umgebungsvariablen verwenden. Dies funktioniert auch mit ausführbaren Gastdateien innerhalb der Service Fabric, im Gegensatz dazu, settings.xmlda dies die integrierte Laufzeit der Service Fabric erfordert.

Innerhalb Ihrer Anwendung können Sie wie bei jeder anderen .net-Anwendung über die folgende GetEnvironmentVariableMethode auf Umgebungsvariablen zugreifen Environment:

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

Dann müssen wir einige Standardwerte für Umgebungsvariablen einrichten. Dies erfolgt in der ServiceManifest.xmlManifestdatei 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 Umgebungsvariablen können dann in der ApplicationManifest.xmlDatei mithilfe des folgenden Codes ü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 Anwendungsmanifesteinstellung mit local.xmlund parametriert werden 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>

Dann müssen wir das aktualisieren ApplicationManifest.xml, 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>
Kevin Smith
quelle
2
Eine ordentlichere Möglichkeit, Umgebungsvariablen
festzulegen
2
Dieser Link hat mir auch geholfen: binaryradix.com/2016/10/…
Darrel K.
7

Die obigen Antworten erklären gut, wie es gemacht wird. Ich mag einen sidemark hinzufügen möchte , warum es , dass ‚ gefaltet ‘:

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.

BaluJr.
quelle