动态 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 集群
  • 部署期间 Azure 中的 Service Fabric 错误

    将集群部署到 Azure 时遇到问题 一切都在本地运行 但是当部署到 Azure 时 我在尝试调用其中一项服务时收到错误 在 Azure 中 服务结构是6 1 480 9494 并且无法升级 但我的本地版本是6 2 262 94946天前发
  • 订阅 Service Fabric 群集级别事件

    我正在尝试创建一项服务 该服务将为在我的 Service Fabric 集群中运行的应用程序更新服务端点的外部列表 基本上 我需要在本地 F5 负载均衡器中复制 Azure 负载均衡器 在上个月的 Service Fabric 问答中 团队
  • 在开发人员计算机上自动创建没有 DefaultServices 的服务

    在最近的 Service Fabric 社区问答第 24 版中 有很多关于在 Service Fabric 中使用 DefaultService 构造的讨论 ApplicationManifest xml以及它的缺点 Microsoft 建
  • 在 Service Fabric 应用程序中运行时 WebJob SDK 不工作

    我想在作为 Service Fabric 应用程序运行的无状态服务中使用 WebJob SDK 不幸的是我无法让它正常运行 以下是重现该问题的测试代码的一部分 ProcessMethod 永远不会被调用 触发的函数 ProcessNotif
  • Service Fabric:是否可以同时运行 Linux 和 Windows 节点

    是否可以在 Azure Service Fabric 上的同一群集中同时运行 Linux 和 Windows 节点 不 目前这是不可能的
  • 使用 Azure Service Fabric 部署的微服务的 API 网关/代理模式

    观看 Azure Service Fabric 的 BUILD 会议视频后 我一直在想象它如何适合我们当前基于微服务的架构 然而 有一件事我并不完全确定如何解决 API 网关 代理 考虑一个不那么简单的微服务架构 其中有 N 个服务在公开
  • Azure Service Fabric 和消息队列

    现在有了 Azure Service Fabric 是否还有使用单独的队列解决方案 例如 Windows Service Bus 的用例 缺点可能会成为新的单点故障 但有优点吗 队列可以添加一些缓冲 但另一方面 Service Fabric
  • Azure Service Fabric 中的可靠 blob 状态?

    是否有推荐的方法将 blob 用作 Azure Service Fabric 中的可靠状态 我看到两个选择 实现分块机制并将块存储在可靠的集合中 不过 这个选项的开发 维护负担相当重 外部存储 Blob Azure Blob 存储 不过 此
  • Kubernetes + Docker + AWS = Azure + Service Fabric 吗?

    我看到了 Kubernetes 的优势 其中包括滚动部署 自动运行状况检查监控以及在现有服务器发生故障时启动新服务器来采取行动 我也明白 Kubernetes 不仅仅适用于 Docker 所以 这带来了几个问题 当 Azure 和 Serv
  • Service Fabric 服务参考有黄色三角形

    我正在使用 VS2015 当我向服务结构应用程序添加服务时 引用有一个黄色三角形 我的错误窗口中没有错误 当我将鼠标悬停在参考上时 不会弹出任何内容 我怎样才能找出问题所在 否则 该解决方案可以正常构建并运行良好 This is VS 中的
  • 使用 Service Fabric 模板时出现错误的 dll 文件异常

    我们在客户端中遇到 Microsoft ServiceFabric Actors dll 文件问题 当我们使用Service Fabric模板创建项目时 dll文件存在于Service中 但不存在于客户端中 然后我们尝试从客户端项目引用该d
  • 无法对安全 Service Fabric 群集的 FabricClient 进行身份验证

    我有一个安全的服务结构集群 相同的证书用作服务器证书和客户端身份验证 我无法创建FabricClient在控制台应用程序中 它允许我连接到该集群 我正在使用记录的代码片段here https learn microsoft com en u
  • 动态 Servicefabric 设置和覆盖

    有没有办法完全不告诉服务有关设置 而只在应用程序级别提供它们 我仍然对 servicefabric 配置的工作方式不满意 据我所知 我必须在服务的 settings xml 中指定所有可能的配置值 然后我可以覆盖应用程序的 Applicat
  • 通过 RDP 远程访问 SF 节点

    如何远程连接到 SF 集群中的节点 由于这些只是虚拟机 我感觉我应该能够通过 RDP 访问它们 即使这是我通常想要避免的事情 我将如何进行远程处理 在 Vaclav 的答案中添加一些特定于 Service Fabric 的详细信息 标准 S
  • Service Fabric 重启应用程序

    我有一个在启动时从 KeyVault 读取的服务结构应用程序 当我们更改 KeyVault 值时 我们必须重新启动节点才能读取新值 这会导致同一节点上的其他应用程序出现故障 我正在尝试编写一个 PowerShell 脚本来重新启动服务结构应
  • Azure Service Fabric 节点、节点类型、实例和规模集

    在尝试了几天Azure的Service Fabric之后 我仍然对以下四个关键词感到不舒服 实例 节点 节点类型 规模设定 他们的意思是什么 有什么区别 Instance 取决于上下文 它可能意味着虚拟机 服务实例等 Node 集群内的节点
  • Service Fabric 本地集群设置错误

    点击下面的链接来设置和运行本地集群 https learn microsoft com en us azure service fabric service fabric create your first application in v
  • Service Fabric:删除了参与者,现在升级失败

    我正在尝试混合使用有状态和无状态参与者来升级 Service Fabric 应用程序 我做了一些重构 因此删除了一些我不再需要的演员 现在 当我尝试升级应用程序时 出现以下错误 在删除服务类型之前 必须显式删除服务 经过一番思考后 我thi
  • Service Fabric 有状态服务远程处理 V2

    我有一个由无状态服务调用的有状态服务 在 Visual Studio 15 4 上运行的 Net Standard Asp net Core 2 0 中 我无法使 Service Remoting V2 工作 适用于 V1 的有状态服务中的

随机推荐