在现代应用开发中,配置管理是一个非常重要的部分。随着微服务、容器化和云原生架构的流行,使用简单、易读的配置格式变得尤为重要。在 .NET 开发中,虽然 JSON 是默认的配置文件格式,但 YAML("YAML Ain't Markup Language")正越来越受到开发者的青睐。

YAML 是什么?

YAML 是一种人类可读的数据序列化标准,常用于配置文件。它以其简洁的语法和对层次结构的友好支持,成为管理复杂配置的热门选择。


使用 YAML 的优势

1. 可读性强,适合复杂配置

YAML 以缩进表示层次结构,减少了括号和逗号等符号的使用,使配置文件更加简洁直观。

  • JSON 示例

    {
    "Logging": {
    "LogLevel": {
    "Default": "Information",
    "Microsoft": "Warning",
    "Microsoft.Hosting.Lifetime": "Information"
    }
    }
    }
  • YAML 示例
    Logging:
    LogLevel:
    Default: Information
    Microsoft: Warning
    Microsoft.Hosting.Lifetime: Information

    YAML 更加贴近人类语言,尤其在嵌套结构较多时,可读性远高于 JSON。

2. 支持多种数据类型

YAML 支持字符串、数字、布尔值、数组和字典等多种数据类型,且语法简洁。例如:

AppSettings:
Enabled: true
MaxRetries: 5
Endpoints:
- https://api.example.com
- https://backup.example.com
3. 适合 DevOps 和云原生场景

YAML 是 Kubernetes 和 CI/CD 工具(如 GitHub Actions、Azure Pipelines)的标准配置语言。使用 YAML 统一配置语言可以减少工具之间的学习成本和切换成本。

4. 灵活的注释支持

