开发中经常会碰到各种配置文件,尤其是运维,运维的口号就是“配置大于编码

这里总结整理下常见的配置文件类型,比如Windows较早的开发喜欢使用ini、java喜欢使用properties、较通用的yamljson等格式,本文也不会对这些格式进行排名,而是简单介绍一下这些格式,用户可以根据自己的实际情况进行选择。

这里只是简单介绍,后边会每种配置文件单独详细讲解。

ini

ini文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统。ini文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。mysql的配置文件就是ini格式的。
示例:

  1. [mysql]
  2. # 设置mysql客户端默认字符集
  3. default-character-set=utf8
  4. [mysqld]
  5. #设置3306端口
  6. port = 3306
  7. # 设置mysql的安装目录
  8. basedir=D:mysql\data
  9. # 允许最大连接数
  10. max_connections=200
  11. # 服务端使用的字符集默认为8比特编码的latin1字符集
  12. character-set-server=utf8
  13. # 创建新表时将使用的默认存储引擎
  14. default-storage-engine=INNODB

properties

properties是一种主要在Java相关技术中用来存储应用程序的可配置参数的文件的文件扩展名。它们也可以存储用于国际化和本地化的字符串,这种文件被称为属性资源包(Property Resource Bundles)。
每个参数被存储为一对字符串:一个存储名称参数(被称为“键”),另一个存储值。

