动态 Servicefabric 设置和覆盖

2024-03-05

有没有办法完全不告诉服务有关设置,而只在应用程序级别提供它们?

我仍然对 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>

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

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

有没有办法完全不告诉服务有关设置,而只在应用程序级别提供它们?

如果不是,有什么替代方案可以使服务在我可能想要用来以不同方式提供此类动态配置的应用程序之间重用?

可能有助于回答这个问题的谜题的最后一部分是我正在使用一些预发布代码 https://github.com/Microsoft/service-fabric-aspnetcore/tree/develop/src/Microsoft.ServiceFabric.AspNetCore.Configuration将服务结构设置转换为 Microsoft.Extensions.Configuration.IConfiguration。然而,这只是获取它找到的设置;这不是我遇到的覆盖问题的原因。

服务设置.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">
  <Section Name="AuthorizationOptions">
    <!-- I should not have to provide these at the application level!
         However, it fails to deploy if I don't. -->
    <Parameter Name="Policies:0:Name" Value="User"/>
    <Parameter Name="Policies:0:Groups:0" Value="Domain Users"/>
  </Section>
</Settings>

示例应用程序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="ServiceFabric.ExampleType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" DefaultValue="" />
    <Parameter Name="Service.Example_InstanceCount" DefaultValue="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies_0_Name" DefaultValue="Users" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies_0_Groups_0" DefaultValue="Domain Users" />
  </Parameters>
  <ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="Service.ExamplePkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides>
      <ConfigOverride Name="Config">
        <Settings>
          <Section Name="AuthorizationOptions">
            <Parameter Name="Policies:0:Name" Value="[Service.Example_AuthorizationOptions_Policies_0_Name]" />
            <Parameter Name="Policies:0:Groups:0" Value="[Service.Example_AuthorizationOptions_Policies_0_Groups_0]" />
          </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>

示例应用程序应用程序参数 (Local.1Node.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:/ServiceFabric.Example" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="Service.Example_ASPNETCORE_ENVIRONMENT" Value="Development" />
    <Parameter Name="Service.Example_InstanceCount" Value="-1" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies_0_Name" Value="Users" />
    <Parameter Name="Service.Example_AuthorizationOptions_Policies_0_Groups_0" Value="Domain Users" />
  </Parameters>
</Application>

示例应用程序发布配置文件 (Local.1Node.xml):

<?xml version="1.0" encoding="utf-8"?>
<PublishProfile xmlns="http://schemas.microsoft.com/2015/05/fabrictools">
  <ClusterConnectionParameters />
  <ApplicationParameterFile Path="..\ApplicationParameters\Local.1Node.xml" />
</PublishProfile>

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

internal sealed class Example : StatelessService
{
    public Example(StatelessServiceContext context)
        : base(context)
    { }

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new ServiceInstanceListener[]
        {
            new ServiceInstanceListener(serviceContext =>
                new HttpSysCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
                {
                    ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting HttpSys on {url}");

                    return new WebHostBuilder()
                            .UseHttpSys(options =>
                            {
                                options.Authentication.Schemes = AuthenticationSchemes.Negotiate; // Microsoft.AspNetCore.Server.HttpSys
                                                                                        options.Authentication.AllowAnonymous = false;
                            }).ConfigureServices(services => services.AddSingleton<StatelessServiceContext>(serviceContext))
                                        .UseContentRoot(Directory.GetCurrentDirectory())
                                        .ConfigureAppConfiguration((hostingContext, config) =>
                                            {
                                                config.SetBasePath(Directory.GetCurrentDirectory());
                                                config.AddServiceFabricConfiguration(FabricRuntime.GetActivationContext(), options => {
                                                    options.IncludePackageName=false;
                                                });
                                            })
                                        .UseStartup<Startup>()
                                        .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                                        .UseUrls(url)
                                        .Build();
                }))
        };
    }
}

从那时起,一切都按预期位于 IConfiguration 对象中。


配置 Service Fabric 应用程序的方法有很多种,每种方法都会给您带来不同的挑战。

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

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

它会是这样的:

设置.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Settings xmlns... namespaces here...>
  <Section Name="AuthorizationOptions">
    <Parameter Name="Policies"/>
  </Section>
</Settings>

应用程序清单.xml:

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

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

