Где вы устанавливаете и получаете доступ к параметрам конфигурации времени выполнения для каждой среды для Service Fabric?

82

Для двух сред, локальной и облачной, как мне настроить пользовательские настройки или параметры для ресурсов, таких как базы данных Sql, учетные записи хранения и т. Д. ... В идеале это было бы одно имя параметра, вызываемое в коде, чтобы сказать, указывать DbContext на конкретный база данных, которая в конфигурациях для локальной или облачной среды различается. Спасибо.

StampyTurtle
источник
Хотя мне бы хотелось, чтобы они включили код приложения для фактического использования конфигурации, Microsoft действительно показывает вам, как настроить его в следующей статье: docs.microsoft.com/en-us/azure/service-fabric/…
Адам Плохер,

Ответы:

145

Вот что вам нужно сделать, чтобы иметь переменные среды для локального и облачного запуска Service Fabric:

  1. Добавьте свой настраиваемый раздел конфигурации и параметры в файл Settings.xml проекта Service / Actor (расположенный в \ 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. В файле ApplicationManifest.xml вашего проекта Service Fabric будут <ServiceManifestImport>элементы для каждого из ваших включенных проектов. Под ним будет <ConfigOverrides>элемент, в котором мы объявим, какие значения для наших конфигураций будут заменены значениями, установленными для каждой среды в локальных и облачных xml-файлах под ApplicationParameters в нашем проекте Service Fabric. В том же файле 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. В файлах local.xml и cloud.xml под ApplicationParameters в вашем проекте Service Fabric вы должны указать переменные, специфичные для вашей среды, таким образом.
<?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"];
StampyTurtle
источник
101
Могу я просто сказать «фу!». Это безнадежно запутано для простой настройки, основанной на среде. Это созрело для некоторых усилий разработчиков со стороны команды SF.
BrettRobi
Не уверен, что мне не хватает, но в моем контексте нет CodePackageActivationContext. В своих службах без сохранения состояния я вижу, что он передается конструктору в OwinCommunicationListener. Но я не уверен, где взять его в Актере?
Стив
7
Спросил преждевременно. Комментарии здесь: azure.microsoft.com/en-us/documentation/articles/… Укажите на использование этого: CodePackageActivationContext activationContext = FabricRuntime.GetActivationContext ();
Стив
11
Это намного лучше, чем настоящая документация, спасибо! Также согласен, что это очень запутанно ... исправить эту команду SF!
naspinski
2
У меня возникла проблема, из-за которой эти настройки не отменялись. Вы должны определить параметры выше ServiceManifestImport(дочерний элемент ApplicationManifest), но ConfigOverridesдолжны войти в него (дочерний элемент ServiceManifestImport).
Mardoxx
42

Вы можете просто использовать переменные среды, как и любое другое приложение, это также работает с гостевым исполняемым файлом в служебной структуре, в отличие от, settings.xmlпоскольку для этого требуется встроенная среда выполнения служебной структуры.

В вашем приложении вы можете получить доступ к переменным среды, как и к любому другому .NET-приложению, с помощью GetEnvironmentVariableметода Environmentкласса:

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
Более удобный способ установить переменную окружения
hungryMind
2
Эта ссылка мне тоже помогла: binaryradix.com/2016/10/…
Даррел К.
7

Приведенные выше ответы хорошо объясняют, как это делается. Я хочу добавить боковой знак, почему он такой « запутанный »:

Так и должно быть, так как сервисы должны быть автономными. По умолчанию они должны запускаться в любом приложении, с которым связаны. Независимо от манифеста приложения. Таким образом, служба может полагаться только на параметры, которые, по крайней мере, предопределены в ее собственной конфигурации.

Эти предварительные настройки затем могут быть перезаписаны приложением. Это единственный универсальный подход.

BaluJr.
источник