서비스 패브릭에 대한 환경 별 런타임 구성 매개 변수를 어디에서 설정하고 액세스합니까?


82

로컬 및 클라우드의 두 가지 환경에서 Sql 데이터베이스, 스토리지 계정 등과 같은 리소스에 대한 사용자 지정 설정 또는 매개 변수를 어떻게 설정합니까? 데이터베이스, 로컬 또는 클라우드 환경에 대한 구성이 다릅니다. 감사합니다.


구성을 실제로 활용하기위한 응용 프로그램 코드를 포함하고 싶지만 Microsoft는 다음 문서에서 설정하는 방법을 보여줍니다. docs.microsoft.com/en-us/azure/service-fabric/…
Adam 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>에는 Service Fabric 프로젝트의 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
그냥 "yuck!"이라고 말해도 될까요? 이것은 단순한 환경 기반 설정에 대해 절망적으로 복잡합니다. SF 팀의 일부 개발 노력에는 무르 익었습니다.
BrettRobi

내가 무엇을 놓치고 있는지 확실하지 않지만 내 컨텍스트에 CodePackageActivationContext가 없습니다. 내 상태 비 저장 서비스에서 생성자에서 OwinCommunicationListener에 전달되는 것을 봅니다. 하지만 액터에서 어디서 구해야할지 모르겠나요?
Steve

7
너무 일찍 물었다. 여기에 주석이 있습니다. azure.microsoft.com/en-us/documentation/articles/… 다음 을 사용하십시오. CodePackageActivationContext activationContext = FabricRuntime.GetActivationContext ();
Steve는

11
이것은 실제 문서보다 훨씬 낫습니다. 감사합니다! 또한 매우 복잡하다는 데 동의했습니다 ...이 SF 팀을 고쳐주세요!
naspinski

2
이러한 설정이 재정의되지 않는 문제가 발생했습니다. 위의 매개 변수 ServiceManifestImport(의 자식 ApplicationManifest) 를 정의해야 하지만 그 ConfigOverrides안에 들어가야합니다 (의 자식 ServiceManifestImport).
Mardoxx

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.xmlcloud.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/...
대럴 K.

7

위의 답변은 그것이 수행되는 방법을 잘 설명합니다. 사이드 마크를 추가하고 싶습니다. 왜 ' 복잡한 ' 이유 :

서비스가 자체적으로 포함되도록 의도되었으므로이 방식이어야합니다. 기본적으로 연결된 모든 응용 프로그램에서 실행되어야합니다. 응용 프로그램의 매니페스트와 무관합니다. 따라서 서비스는 최소한 자체 구성에 미리 정의 된 매개 변수에만 의존 할 수 있습니다.

그런 다음 응용 프로그램에서 이러한 사전 설정을 덮어 쓸 수 있습니다. 이것이 유일한 보편적 접근 방식입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.