什么是YAML?

YAML:数据序列化语言介绍
本文介绍了YAML这种数据序列化语言,它是一种可读的文本数据结构,设计目标是让人易读、程序易处理。它类似XML但更简单,主要关注动态编程语言中的数据结构和类型。文中还介绍了YAML的语法,以及Ruby对其的支持。

作者  liubin                http://www.ruby-cn.org/

本文地址  http://www.ruby-cn.org/articles/what_is_yaml.html

1.YAML ="YAML Ain't Markup Language"

    官方网站的解释是YAML ="YAML Ain't Markup Language"(缩写为YAML)。这是一种数据序列化(serialization )语言,是一种可读的文本的数据结构,它的设计目标是使人们容易读,程序容易处理。它类似XML,但是比XML简单。

 

2.设计目标:

     YAML的设计目标如下:

  1. YAML 文档很容易阅读。
  2. YAML 使用本地结构存储数据。
  3. YAML 数据在编程语言之间是可移植的。
  4. YAML 有一个固定的模型来支持一般的开发工具。
  5. YAML 支持基于流的处理。
  6. YAML 表现力强,而且容易扩充。
  7. YAML 容易实现和使用。

3.和XML的关系

    新手总是试图了解YAML和XML的关系,这两种语言在某些领域是处于竞争之中,除此没有什么直接关系。

    YAML 首先是一种数据序列化语言,而XML则是向后继承了SGML(Standard Generalized Markup Language)。XML试图做到面面俱到,它试图成为一种文档格式、数据格式、消息包格式、安全的 RPC 通道(SOAP)甚至XML数据库;而YAML只关注有限的领域,它只是清晰地表示在动态编程语言(如 Perl、Python、Ruby)中所遇到的数据结构以及数据类型。目前,对于这些语言,已经有了一些绑定/库。
需要指出,我们已经开始做XML/YAML MAPPING的工作了,更多的信息可以访问: http://yaml.org/xml/

4.YAML初步

    YAML中数据主要由序列(sequence),map(有的也叫做hash)和标量(scalar )来表示。语法比较简单,易于人们阅读。

  • 注释由#开头
  • 序列由"-"开头
  • map用key:value的格式
  • "---"表示一个yaml文档的开始
  • list和hash可以嵌套
  • block的概念:一个 block 是一段文本。
  • Inline Collections:数据都写在一行

例子:

1。序列
- apple 
- banana 
- carrot 
2。嵌套序列
- apple 
- 
 - foo 
 - bar 
 - x123 
- banana 
- carrot 
3。map
foo: whatever 
bar: stuff 
4。map和sequence嵌套
foo: whatever 
bar: 
 - uno 
 - dos 
5。map嵌套
foo: whatever 
bar: 
 fruit: apple 
 name: steve 
 sport: baseball 
6。inline hash
--- 
 hash: { name: Steve, foo: bar }

 

5.Ruby中的YAML支持

    Ruby1.8已经包含了YAML支持了。只需要require进来就行了。

一个例子:

# file name yaml.rb

require 'yaml'

class Person

  attr_accessor :name, :sex, :age, :email

  def initialize(n,s,a,e)
    @name=n
    @sex=s
    @age=a
    @email=e
  end

end

#创建一个对象
person=Person.new("liubin","male",25,"liubin@huangpuzhuang.com")
puts (person.to_yaml) # 打印序列化之后的结果

#从person.yml创建对象
person2 = YAML::load( File.open( 'person.yml' ) )
puts (person2.to_yaml)
puts person2.class # 结果是Person
puts person2.name

 person.yml文件:

--- !ruby/object:YAML::Person            
age: 18
email: xyz@huangpuzhuang.com
name: xyz
sex: female

 

   注意person.yml中第一行“--- !ruby/object:YAML::Person   ”是不可缺的,否则person2.class返回Hash,而person2.name也会出错

  

 

程序执行情况如下:
C:/>ruby yaml.rb
--- !ruby/object:Person
age: 25
email: liubin@huangpuzhuang.com
name: liubin
sex: male
--- !ruby/object:Person
age: 18
email: xyz@huangpuzhuang.com
name: xyz
sex: female
Person
xyz

 

总结:yaml东西很多,不是一时半会能学会和讲清楚的,希望我们一起学习。接下来请看我的另一篇文章:http://www.ruby-cn.org/articles/yaml_in_5_minutes.html,也许会更了解yaml。

参考资料:

1.ruby语言主页:http://www.ruby-lang.org/

2.yaml主页:http://yaml.org/

