如何在多个部署环境中管理微服务架构中的配置文件?

How to manage configuration files in microservice architecture among multiple deployment environments?

我正在寻找一种方法来管理使用微服务架构 (.NET Core) 的大型系统中多个模块的配置文件。

目前我们有 5 个模块并且还在增加。每个模块包含 2 个项目(比如 UI 和 API)。每个项目对 Dev、Staging、Production 3 个环境都有不同的配置。

5 个模块 x 2 个项目 x 3 个环境 = 30 个配置文件。

许多项目需要为所有开发环境逐字重复相同的配置值(例如,共享包需要配置)。

大多数情况下,每个项目和环境都需要相同的配置,但有时会有所不同,有时完全是项目特定的。

这只会变得更糟。将添加更多模块,配置文件将变得更大。我正在考虑的一个解决方案是编写一个脚本,该脚本根据具有所有项目和环境的所有值的主配置文件在所有配置文件中查找和替换。

但即便如此,我仍不确定如何布局主配置文件或明确哪些配置键属于哪些项目。

这变得非常难以管理,我想知道是否有人有好的管理流程?

使用 Azure Key Vault 怎么样?

Key Vault 充当您的主配置文件。

然后您将拥有每个环境的 Key Vault - 开发、暂存、生产。

通用配置在微服务架构中是一种诅咒。 整点 是它们应该是离散的、独立的功能单元。如果一个或多个人在做同样的事情,那么你没有正确地细分你的域。

唯一的例外是检测:日志记录、分析、跟踪等。如果这是您在这里谈论的内容,那么您可以通过多种方式处理它。

  1. 您可以为您的检测使用单独的配置源,它甚至不需要在项目本地。比如你可以创建一个像instrumentation.json这样的文件,把它放在一个常用的共享位置,然后在Program.cs:

    CreateDefaultWebBuilder()
        ConfigureAppConfiguration(builderContext, config) =>
        {
            config.AddJsonFile(@"\path\to\instrumentation.json", optional: false, reloadOnChange: true)
         })
         .Run();
    

    您甚至可以为检测设置特定于环境的 JSON:

    IHostingEnvironment env = builderContext.HostingEnvironment;
    config.AddJsonFile($@"\path\to\instrumentation.{env.EnvironmentName}.json", optional: true, reloadOnChange: true)
    
  2. Docker 有自己的 configuration/secrets 设置,您可以使用它来设置环境变量,或者基本上您想要将它提供给应用程序。参见:https://docs.docker.com/engine/swarm/secrets/

  3. 您可以使用分布式配置源,例如 Azure Key Vault。如果您不想专门使用它,SQL Server 或 Redis 之类的东西也可以,但您必须为它们创建自定义配置提供程序或获取现有的第三方库。

试用https://microconfig.io

它专为管理具有多个环境的微服务配置而设计。