每个properties 文件中的行通常存储单个属性。对于每一行可能有这么几种格式,包括键=值,键 = 值,键:值,以及键 值。
.properties文件可以使用井号(#)或叹号(!)作为一行中第一个非空白字符来表示它后面的所有文本都是一个注释。反斜杠(\)用于转义字符。下面是一个properties文件,表示spring的数据库配置:

  1. # ===============================
  2. # = DATA SOURCE
  3. # ===============================
  4. # Set here configurations for the database connection
  5. # Connection url for the database "netgloo_blog"
  6. spring.datasource.url = jdbc:mysql://localhost:3306/netgloo_blog?useSSL=false
  7. # Username and password
  8. spring.datasource.username = root
  9. spring.datasource.password = root
  10. # Keep the connection alive if idle for a long time (needed in production)
  11. spring.datasource.testWhileIdle = true
  12. spring.datasource.validationQuery = SELECT 1

json

JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析, 所以也常常用作配置文件。

JSON用于描述数据结构,有以下形式存在。

对象(object):一个对象以{开始,并以}结束。一个对象包含一系列非排序的名称/值对,每个名称/值对之间使用,分区
名称/值(collection):名称和值之间使用:隔开,一般的形式是:{name:value}
值的有序列表(Array):一个或者多个值用,分区后,使用[,]括起来就形成了这样的列表
字符串:以””括起来的一串字符。
数值:一系列0-9的数字组合,可以为负数或者小数。还可以用e或者E表示为指数形式。
布尔值:表示为true或者false。
JSON的格式描述可以参考RFC 4627。

下面是一个json配置文件的例子:

  1. {
  2. "listener": [{
  3. "tcp": {
  4. "address": "127.0.0.1:443"
  5. }
  6. }],
  7. "cluster_cipher_suites": "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
  8. "storage": {
  9. "consul": {
  10. "foo": "bar",
  11. "disable_clustering": "true"
  12. }
  13. },
  14. "telemetry": {
  15. "statsite_address": "baz"
  16. },
  17. "max_lease_ttl": "10h",
  18. "default_lease_ttl": "10h",
  19. "cluster_name":"testcluster",
  20. "ui":true
  21. }

xml

xml是一种标记语言。标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等。
XML是从1995年开始有其雏形,并向W3C(万维网联盟)提案,而在1998年二月发布为W3C的标准(XML1.0)。

XML设计用来传送及携带数据信息,所以也经常用来做配置文件。

xml实例:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
  6. <context:property-placeholder location="
  7. ${config.uri}/company.properties,
  8. classpath:product.properties,
  9. ${config.uri}/${product.name}/${product.version}/common.properties,
  10. ${config.uri}/${product.name}/${product.version}/${config.stage}/stage.properties,
  11. ${config.uri}/${product.name}/${product.version}/${config.stage}/${config.node}/node.properties"
  12. system-properties-mode="FALLBACK"/>
  13. <context:annotation-config/>
  14. <context:component-scan base-package="spring"/>
  15. </beans>

yaml

YAML(/ˈjæməl/,尾音类似camel骆驼)是一个可读性高,用来表达数据序列的格式。Clark Evans在2001年首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。目前已经有数种编程语言或脚本语言支持(或者说解析)这种语言。

YAML是”YAML Ain’t a Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言,但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

YAML的语法和其他高级语言类似,并且可以简单表达清单、散列表,标量等数据形态。它使用空白符号缩进和大量依赖外观的特色, 比较适合用来表达层次结构式的数据结构。

YAML 1.2 是 JSON 格式的超集。

  1. # my global config
  2. global:
  3. scrape_interval: 15s
  4. evaluation_interval: 30s
  5. # scrape_timeout is set to the global default (10s).
  6. external_labels:
  7. monitor: codelab
  8. foo: bar
  9. rule_files:
  10. - "first.rules"
  11. - "my/*.rules"
  12. remote_write:
  13. - url: http://remote1/push
  14. write_relabel_configs:
  15. - source_labels: [__name__]
  16. regex: expensive.*
  17. action: drop
  18. - url: http://remote2/push

toml

TOML是一种旨在成为一个小规模、易于使用的语义化的配置文件格式,它被设计为可以无二义性的转换为一个哈希表。
“TOML”这个名字是“Tom’s Obvious, Minimal Language(汤姆的浅显的、极简的语言)”的首字母略写词。“Tom”指它的作者Tom Preston-Werner。
TOML已在一些软件工程中使用,并且可在很多程序语言中执行。
TOML的语法广泛地由key = "value"[节名]#注释构成。
它支持以下数据类型:字符串、整形、浮点型、布尔型、日期时间、数组和图表。

  1. # This is a TOML document.
  2. title = "TOML Example"
  3. [owner]
  4. name = "Tom Preston-Werner"
  5. dob = 1979-05-27T07:32:00-08:00 # First class dates
  6. [database]
  7. server = "192.168.1.1"
  8. ports = [ 8001, 8001, 8002 ]
  9. connection_max = 5000
  10. enabled = true
  11. [servers]
  12. # Indentation (tabs and/or spaces) is allowed but not required
  13. [servers.alpha]
  14. ip = "10.0.0.1"
  15. dc = "eqdc10"
  16. [servers.beta]
  17. ip = "10.0.0.2"
  18. dc = "eqdc10"
  19. [clients]
  20. data = [ ["gamma", "delta"], [1, 2] ]
  21. # Line breaks are OK when inside arrays
  22. hosts = [
  23. "alpha",
  24. "omega"
  25. ]

HOCON

HOCON,全称Human-Optimized Config Object Notation(人性化配置对象表示法)是一种人类可读的数据格式,并是JSON和properties的一个超集。它由Lightbend(用Scala开发的人都知道)开发,主要与Play框架结合使用。它也在Puppet中作为配置格式使用。
基本上也算是Scala官方开发,所以在Scala的一些项目中得到使用。由于它是JSON和properties格式的超集,所以它的格式比较灵活。
格式定义可以参考官方文档: HOCON
下面是它的一个实例:

  1. play.http.secret.key = "changeme"
  2. play.modules {
  3. # Disable built-in i18n module
  4. disabled += play.api.i18n.I18nModule
  5. # Enable Hocon module
  6. enabled += com.marcospereira.play.i18n.HoconI18nModule
  7. }
  8. play.i18n {
  9. langs = [ "en" ]
  10. }

plist

在OS X的Cocoa,NeXTSTEP和GNUstep编程框架中,属性列表(Property List)文件是一种用来存储序列化后的对象的文件。属性列表文件的文件扩展名为.plist,因此通常被称为plist文件。
Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息,该功能在旧式的Mac OS中是由资源分支提供的。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
  3. "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  4. <plist version="1.0">
  5. <dict>
  6. <key>Label</key>
  7. <string>com.plex.pms</string>
  8. <key>KeepAlive</key>
  9. <true/>
  10. <key>ProgramArguments</key>
  11. <array>
  12. <string>/Applications/Plex\ Media\ Server.app/Contents/MacOS/Plex\ Media\ Server</string>
  13. </array>
  14. <key>RunAtLoad</key>
  15. <true/>
  16. <key>UserName</key>
  17. <string>__USERNAME__</string>
  18. <key>WorkingDirectory</key>
  19. <string>/Applications</string>
  20. <key>ServiceDescription</key>
  21. <string>PMS</string>
  22. </dict>
  23. </plist>

总结

  • 所谓配置文件,就是认为规定的一种数据组织格式,用以实现配置的能力
  • 配置文件各有优劣势,没有最好的,只有适用的
  • 适合人类编写:ini > toml > yaml > json > xml > plist
  • 可以存储的数据复杂度:xml > yaml > toml ~ json ~ plist > ini
  • 程序员要知道常见的配置文件类型,并活学活用一部分常用配置
  • 开发常用:
    • 安装软件配置Windows通常是ini,macOS通常是plist
    • Spring开发你肯定躲不开XML配置,而且XML也是很多框架(比如Mybatis)、通信协议(比如WebService、WebScoket)等的配置文件,更是很多图形界面开发的通用配置文件(Andorid、IDEA开发等等)
    • yaml是k8s通用配置,也是SpringBoot开发必备配置文件
    • json是js/nodejs开发必备,也是前端的基础中的基础
  • 目前使用较多的是yml,相对来说 简洁又兼顾功能强大