在现代应用开发中,配置管理是一个非常重要的部分。随着微服务、容器化和云原生架构的流行,使用简单、易读的配置格式变得尤为重要。在 .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. 关于 apt 的一些命令

    apt update 用于 更新 包索引,包列表 apt install -y open-vm-tools-desktop fuse 安装 vm-tools 工具

  2. Litmus 实践:让群魔在混沌中乱舞,看 K8s 能撑到何时

    对于云服务而言,如果系统出现异常,将会带来很大的损失.为了最大程度地降低损失,我们只能不断探寻系统何时会出现异常,甚至缩小到某些特定参数变化是否会造成系统异常.然而随着云原生的发展,不断推进着微服务的 ...

  3. Runtime类的简单应用

    1.描述 Runtime:描述运行时状态. 在整个JVM中,Runtime类是唯一一个与JVM运行状态有关的类,且默认提供一个该类的实例化对象. 由于在每一个JVM进程中只允许提供一个Runtime类 ...

  4. C/C++ volatile restrict 用法

    volatile和restrict是C和C++中的两个关键字,都用于指示编译器优化. volatile volatile的本意是"易变的",用法和const一样: volatile ...

  5. Shell简单入门程序参考

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

  6. Redis数据结构:List类型全面解析

    文章目录 一.List数据类型 1.1 简介 1.2 应用场景 1.3 底层结构 二.数据结构 2.1 压缩列表ZipList 2.2 双向链表LinkedList(后续已废弃) 2.3 快速链表Qu ...

  7. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现二

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  8. aiflow部署文档

    aiflow部署文档 一.简介 本文档用来进行aiflow项目的完全部署 二.安装环境 2.1 安装系统镜像版本 使用Centos镜像文件:CentOS-7-x86_64-DVD-1908.iso c ...

  9. 接口自动化框架【python+requests+pytest+allure】需要安装的依赖包

    attrs == 23.2.0 certifi == 2024.2.2 cffi == 1.16.0 charset-normalizer == 3.3.2 colorama == 0.4.6 cry ...

  10. golang之JSON处理

    在强类型语言中,JSON 通常很难处理 -- JSON 类型有字符串.数字.字典和数组.如果你使用的语言是 javascript.python.ruby 或 PHP,那么 JSON 有一个很大的好处就 ...