Azure service fabric 动态Servicefabric设置和覆盖

Azure service fabric 动态Servicefabric设置和覆盖,azure-service-fabric,service-fabric-on-premises,Azure Service Fabric,Service Fabric On Premises,有没有一种方法可以完全不告诉服务有关设置,而只在应用程序级别提供这些设置 我仍然不满意servicefabric配置的工作方式 就我所知,我必须在服务的settings.xml中指定所有可能的配置值。然后我可以覆盖应用程序的ApplicationParameters中的那些。根据文档,环境变量也是如此 造成的复杂性是,在许多情况下,我们的配置被用于使用阵列来补充选项 例如考虑JSON: { "AuthorizationOptions": { "Policies": [ {

有没有一种方法可以完全不告诉服务有关设置,而只在应用程序级别提供这些设置

我仍然不满意servicefabric配置的工作方式

就我所知,我必须在服务的settings.xml中指定所有可能的配置值。然后我可以覆盖应用程序的ApplicationParameters中的那些。根据文档,环境变量也是如此

造成的复杂性是,在许多情况下,我们的配置被用于使用阵列来补充选项

例如考虑JSON:

{
  "AuthorizationOptions": {
    "Policies": [
      {
        "Name": "User",
        "Groups": [ "Domain Users" ]
      }
    ]
  }  
}
有2个阵列;这是必要和有用的。要在服务结构配置中表达这一点,可将其转换为:

<Section Name="AuthorizationOptions">
    <Parameter Name="Policies:0:Name" Value="User"/>
    <Parameter Name="Policies:0:Groups:0" Value="Domain Users"/>
</Section>

虽然与结构化对象相比,翻译并不令人愉快,但它是完全可用的

但是,如果我没有在服务中指定节和参数,我似乎无法在应用程序中重写它们。因此,在这种情况下,我必须定义服务中每个策略的策略和组的确切数量,应用程序可以修改策略名称或组值,但不能修改策略总数或组总数

有没有一种方法可以完全不告诉服务有关设置,而只在应用程序级别提供这些设置

如果没有,还有什么替代方案可以使服务跨应用程序重用,我可能希望使用这些替代方案以不同的方式提供这种类型的动态配置

可能有助于回答此问题的谜题的最后一部分是,我正在使用一些工具将服务结构设置转换为Microsoft.Extensions.Configuration.IConfiguration。然而,这只是采用它找到的设置;这不是我遇到的覆盖问题的原因

示例服务设置.xml:


示例应用程序ApplicationManifest.xml:


示例应用程序应用程序参数(Local.1Node.xml):


示例应用程序PublishProfiles(Local.1Node.xml):


应该是无关的,但设置的示例消耗:

内部密封类示例:无状态服务
{
公共示例(无状态ServiceContext上下文)
:基本(上下文)
{ }
受保护的重写IEnumerable CreateServiceInstanceListeners()
{
返回新服务InstanceListener[]
{
新ServiceInstanceListener(serviceContext=>
新的HttpSysCommunicationListener(serviceContext,“ServiceEndpoint”,(url,listener)=>
{
ServiceEventSource.Current.ServiceMessage(serviceContext,$“在{url}上启动HttpSys”);
返回新的WebHostBuilder()
.UseHttpSys(选项=>
{
options.Authentication.Schemes=AuthenticationSchemes.Negotiate;//Microsoft.AspNetCore.Server.HttpSys
options.Authentication.AllowAnonymous=false;
}).ConfigureServices(服务=>services.AddSingleton(服务上下文))
.UseContentRoot(目录.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext,config)=>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddServiceFabricConfiguration(FabricRuntime.GetActivationContext(),选项=>{
options.IncludePackageName=false;
});
})
.UseStartup()
.UseServiceFabricIntegration(侦听器,ServiceFabricIntegrationOptions.None)
.useURL(url)
.Build();
}))
};
}
}

从那时起,一切都如预期的那样位于IConfiguration对象中

配置服务结构应用程序有多种方法,每种方法都会给您带来不同的挑战

SF团队在文档中推荐了这种方法,因为您可以更好地控制配置的版本,并且更难犯错误,正如在文件中明确声明的那样,由于您的限制,我使用了几种不同的方法,以下方法可能会解决您的问题:

像最初的方法一样进行配置,但使用存储为JSON值的复杂类型:这是最接近推荐设计的解决方案,您仍然可以在源代码管理上控制配置版本

可能是这样的:

Settings.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns... namespaces here...>
  <Section Name="AuthorizationOptions">
    <Parameter Name="Policies"/>
  </Section>
</Settings>
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="ServiceFabric.ExampleType" ApplicationTypeVersion="1.0.0" xmlns:...namespaces....>
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" DefaultValue="" />
    <Parameter Name="Service.Example_InstanceCount" DefaultValue="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies" DefaultValue="[]" />
  </Parameters>
  <ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Service.ExamplePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="AuthorizationOptions">
            <Parameter Name="Policies" Value="[Service.Example_AuthorizationOptions_Policies]" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
    <EnvironmentOverrides CodePackageRef="code">
      <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="[Service.Example_ASPNETCORE_ENVIRONMENT]" />
    </EnvironmentOverrides>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="Service.Example" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Service.ExampleType" InstanceCount="[Service.Example_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

ApplicationManifest.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns... namespaces here...>
  <Section Name="AuthorizationOptions">
    <Parameter Name="Policies"/>
  </Section>
</Settings>
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="ServiceFabric.ExampleType" ApplicationTypeVersion="1.0.0" xmlns:...namespaces....>
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" DefaultValue="" />
    <Parameter Name="Service.Example_InstanceCount" DefaultValue="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies" DefaultValue="[]" />
  </Parameters>
  <ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Service.ExamplePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="AuthorizationOptions">
            <Parameter Name="Policies" Value="[Service.Example_AuthorizationOptions_Policies]" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
    <EnvironmentOverrides CodePackageRef="code">
      <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="[Service.Example_ASPNETCORE_ENVIRONMENT]" />
    </EnvironmentOverrides>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="Service.Example" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Service.ExampleType" InstanceCount="[Service.Example_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>

ApplicationParameters.xml

<?xml version="1.0" encoding="utf-8"?>
<Application Name="fabric:/ServiceFabric.Example" xmlns:...namespaces....>
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" Value="Development" />
    <Parameter Name="Service.Example_InstanceCount" Value="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies" Value="[{'Name': 'User','Groups': ['Domain Users']}, {'Name': 'Admin','Groups': ['Administrators']}]" />
  </Parameters>
</Application>

在您的服务代码中:

public class Policy
{
    public string Name { get; set; }
    public string[] Groups { get; set; }
}


var settings = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config").Settings;
var authOptions = settings.Sections["AuthorizationOptions"].Parameters["Policies"].Value;
var obj = JsonConvert.DeserializeObject<Policy[]>(authOptions);
公共类策略
{
公共字符串名称{get;set;}
公共字符串[]组{get;set;}
}
var settings=this.Context.CodePackageActivationContext.GetConfigurationPackageObject(“配置”).settings;
var authOptions=设置。节[“Aut
<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest ApplicationTypeName="ServiceFabric.ExampleType" ApplicationTypeVersion="1.0.0" xmlns:...namespaces....>
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" DefaultValue="" />
    <Parameter Name="Service.Example_InstanceCount" DefaultValue="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies" DefaultValue="[]" />
  </Parameters>
  <ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Service.ExamplePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="AuthorizationOptions">
            <Parameter Name="Policies" Value="[Service.Example_AuthorizationOptions_Policies]" />
          </Section>
        </Settings>
      </ConfigOverride>
    </ConfigOverrides>
    <EnvironmentOverrides CodePackageRef="code">
      <EnvironmentVariable Name="ASPNETCORE_ENVIRONMENT" Value="[Service.Example_ASPNETCORE_ENVIRONMENT]" />
    </EnvironmentOverrides>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="Service.Example" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="Service.ExampleType" InstanceCount="[Service.Example_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
</ApplicationManifest>
<?xml version="1.0" encoding="utf-8"?>
<Application Name="fabric:/ServiceFabric.Example" xmlns:...namespaces....>
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" Value="Development" />
    <Parameter Name="Service.Example_InstanceCount" Value="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies" Value="[{'Name': 'User','Groups': ['Domain Users']}, {'Name': 'Admin','Groups': ['Administrators']}]" />
  </Parameters>
</Application>
public class Policy
{
    public string Name { get; set; }
    public string[] Groups { get; set; }
}


var settings = this.Context.CodePackageActivationContext.GetConfigurationPackageObject("Config").Settings;
var authOptions = settings.Sections["AuthorizationOptions"].Parameters["Policies"].Value;
var obj = JsonConvert.DeserializeObject<Policy[]>(authOptions);