Browse Category: 后端

toml 简介

toml

1. 简介

编程中经常需要使用配置文件,常见配置文件有用INI, XML, JSON, YAML 语言编写,它们的表达力越来越强,同时书写便捷性也在不断提升。

TOML 全称: Tom’s Obvious, Minimal Language, 对应中文为 Tom的(语义)明显、(配置)最小化的语言。

TOML 是前GitHub CEO, Tom Preston-Werner,于2013年创建的语言,其目标是成为一个小规模的易于使用和阅读的语义化配置文件格式。

TOML 被设计成可以无歧义地映射为哈希表, 而编程语言中都会有类似哈希表的数据结构,从而可以很容易的被各种语言解析。

需要注意: 此规范当前为0.4 版,仍然会发生很多变化。

2. 语法

toml 语法规范

  • TOML是大小写敏感的。
  • TOML文件需要是UTF-8 编码。
  • 空格是指制表符(0x09) 或空格 (0x20)。
  • 换行符是指LF(0x0A)或CRLF (0x0D0A)。

配置示例

3. 变量类型

  • 字符串
  • 整数
  • 浮点数
  • 布尔
  • 日期
  • 数组
  • 嵌套表
  • 内联表
  • 表数组

注释

用符号#来表示注释:

键名

键值对左边是键,右边是值。键名和值周围的空格都将被忽略,键、等号和值,一定要在同一行(有些值可以多行表示)

键可以是裸键,或者由双引号包括,不可以是单引号。

裸键 仅包含字母、数字、下划线和破折号。

引号键 遵循基本字符串的规则,可以使用更广泛的键名。除非有必要,否则建议使用裸键。

字符串

有四种表示方法:基本字符串、多行基本字符串、字面量和多行字面量。

基本字符串 双引号括起来的任意字符串,包含双引号、反斜杠和控制字符等转义字符。

多行基本字符串 三个双引号括起来的字符串,允许换行,所以可以将很长的字符串分成多行。

注意: 行尾存在\ 时,将会删除当前位置到下个非空字符或结束界定符之间的所有空格(包括换行符),该特性可以用于编写长字符串。所有的转义字符在多行基本字符串有效。

字面量字符串的特点是不允许转义,有基本字面量字符串和多行字面量字符串。

字面量字符串 是被单引号包含的字符串,跟基本字符串一样,它们一定是以单行出现:

因为不支持转义,所以字面量字符串里面没有办法写单引号。但是可以在多行字面量字符串中使用。

多行字面量字符串 被三个单引号括起来的字符串,允许换行。

紧跟起始界定符的换行符会被剪掉。界定符之间的所有其他内容都会被按照原样解释而不会被转义。

对于二进制数据,建议你使用Base64或其他适合的编码,比如ASCII或UTF-8编码。具体的处理取决于特定的应用。

整数

整数是没有小数点的数字。正数前面也可以用加号,负数需要用负号前缀。

对于大整数,可以用下划线提高可读性。每个下划线两边至少包含一个数字。

前导零是不允许的。也不允许十六进制(Hex)、八进制(octal)和二进制形式。

TOML 中不能表示诸如“无穷”和“非数字”,不能用一串数字表示的值。数字范围是64位从−9,223,372,036,854,775,808 到9,223,372,036,854,775,807。

浮点数

一个浮点数由整数部分(可能是带有加号或减号前缀的)和小数部分和(或)指数部分组成的数。如果只有小数部分和指数部分,那么小数部分必须放在指数部分前面。

小数部分是指在小数点后面的一个或多个数字。

指数部分是指E(大写或小写)后面的整数部分(可能用加号或减号为前缀)

和整数类似,你可以用下划线来提高可读性。每个下划线两边至少包含一个数字。

数据精度为64位 (double)。

布尔值

布尔值是小写的true和false。

时间日期

时间日期是RFC 3339中的时间格式。

数组

数组是由方括号包括的数据类型,元素由逗号分隔,元素的数据类型不能混用(所有的字符串均为同一类型,但是整形和浮点型是两种类型)。

数组可以写成多行,解析时会忽略空格和换行符。结束括号之前可以存在逗号。

表(也被称为哈希表或字典)是键值对集合,且键值对是无序的。表名由方括号括起,自成一行。

表的范围是在表名之下,直到下一个表或文件尾(EOF)之间都是该表的键值对。