<think> 我们首先解读配置字符串:'nacos:app.yaml?group=PROD_GROUP nacos:db.yaml?refresh=true' 这个配置出现在spring.config.import中,表示从Nacos配置中心导入两个配置文件。 1. 配置项分解: - `nacos:app.yaml?group=PROD_GROUP`:表示从Nacos配置中心加载Data ID为`app.yaml`,且分组为`PROD_GROUP`的配置文件。 - `nacos:db.yaml?refresh=true`:表示从Nacos配置中心加载Data ID为`db.yaml`的配置文件(使用默认分组,通常为`DEFAULT_GROUP`),并开启自动刷新(refresh=true)。 2. app.yaml的作用: - 在Nacos中,`app.yaml`通常用于存放应用级别的配置,例如应用名称、端口、日志级别等通用配置。 - 通过指定`group=PROD_GROUP`,表示这个配置属于生产环境分组。这样,同一个应用在不同的环境(如DEV, TEST, PROD)可以使用不同的配置。 3. 为什么不是配置Nacos服务? - 问题中提到的“为何nacos配置不是配置nacos服务”可能是指:为什么在`spring.config.import`中配置的是具体的配置文件(如app.yaml)而不是Nacos服务器地址? - 实际上,Nacos服务器的地址(server-addr)已经在`spring.cloud.nacos.config.server-addr`中配置过了。因此,在导入配置时,只需要指定要加载的配置文件的Data ID和Group即可,无需重复配置服务器地址。 4. 关于配置的动态刷新: - 在`db.yaml`的配置中,我们看到了`refresh=true`参数。这表示当Nacos中的这个配置文件发生变化时,应用会动态刷新配置(即无需重启应用即可生效)。 - 注意:`app.yaml`没有设置`refresh`参数,所以默认是不会动态刷新的(除非在全局配置中设置了自动刷新)。 5. 配置加载顺序: - 在Spring Boot 2.4及以上版本中,通过`spring.config.import`导入的配置,其加载顺序是按照声明的顺序。因此,先加载`app.yaml`,再加载`db.yaml`。如果两个配置中有相同的配置项,则后面的配置会覆盖前面的。 6. 关于Nacos配置的Data ID和Group: - Data ID:可以理解为配置文件的名称,通常采用`${spring.application.name}.${file-extension}`的形式,但这里直接指定为`app.yaml`和`db.yaml`,说明这些配置文件可能是多个应用共享的配置。 - Group:用于区分不同环境或不同业务的配置分组。例如,`PROD_GROUP`表示生产环境分组。 总结: - 该配置表示从Nacos配置中心加载两个配置文件:生产环境分组下的`app.yaml`和默认分组下的`db.yaml`(并开启动态刷新)。 - `app.yaml`存放应用通用配置,`db.yaml`存放数据库相关配置(可能包括数据源、连接池等)。 注意:在Nacos控制台,我们需要预先创建这两个配置文件,并放在对应的分组中。 相关问题: 1. 如何在Nacos控制台创建不同分组的配置文件? 2. 如何确保多个应用共享同一个配置文件(如db.yaml)时不会冲突? 3. 如果配置了多个分组,如何管理不同环境的配置? 4. 动态刷新配置的原理是什么?在代码中如何使用动态刷新的配置? 5. 如果没有设置`refresh=true`,如何手动触发配置刷新? </think>### 配置 `nacos:app.yaml?group=PROD_GROUP nacos:db.yaml?refresh=true` 解析 #### 1. **配置结构解析** | 配置项 | 含义 | |---------------------------|----------------------------------------------------------------------| | `nacos:app.yaml` | 从Nacos加载Data ID为`app.yaml`的配置文件 | | `?group=PROD_GROUP` | 指定配置分组为生产环境组(**隔离环境配置**的关键)[^1] | | `nacos:db.yaml` | 从Nacos加载Data ID为`db.yaml`的配置文件(数据库相关配置) | | `?refresh=true` | 开启配置**动态刷新**(修改Nacos配置后应用无需重启)[^2] | #### 2. **app.yaml的核心作用** - **应用级配置容器**:存储**所有业务微服务共享**的公共配置 - **典型内容**: ```yaml # app.yaml示例 common: security: # 安全配置 jwt-secret: d4e5f6a7b8 logging: # 统一日志配置 level: root: INFO endpoint: # 公共服务端点 payment-service: http://payment.prod.svc.cluster.local ``` - **环境隔离**:通过`PROD_GROUP`分组实现生产环境配置隔离(同Data ID在DEV/TEST/PROD分组存放不同配置) #### 3. **为何不是直接配置Nacos服务?** - **服务地址已前置声明**: ```yaml spring: cloud: nacos: config: server-addr: 192.168.111.25:8848 # 此处已定义Nacos服务地址 ``` - **动态加载机制**:`spring.config.import`在**运行时**按需加载特定配置,实现: - **按模块加载**:如`db.yaml`只被数据库相关模块加载 - **条件化加载**:`refresh=true`实现热更新而其他配置保持静态 - **权重控制**:后加载的配置覆盖先加载的(如`db.yaml`可覆盖`app.yaml`中的同名配置) #### 4. **配置加载流程** ```mermaid graph LR A[应用启动] --> B[读取bootstrap.yml] B --> C[连接Nacos server-addr] C --> D[加载app.yaml?group=PROD_GROUP] D --> E[加载db.yaml?refresh=true] E --> F[合并所有配置源] F --> G[启动应用] ``` #### 5. **最佳实践建议** 1. **分层配置**: - `app.yaml`:跨服务公共配置 - `[service]-[module].yaml`:模块专属配置(如`order-service-db.yaml`) 2. **分组策略**: ```yaml # 多环境配置示例 spring: config: import: - nacos:app.yaml?group=${CONFIG_GROUP} # 通过环境变量动态指定分组 ``` 3. **敏感数据保护**:在`app.yaml`中配置加密密钥,敏感数据存Nacos并加密传输[^3] > **故障排查提示**:若配置未生效,检查:<br> > ① Nacos控制台是否存在`PROD_GROUP`分组的`app.yaml`<br> > ② 应用是否具有该分组的读取权限<br> > ③ 配置内容是否符合YAML语法规范
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值