写点什么

YAML 初探

发布于: 16 小时前
YAML初探

一 简介

YAML(读音:[ˈjæməl]),即:YAML Ain't a Markup Language 的递归缩写(这里插一句解释,递归缩写(Recursive acronym)递归首字缩写,是一种在全称中递归引用它自己的缩写。)。官网:https://yaml.org/

由于其可读性高,故常用来表达数据序列化的格式。YAML 参考了其他多种语言,包括:C、Python、Perl,并从 XML、电子邮件的数据格式(RFC 2822)中获得灵感。Clark Evans 在 2001 年首次发表了这种语言,另外 Ingy döt Net 与 Oren Ben-Kiki 也是这语言的共同设计者。当前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

二 应用场景

在我的经历中,yaml 最常用的地方是 kubernetes 的配置文件,其次是工程代码中作为配置文件,用于配置一些变量,例如依赖的服务环境,数据库地址、端口,其他环境信息等等,用于替代或结合.properties 配置文件来使用。

在 K8S 中,yaml 配置文件就是 K8S 资源对象的说明书,定义了对象包含的元素及采取的动作,每种对象都可以通过 yaml 配置文件来创建。deployment,还有 service 都是通过 yaml 文件来做配置的。

三 YAML 数据格式

在阮一峰的文章: YAML 语言教程中,指出 YAML 支持的数据结构有三种:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)

  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)

  • 纯量(scalars):单个的、不可再分的值。

json 中同样也会有对象和数组结构,这里我们做个简单的对比,通过下面的示例:

json 结构:

{  "apiVersion": "v1",  "kind": "Pod",  "metadata": {        "name": "xx"  }  "spec": {        "containers": [{            "name": "front-end",            "image": "nginx",            "ports": [{                "containerPort": "80"            }]        }, {            "name": "flaskapp-demo",            "image": "jcdemo/flaskapp",            "ports": [{                "containerPort": "5000"            }]        }]  }}
复制代码

如果我们把上面的结构用 yaml 表示,那么会是下面的结构:

---apiVersion: v1kind: Podmetadata:  name: xxspec:  containers:    - name: front-end      image: nginx      ports:        - containerPort: 80    - name: flaskapp-demo      image: jcdemo/flaskapp      ports: 8080
复制代码

如果大家看过我之前容器系列的文章,那么应该能够了解大概的涵义,这个文件简单地定义了一个 Pod 对象,包含两个容器。

四 YAML 语法

既然定义为一种语言,那么就必然会有规范,也就是我们经常说的语法。YAML 的基本语法包括:

1、大小写敏感

2、使用缩进表示层级关系

3、禁止使用 tab 缩进,只能使用空格键

4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级

5、使用 #表示注释

6、字符串可以不用引号标注

除此之外,针对特殊字符的处理,会涉及单引号和多引号的处理:

单引号: 将字符串里面的特殊字符转义为字符串处理

name: '123\n123'输出: 123\n123
复制代码

双引号: 不会转义字符串里面的特殊字符,特殊字符作为本身想表示的意思。

name: "123\n123" 输出: 123 换行 123
复制代码

null 或~表示空值; iso-8601 标准表示日期;使用感叹号!实现强制转换数据类型,单叹号通常是自定义类型,双叹号是内置类型。

五 语法检测工具

开发过程中,有时候为了验证 yaml 是否符合语法要求,会对文件进行语法检验。idea 内安装了 yaml 支持的插件;另外,也可以通过在线的语法校验工具来做检查,我常用的就是 BEJSON:https://www.bejson.com/validators/yaml_editor/


发布于: 16 小时前阅读数: 7
用户头像

磨炼中成长,痛苦中前行 2017.10.22 加入

微信公众号【程序员架构进阶】。多年项目实践,架构设计经验。曲折中向前,分享经验和教训

评论

发布
暂无评论
YAML初探