表和数组相区分,数组里只有值。

嵌套表

使用点(.)来表示嵌套表,点前面的部分属于父表,点后面的部分属于子表。

等价于如下JSON格式:

编写时,你可以不用定义每一层父表(super-tables)。

只要父表没有被直接定义,而且没有定义特定的键,你可以继续写入。

你不能多次定义键或表。这样做是无效的。

被点分隔部分周围的空格都会被忽略,但是最好不要使用任何多余的空格

所有的表名和键一定不能为空

内联表

内联表提供一种更紧凑的语法来表示表,内联表是由大括号{}括起来的,在大括号内可以存在零个或多个逗号分隔的键值对。

内联表里的键值对跟标准表里的键值对形式一样并且允许所有的值类型,包括内联表。

内联表一般以单行出现。不允许换行符出现在大括号之间,除非是包含在值中的有效字符。
即便如此,也强烈建议不要在把内联表分成多行。如果你有这种需求,那么你应该去用标准表。

对应标准表定义:

表数组

表数组使用双中括号包裹表名,使用相同双括号名的每个表都是数组中的元素。表的顺序跟书写顺序一致。没有键值对的双括号表会被当作空表。

等价于如下JSON格式:

你也能创建内嵌的表数组。只需要对子表使用相同的双括号语法就可以。

上面的TOML对应于下面的JSON格式:

PHP toml 解析演示

安装解析库

解析示例

资料

Consul 入门笔记

Consul [ˈkɑ:nsl] 是一个分布式的服务发现和配置管理工具,本文是根据consul 入门指南 整理的笔记。

1. 安装

系统是三台虚拟机:

  • CentOS release 6.8
  • CentOS release 7
  • Ubuntu 16.04 LTS

前往 官网下载地址 下载相应系统最新的二进制包,复制consul_VERSION_linux_amd64.zip 到3个节点的 consul 目录下。

在3台虚拟机中按相同步骤安装 consul

2. 开发模式

consul 开发者模式,可以快速开启单节点的 consul服务,具有完整功能,方便开发测试。

2.1 启动开发模式

开发模式命令:

consul members 命令查看当前集群的节点情况

通过HTTP API 查看节点信息

2.2 服务注册

服务可以通过配置文件注册,也可以通过HTTP API 添加。这里以配置文件定义服务:

如果需要定义多个服务,添加多个服务配置文件即可

2.3 服务发现

当定义服务并且重启consul 代理后,就可以通过HTTP API 查询服务信息。

3. Consul 集群

consul 是一个CS 模式的软件,生产环境下一个集群中建议准备3~5个节点运行服务模式的consul,其他节点运行客户端模式。

3.1 启动server 模式

  • -server 以服务模式运行
  • -node 节点名称
  • -bind 指定监听地址,用于多网卡服务器
  • -bootstrap-expect 额外的服务模式节点数量
  • config-dir 配置文件目录

3.2 启动client 模式启动

在集群中其他节点上以客户端模式运行consul,注意更改绑定IP 和节点名。

3.3 加入集群

客户端模式的consul 需要加入一个服务端节点,才能同步服务信息。

加入集群:

查看集群节点:

客户端节点服务发现功能

参考

OpenResty 环境搭建

OpenResty 是一个基于Nginx 与Lua 的高性能Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。本文是根据 openresty 官网 指南搭建OpenResty 服务的笔记。

1 安装 OpenResty

系统 Ubuntu 16.04 LTS

1.1 安装依赖库

1.2. 编译安装 OpenResty

下载地址 https://openresty.org/en/download.html

编译安装命令

VERSION 是下载的openresty 具体版本号。

make install 后应用在 /usr/local/openresty/bin/openresty 目录。

2. 启动服务

准备项目目录

2.1 配置 nginx.conf

OpenResty 是Nginx 与Lua 的封装,最终用运行的还是nginx。

~/work/conf/nginx.conf

2.2 启动 nginx

启动 nginx

如果觉得每次使用/usr/local/openresty/nginx/sbin/nginx 不方便,可以设置环境变量:

~/.bashrc

执行 source ~/.bashrc 使配置生效。

2.3 测试 nginx

测试条件1: 基于 lua 模块响应文本

测试条件2: 打印参数

注意 因为我们手动指定了nginx 的配置文件和执行临时目录,所以重启nginx 时,也需要带上相关配置。重启命令如下:

参考