当前位置: 首页 > 科技观察

说说我写Yml的个人经历

时间:2023-03-19 17:58:58 科技观察

本文转载自微信公众号“小姐姐的味道”,作者姐姐养的狗。转载本文请联系味觉小姐公众号。很惭愧地发现,配置文件的世界已经被以下三者统治:yaml、toml和json,这让一直使用properties文件的javaer深深地埋下了脑袋。别担心,当你读到文章的最后,你也会羞愧地低下头。也可能有一丝愤怒。和各种人工智能调优参数一样,k8s调优大师已经成功升级为yml配置大师。作为一个常年使用yml文件的SpringBoot框架用户,有时候会对yml的形式感到困惑,让人汗颜。YAML其实是XML的一个子集,所以它的复杂性来自于它的来源,它诞生于2009年,使用yml文件,首先遇到的问题就是它的缩进问题。就像python语言一样,yml文件的表现层次是通过嵌套缩进来完成的。它不使用制表符,而是使用空格进行缩进。可怕的是,空格的多少并不重要,只要同级元素的左边对齐即可。对于CV党来说,不得不说是一场噩梦哈哈。该配置文件应该解决什么问题?Redis已经给出了答案。就像你学习了一门新的语言,解决了它的字符串和集合表示方法之后,基本上写代码是没问题的。那我们就一一看看吧。以下方法均基于SpringBoot的yml文件格式,其他场景下的解析器可能略有不同。为了能够调试这些值,我们简单地写了一个测试类,然后设置值后打印如下。@EnableAutoConfiguration@ConfigurationpublicclassTestConfigimplementsInitializingBean{@Value("${str1}")Stringstr1;@OverridepublicvoidafterPropertiesSet()throwsException{System.out.println(this);}}1。String字符串是最简单的配置,也是最常见的配置。在spring中,字符串可以被引用也可以不被引用。所以下面三行的配置效果是一样的。str1:ksdfjsdlkfjdsfskdfljsstr1:'ksdfjsdlkfjdsfskdfljs'str1:"ksdfjsdlkfjdsfskdfljs"那么,如何支持多行文本呢?毕竟有一些需求,那才是正路。写法如下:str1:|ksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljs注意后面不需要其他多余的结束表达式,一切以缩进证明。当然,你也可以替换|用>,效果是一样的。str1:>ksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljs最糟糕的是它还有第三种写法。str1:"ksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljsksdfjsdlkfjdsfskdfljs"2.Number当我们的接收者是一个数字时,比如下面的。@Value("${a}")inta;然后,即使你把配置文件写成字符串,它也会被强制转换为数字。a:"014"这时候a的值会被设置为整数14,神奇的是,如果去掉引号,就变成了这个样子。a:014这时候a的值居然变成了12!就遇到这么个极品bug,浪费脑细胞,wtf。因为是0开头的,代表八进制,在解析器中间做了一层转换。所以按照这个逻辑,0x14就是20,使用的时候一定要注意这一点。聪明的同学可以用它来埋坑。这里还有一些特殊的写法。float:1.23e+3#浮点数fixed:13.67#固定小数minmin:-.inf#表示负无穷notNumber:.NaN#无效数boolean:[true,false]#布尔值string:'12345'#字符串日期:2021-06-03#Date3.字典让我们看看常用的字典。其实列出所有的配置本身就是一个字典,也就是kv的配置。被:分割,所以左半部分不需要特殊字符,否则会晕。不不不,它没有晕,因为它正确地识别了乱七八糟的字符。比如下面的yml配置。A&&xk@71:0x14收到这样的代码。@Value("${a&&xk@71}")inta;好吧,很容易被打死。所以,你明白了。我还是太天真了,yml文件没有规定key不允许特殊字符,它允许你这样做。4.对象由字典组成,很容易扩展为对象。因为对象也是属性的集合。json证明了这些属性就是一堆KV,我们的yaml也是。假设有如下代码,我们需要构造dog中的数据。@DatapublicstaticclassDog{privateStringxjjdog1;privateStringxjjdog2;}@Bean@ConfigurationProperties(prefix="dog")publicDoggetDog(){returnnewDog();}第一种yml的写法是这样的。dog:xjjdog1:iamxjjdog1xjjdog2:iamxjjdog1++另一种方式是将json数据直接写入文件。dog:{xjjdog1:'iamxjjdog1',xjjdog2:'iamxjjdog++'}当然也可以连续展开多个level。比如前缀是super.dog,那么yml文件可以这样写。super.dog:{xjjdog1:'iamxjjdog1',xjjdog2:'iamxjjdog++'}5.Lists支持列表,即列表。我们可以用数组来接收,也可以用List等,它也有两种写法。这是最常见的一种。animal:-dog-cat-monkey当然也可以放在一条线上。animal:[dog,cat,monkey]没有问题,关键是yml文件支持嵌套。比如一个Map嵌套在一个List中,或者一个List嵌套在一个Map中。当嵌套层次很深,或者缩进不规则时,看起来很乱。例如下面的k8spod配置。apiVersion:v1kind:Podmetadata:name:xjjdog-Podlabels:app:front-webspec:containers:-name:front-webimage:nginxports:-containerPort:80-name:front-appimage:xjjdog/frontappports:-containerPort:14000storages:...更复杂的是spec,里面有container、storages等配置。其中container是一个list,list之间是一个map,map中的ports属性又是一个list……如此嵌套,如果配置文件比较长,不熟悉业务属性的同学很容易搞定晕眩的。6.即使是特殊数据,yaml也比xml简单多了。它还有许多特殊的写法。像这个。str1:!!str2021-06-03表示将2021-06-04转成字符串。有很多这样的强制转换,但大多数时候您不会使用它们。但是如果你想把你的yaml文件复杂化,让别人不敢碰它,你可以这样做。!!int#整数类型!!float#浮点类型!!bool#布尔类型!!str#字符串类型!!binary#也是字符串类型!!timestamp#日期时间类型!!null#空值!!set#collection!!omap,!!pairs#Key-valuelistorobjectlist!!!seq#Sequence,也是一个列表!!map#Key-valuetable既然yml文件有这么多复杂的写法,那就玩玩吧.比如下面的写法。from:&d!!str2021-06-04str1:*d这个配置和上面的配置效果一样,&是标记的意思,我们给它起个名字叫d;*表示引用,我们在需要的地方引用即可。yml中的key也可以使用对象或者复杂结构作为key。为了将其识别为特殊密钥,我们需要做更多的处理。?[blue,reg,green]:Color的上述配置?也就是说,我接下来要做一个更复杂的配置,你准备好了吗?7.结束学会这些技巧后,是不是迫不及待想要尝试一下呢??想在您的SpringBoot项目中做一些有趣的事情吗?为了防止你的基础设施部门扫描出你的配置,为什么不呢?这是我修改的一个普通数据源配置文件。h2:&sa!!strsadriver:&driver!!strorg.h2.Driverdefaults:&defaults?username:*sa?password:?driverClassName:*driverspring:datasource:<<:*defaults?url:!!str>jdbc:h2:mem:h2test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE你觉得美吗?不管怎样,我的腿很痛。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。