YAML 支持注释功能(使用 #),开发者可以在配置文件中添加详细的注释,方便团队协作和配置维护。

# 应用程序设置
AppSettings:
Enabled: true # 是否启用功能
MaxRetries: 5 # 最大重试次数
5. 更好的合并和覆盖能力

YAML 文件的层次结构和键信息可以轻松支持配置的合并与覆盖。这对于微服务架构中的多环境(开发、测试、生产)配置管理非常方便。


在 .NET 中使用 YAML 配置文件

虽然 .NET 默认支持 JSON 配置文件,但通过引入一些库,可以轻松实现 YAML 配置的支持。

1. 使用 YamlDotNet 解析 YAML

YamlDotNet 是一个流行的 .NET 库,用于解析和生成 YAML 文件。

安装 NuGet 包:

dotnet add package YamlDotNet

YamlDotNet读取 YAML 文件示例:

using System;
using System.IO;
using YamlDotNet.Serialization;
using YamlDotNet.Serialization.NamingConventions; var yaml = File.ReadAllText("appsettings.yaml");
var deserializer = new DeserializerBuilder()
.WithNamingConvention(CamelCaseNamingConvention.Instance) // 使用驼峰命名约定
.Build();
var config = deserializer.Deserialize<Dictionary<string, object>>(yaml); Console.WriteLine(config["AppSettings"]);
2. 集成 YAML 与 ASP.NET Core 配置系统

通过第三方包,如 Microsoft.Extensions.Configuration.Yaml,可以直接将 YAML 文件集成到 ASP.NET Core 的配置管道。

安装 NuGet 包:

dotnet add package Microsoft.Extensions.Configuration.Yaml

Program.cs 中添加 YAML 配置支持:

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddYamlFile("appsettings.yaml", optional: true, reloadOnChange: true);

var app = builder.Build();
app.Run();

多环境配置管理与 Patch 技术

在实际开发中,应用需要针对不同环境(开发、测试、生产)设置不同的配置。通过 YAML 和配置覆盖技术,可以简化多环境配置管理。

1. 多环境配置文件

可以为不同环境创建多个 YAML 文件,例如:

  • appsettings.yaml: 默认配置
  • appsettings.Development.yaml: 开发环境配置
  • appsettings.Production.yaml: 生产环境配置
2. 配置文件的加载顺序

在 .NET 中,可以通过以下代码按顺序加载配置文件:

var builder = WebApplication.CreateBuilder(args);

builder.Configuration
.AddYamlFile("appsettings.yaml", optional: true, reloadOnChange: true)
.AddYamlFile($"appsettings.{builder.Environment.EnvironmentName}.yaml", optional: true, reloadOnChange: true); var app = builder.Build();
app.Run();

加载时,后面的文件会覆盖前面的配置。例如,appsettings.Production.yaml 的设置会覆盖 appsettings.yaml 中的默认值。

3. 使用 Patch 技术动态调整配置

YAML 支持通过层次化的结构灵活地合并和覆盖配置。例如,通过工具或代码动态应用补丁:

  • YAML Patch 示例

    Logging:
    LogLevel:
    Default: Debug # 修改默认日志级别
  • 在代码中合并补丁:
    var patchYaml = File.ReadAllText("patch.yaml");
    var patchConfig = deserializer.Deserialize<Dictionary<string, object>>(patchYaml); foreach (var key in patchConfig.Keys)
    {
    originalConfig[key] = patchConfig[key];
    }

这种动态补丁机制非常适合热更新配置或应对突发的环境需求。


YAML 配置的适用场景

1. 微服务架构

微服务需要管理复杂的配置文件,如服务发现、负载均衡、日志记录等。YAML 简洁的格式非常适合这类场景。

2. DevOps 工具链

在 Kubernetes、Docker Compose 和 CI/CD 工具中,YAML 是事实上的标准。如果 .NET 应用也使用 YAML 配置,能够无缝对接这些工具。

3. 多环境配置管理

对于开发、测试、生产等多环境配置,YAML 的层次化结构和易读性更便于团队协作。


YAML 配置的注意事项

尽管 YAML 有诸多优势,但在使用时仍需注意:

  1. 严格的缩进要求:缩进错误可能导致解析失败,应统一缩进风格(如使用 2 个或 4 个空格)。
  2. 文件合并冲突:多人协作时,复杂的层次结构可能增加文件合并的难度。
  3. 性能问题:YAML 文件解析速度稍逊于 JSON,对于极端性能敏感的场景需评估解析性能。

总结

YAML 在 .NET 中作为配置文件格式的优势显而易见:

  • 它简洁直观,可读性强,特别适合复杂配置。
  • 支持多种数据类型和注释功能,方便团队协作。
  • 与 Kubernetes 等现代云原生工具链的兼容性极高。

通过引入合适的库,.NET 开发者可以轻松使用 YAML 管理应用配置,提升开发效率并优化配置管理流程。如果你的项目需要处理复杂的配置文件或者与云原生生态紧密集成,YAML 无疑是一个值得尝试的选择。

为什么推荐在 .NET 中使用 YAML 配置文件的更多相关文章

  1. Kubernetes 笔记 05 yaml 配置文件详解

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. Hi,大家好, ...

  2. Spring Boot: Yaml配置文件 以及 @ConfigurationProperties属性获取

    Yaml配置文件 概述 Spring Boot在支持application.properties配置文件的同时,也支持application.yaml配置文件. 配置文件中的属性,可以通过: 通过@V ...

  3. 【Flutter 实战】pubspec.yaml 配置文件详解

    老孟导读:pubspec.yaml 文件是 Flutter 中非常重要的配置文件,下面就让我们看看里面各个配置的含义. pubspec.yaml 是 Flutter 项目的配置文件,类似于 Andro ...

  4. struts2中struts.xml配置文件详解【未整理】

    1.    深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1.    包配置: Struts2框架中核心组件就是Action.拦截器等,Struts2框架使用包来管 ...

  5. python的logging模块之读取yaml配置文件。

    python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...

  6. Spring Boot入门(一):使用IDEA创建Spring Boot项目并使用yaml配置文件

    由于公司最近在做技术转型(从.Net转Java),因此自己也开启了学习Java之路.学习Java怎么能不学习这几年这么火的Spring Boot框架,由于自己有总结的习惯,因此会把学习的过程以博客的形 ...

  7. Asp.net中web.config配置文件详解(一)

    本文摘自Asp.net中web.config配置文件详解 web.config是一个XML文件,用来储存Asp.NET Web应用程序的配置信息,包括数据库连接字符.身份安全验证等,可以出现在Asp. ...

  8. python+Appium自动化:读取Yaml配置文件

    Yaml简介 Yaml:"Yet Another Markup Language"(是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名 ...

  9. Spring Boot2 系列教程 (五) | yaml 配置文件详解

    自定义属性加载 首先构建 SpringBoot 项目,不会的看这篇旧文 使用 IDEA 构建 Spring Boot 工程. 首先在项目根目录 src >> resource >&g ...

  10. python pyyaml操作yaml配置文件

    在测试工作中,可以使用yaml编写测试用例,执行测试用例时直接获取yaml中的用例数据进行测试(如:接口自动化测试) 1.什么是yaml 是一种可读的数据序列化语言,通常用于配置文件 非常简洁和强大, ...

随机推荐

  1. 小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM

    小米 13T Pro 是一款性能卓越.设计精美的旗舰机型,具备多项领先配置,且在与前一代产品及友商机型的对比中优势明显,值得深入探讨. 性能提升 小米 13T Pro 搭载了最新的 天玑 9200+ ...

  2. std::variant快速上手

    std::variant 是 C++17 引入的一种类型安全的联合体,用来存储多个可能类型中的一种值,且保证使用时的类型安全.相比于传统的 union,std::variant 不仅能够存储不同类型的 ...

  3. USB协议详解第7讲(补充-USB帧和微帧剖析)

    1.概念 (1)USB2.0帧和微帧属于物理层时间基准的概念,低速和全速下每个帧时长为1ms,高速下每个帧又分为8个微帧,即每个微帧时长为125us. (2)USB主机和设备控制器同步后,每个微帧起始 ...

  4. find_sys_call_table和kallsysms_lookup_name的区别

    find_sys_call_table 和 kallsyms_lookup_name 都可以用于查找内核符号,但它们的具体作用和使用场景有所不同.以下是两者的详细对比: 1. find_sys_cal ...

  5. nestjs 登录和验证码结合验证 svgCaptcha 包 session 会话标识

    // ps: 现在用户验证使用 token jwt 了 代替了 session // session 是服务器为每个用户建立的唯一标识 以区分用户 会话标识 // session 是express中的 ...

  6. Ex-BSGS

    给定\(a,p,b\),求\(a^x\equiv b \pmod p\)的最小自然数\(x\) . 保证\(\sum \sqrt p \leq5\times 10^6\) 当\(a=p=b=0\)时, ...

  7. MIL-STD-1553B总线通信模块(1553B板卡)

    MIL-STD-1553B总线通信模块(1553B板卡)产品具有以下特点: 1.产品覆盖多种接口CPCI/PXI/PCI/PC104/PC104+/USB等,满足用户不同平台的使用要求: 2.自主知识 ...

  8. 云原生爱好者周刊:Fluentbit Operator 正式成为 Fluent 子项目

    云原生一周动态要闻: Fluentbit Operator 正式成为 Fluent 子项目 Kubernetes 1.22 发布 Rust Cloud Native 组织成立 CNCF 宣布 Graf ...

  9. KubeSphere 后端源码深度解析

    这篇文章我们将学习在 vscode 上的 ssh remote 插件基础上,尝试 debug 和学习 KubeSphere 后端模块架构. 前提 安装好 vscode 以及 ssh remote co ...

  10. Shell简单入门程序参考

    目录 0 前言 0.1 shell初试 1 程序功能 1.1 显示当前主机名和IP地址. 1.1.1 if 语句 详解 1.2 创建目录或者文件 1.3 修改文件属性 1.3.1 chmod 修改文件 ...