web-dev-qa-db-fra.com

Où définissez-vous et accédez-vous aux paramètres de configuration d'exécution par environnement pour la structure de service?

Pour deux environnements, le local et le cloud, comment définir des paramètres personnalisés pour des ressources telles que des bases de données SQL, des comptes de stockage, etc. base de données, que dans les configurations pour un environnement local ou cloud soient différentes. Merci.

75
StampyTurtle

Pour disposer de variables d'environnement permettant d'exécuter Service Fabric localement et dans le cloud, procédez comme suit:

  1. Ajoutez votre section de configuration personnalisée et vos paramètres au fichier Settings.xml du projet Service/Actor (situé dans\PackageRoot\Config\Settings.xml à partir de la racine du projet). Laissez les paramètres vierges car nous les placerons ailleurs par environnement. Voici un exemple.
<?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. Dans le fichier ApplicationManifest.xml de votre projet Service Fabric, il y aura <ServiceManifestImport> éléments pour chacun de vos projets inclus. En dessous, ce sera un <ConfigOverrides> élément où nous allons déclarer quelles valeurs de nos configurations seront remplacées par des valeurs définies par environnement dans les fichiers xml locaux et cloud sous ApplicationParameters dans notre projet Service Fabric. Dans ce même fichier ApplicationManifest.xml, vous devez ajouter le paramètre qui sera présent dans les fichiers xml locaux et cloud, sinon ils seront écrasés lors de la génération.

En reprenant l'exemple ci-dessus, voici comment cela serait défini.

<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. Dans les fichiers local.xml et cloud.xml situés sous ApplicationParameters dans votre projet Service Fabric, vous spécifierez les variables propres à votre environnement, comme ceci.
<?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. Enfin, dans votre service/acteur, vous pouvez accéder à ces variables de configuration par environnement comme suit.
var configurationPackage = Context.CodePackageActivationContext.GetConfigurationPackageObject("Config");

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

Vous pouvez simplement utiliser variables d’environnement comme toute autre application, cela fonctionne également avec un exécutable invité au sein de la structure de service, contrairement au settings.xml Car cela nécessite le moteur d'exécution de la structure de service intégrée.

Dans votre application, vous pouvez accéder aux variables d'environnement comme n'importe quelle autre application .net via la méthode GetEnvironmentVariable de la classe Environment:

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

Ensuite, nous devons configurer certaines valeurs de variables d’environnement par défaut. C’est fait dans le fichier manifeste ServiceManifest.xml Du service.

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

Ces variables d'environnement peuvent ensuite être remplacées dans le fichier ApplicationManifest.xml À l'aide du code suivant:

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

Ceci peut alors être paramétré comme n'importe quel autre réglage de manifeste d'application en utilisant local.xml Et 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>

Ensuite, nous devrons mettre à jour le ApplicationManifest.xml Pour prendre en charge ces paramètres;

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

Les réponses ci-dessus expliquent bien comment cela se fait. Je veux ajouter une marque de fabrique, pourquoi est-ce que 'compliqué':

Il doit en être ainsi, car les services sont conçus pour être autonomes. Ils doivent s'exécuter par défaut dans toutes les applications auxquelles ils sont liés. Indépendant du manifeste de l'application. Le service ne peut donc compter que sur des paramètres, qui sont au moins prédéfinis dans sa propre configuration.

Ces préréglages peuvent ensuite être écrasés par l'application. C'est la seule approche universelle.

6
BaluJr.