您可以更进一步并存储整个AuthorizationOptions作为 JSON,但正如之前所说,更多 它变得通用,更容易犯错误,更难找到 配置问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态 Servicefabric 设置和覆盖 的相关文章

  • 将 Application Insight 添加到现有的 Azure Service Fabric 群集

    自过去 4 个月以来 我们一直在开发 Azure Service Fabric 但现在决定拥有一个统一的日志基础设施 我们正在使用 AppInsight 我们如何将 AppInsight 密钥添加到现有的 Service Fabric 集群
  • 订阅 Service Fabric 群集级别事件

    我正在尝试创建一项服务 该服务将为在我的 Service Fabric 集群中运行的应用程序更新服务端点的外部列表 基本上 我需要在本地 F5 负载均衡器中复制 Azure 负载均衡器 在上个月的 Service Fabric 问答中 团队
  • Actor 方法启动/停止日志 |添加附加信息

    对于 azure actor 服务 Actor Method Start Stop 会记录在 诊断 窗口中 如下所示 如何在每次调用方法时添加一些额外的详细信息 例如 Correlation Id Timestamp 2016 09 14T
  • 在 Service Fabric 中通过 HTTPS 调用 WCF:请求已中止:无法创建 SSL/TLS 安全通道

    I m calling a WCF service over HTTPS gt The certificates are ok See screenshot 客户端证书安装在我的帐户和本地计算机下 两者均可出口 所以我有一段可以在控制台应用
  • Service-Fabric 绑定到多个端点

    是否可以绑定服务结构应用程序来侦听多个端口 基本上 我试图拥有一个面向公众的服务 它侦听 http 80 和 https 443 并将任何 http 请求重定向到 https 我创建了一个新的 ASP net Core 服务 它单独工作正常
  • 如何在单个服务中托管多个 Service Fabric Actor 类型?

    我读了here https azure microsoft com en gb documentation articles service fabric reliable actors platform 应该可以在同一服务中托管紧密耦合的
  • azure服务结构可靠字典linq查询非常慢

    我在服务结构有状态服务中有一本可靠的字典 我有一个简单的 linq 表达式 我正在使用 Ix Async 包来构建异步枚举 using ITransaction tx this StateManager CreateTransaction
  • 可靠集合缓存作为 Service Fabric 中的缓存

    我的系统使用一堆微服务来处理一个项目 我计划创建一个有状态微服务来保存该项目的最新状态 在该服务中 我计划将所有项目状态存储在可靠的字典中 并且每当访问项目时都会更新该项目的 上次访问 字段 我的要求是 我只想将最近使用的项目存储在可靠的集
  • Service Fabric 群集自定义终结点与应用程序起始和结束端口

    此屏幕截图是在 Azure 门户上创建集群时拍摄的 如下图所示 自定义端点和应用程序有什么区别 起始端口范围 为什么一个称为端点 另一个称为端口 The custom endpoints help says Custom endpoints
  • 通过 RDP 远程访问 SF 节点

    如何远程连接到 SF 集群中的节点 由于这些只是虚拟机 我感觉我应该能够通过 RDP 访问它们 即使这是我通常想要避免的事情 我将如何进行远程处理 在 Vaclav 的答案中添加一些特定于 Service Fabric 的详细信息 标准 S
  • 升级到 SDK 2.3.301 后,Service Fabric Actor 或服务随机变得无法访问

    从 Service Fabric SDK 2 0 135 升级到 2 3 301 后 我们开始遇到 Service Fabric actor 或服务无法访问的情况 尽管在 Service Fabric Explorer 中显示为正常运行 一
  • Azure 服务总线 1.1 无法启动

    服务总线网关未启动 首先 我尝试完全卸载所有Azure Fabric Service Bus类型的SDK和安装 我已经安装了两个Windows Azure Pack Service Bus 1 1 and Windows Azure Pac
  • Service Fabric:找不到 EntryPoint Blah.exe

    我进行了一些项目重命名并更改了文件夹结构 现在我无法将服务结构应用程序部署到本地服务结构集群 Register ServiceFabricApplicationType 找不到 EntryPoint IdentityService exe
  • 将 C# Stateful Service Fabric 应用程序从 Visual Studio 部署到 Linux

    编辑 04 06 18 gt 更新了问题的最新状态 因此 我有一个正在运行的 Net 4 6 Stateful Service 它当前在部署在 Azure 上的 Windows Service Fabric 集群上运行 从 09 2017
  • Fabric 消息太大

    我试图将 5MB 数据从服务传递给参与者 但收到错误 Fabric 消息太大 如何增加微服务之间可传输的最大大小 我看了以下内容page https github com Azure azure content blob master ar
  • 访问 Azure Service Fabric 有状态服务状态

    我已将 Web API 添加到我的有状态服务并想要访问StateManager从它 从外面StatefulService类实现 最好的方法是什么 目前我正在为此使用一个小类 internal static class InstanceAcc
  • Service Fabric:服务之间的调用有延迟?

    我们正在开发一个由多个不同服务组成的服务结构应用程序 我们的应用程序工作方式的一个关键部分是这些服务需要大量相互调用 直到最近我们增加了应用程序的负载并发现它的速度大大减慢时 我们才遇到任何问题 经过大量调查和对各种事情进行计时后 我们发现
  • MassTransit AzureServiceBus 生成的队列

    我有一个托管在 Azure Service Fabric 解决方案中的 MT 设置的工作配置 我有一个发送消息的 API 和一个读取消息的无状态应用程序 在无状态应用程序中 我告诉它使用类型的消息TestMessage具有以下内容 cont
  • Service Fabric 在启动时生成 actor

    有没有办法要求系统在启动时生成某些参与者 目前我激活了我需要的演员集Program cs演员注册后 这工作正常 但我偶尔会遇到ReminderLoadInProgressException因为正在激活的参与者需要注册提醒 但在它尝试这样做时
  • ServiceFabric 本地集群中的 HTTPS 通信

    这是我的设置 IdentityServer 4 作为无状态可靠的 ASP NET Core 服务 WebAPI 作为可靠的 ASP NET Core 服务 将它们与 JS 客户端一起使用 现在可以与 HTTP 一起使用 问题出在 HTTPS

随机推荐