日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
聊聊我寫(xiě)Yml的親身感受

本文轉(zhuǎn)載自微信公眾號(hào)「小姐姐味道」,作者小姐姐養(yǎng)的狗。轉(zhuǎn)載本文請(qǐng)聯(lián)系小姐姐味道公眾號(hào)。

我非常羞恥的發(fā)現(xiàn),配置文件界,已經(jīng)被下面三種所統(tǒng)治:yaml,toml和json,這讓一直使用properties文件的javaer深深的埋下了頭。

不要擔(dān)心,當(dāng)你讀到文章最后,你也會(huì)羞愧的埋下頭。也可能會(huì)有一絲憤怒。

像各種人工智能調(diào)參數(shù),k8s調(diào)參師,都已經(jīng)成功升級(jí)為yml配置大師。作為一個(gè)常年使用yml文件的SpringBoot框架使用者,有時(shí)候?qū)ml的表現(xiàn)形式竟然顯露出了困惑,這不由得讓人羞愧又加了一層。

YAML,竟然是XML的一個(gè)子集,所以它的復(fù)雜是有源頭的,最早誕生于2009年。

使用yml文件,首先遇到的問(wèn)題,就是它的縮進(jìn)問(wèn)題。就如同python語(yǔ)言一樣,yml文件的表現(xiàn)層次,是靠嵌套的縮進(jìn)來(lái)完成的。它并不使用TAB,而是使用空格表示縮進(jìn)。

要命的是,空格的多少,并不重要,只要相同級(jí)別元素左側(cè)能夠?qū)R就行。這對(duì)于CV黨來(lái)說(shuō),不得不說(shuō)是一個(gè)噩夢(mèng)哈哈。

那一個(gè)配置文件,要解決哪些問(wèn)題呢?Redis已經(jīng)做出了回答。就像你學(xué)習(xí)一門新的語(yǔ)言一樣,解決了它的字符串和集合的表示方法,基本上寫(xiě)代碼就沒(méi)問(wèn)題了。那我們就挨個(gè)來(lái)看一下。

以下方法以SpringBoot的yml文件格式為準(zhǔn),其他場(chǎng)景的解析器會(huì)有些許差異。為了能夠debug這些值,我們簡(jiǎn)單的寫(xiě)了一個(gè)測(cè)試類,然后再設(shè)值完成之后打印以下就可以了。

 
 
 
  1. @EnableAutoConfiguration
  2. @Configuration
  3. public class TestConfig implements InitializingBean {
  4.     @Value("${str1}")
  5.     String str1;
  6.     @Override
  7.     public void afterPropertiesSet() throws Exception {
  8.         System.out.println(this);
  9.     }
  10. }

1. 字符串

字符串是最簡(jiǎn)單的配置,也是最常見(jiàn)的配置。再spring中,字符串可以代引號(hào),也可以不帶引號(hào)。所以下面三行的配置效果,是一樣的。

 
 
 
  1. str1: ksdfjsdlkfjdsf skdfljs
  2. str1: 'ksdfjsdlkfjdsf skdfljs'
  3. str1: "ksdfjsdlkfjdsf skdfljs"

那么,如何支持多行文本呢?畢竟有些需求,就是這么作死。寫(xiě)法如下:

 
 
 
  1. str1: |
  2.   ksdfjsdlkfjdsf skdfljs
  3.   ksdfjsdlkfjdsf skdfljs
  4.   ksdfjsdlkfjdsf skdfljs

注意,后面不需要有其他的畫(huà)蛇添足的結(jié)束表示,一切都是靠縮進(jìn)來(lái)證明的。當(dāng)然,你也可以把 |換成>,效果是一樣的。

 
 
 
  1. str1: >
  2.   ksdfjsdlkfjdsf skdfljs
  3.   ksdfjsdlkfjdsf skdfljs
  4.   ksdfjsdlkfjdsf skdfljs

要命的是,它還有第三種寫(xiě)法。

 
 
 
  1. str1: "ksdfjsdlkfjdsf skdfljs
  2.   ksdfjsdlkfjdsf skdfljs
  3.   ksdfjsdlkfjdsf skdfljs"

2. 數(shù)字

當(dāng)我們的接收者,是一個(gè)數(shù)字的時(shí)候,比如下面這個(gè)。

 
 
 
  1. @Value("${a}")
  2. int a ;

那么,你即使把配置文件寫(xiě)成了字符串,它也會(huì)強(qiáng)制轉(zhuǎn)成數(shù)字。

 
 
 
  1. a: "014"

此時(shí),a的數(shù)值,就會(huì)被設(shè)置成整數(shù)14。

神奇的是,如果你把引號(hào)去掉,也就是下面這樣。

 
 
 
  1. a: 014

此時(shí),a的數(shù)值,竟然變成了12!

我就曾碰到過(guò)這樣的極品bug,浪費(fèi)了不少腦細(xì)胞,wtf。因?yàn)橐?開(kāi)頭,代表的是八進(jìn)制,解析器中間做了一層轉(zhuǎn)換。所以,按照這個(gè)邏輯,0x14就是20,使用時(shí)一定要注意這一點(diǎn)。機(jī)靈的同學(xué)可以拿來(lái)埋坑哦。

這里也有一些特殊的寫(xiě)法。

 
 
 
  1. float: 1.23e+3     # 浮點(diǎn)數(shù)
  2. fixed: 13.67       # 固定小數(shù)
  3. minmin: -.inf      # 表示負(fù)無(wú)窮
  4. notNumber: .NaN    # 無(wú)效數(shù)字
  5. boolean: [true, false] # 布爾值
  6. string: '12345'    # 字符串
  7. date: 2021-06-03   # 日期

3. 字典

再來(lái)看一下常見(jiàn)的字典。其實(shí),把所有的配置羅列開(kāi)來(lái),本身就是一個(gè)字典,也就是kv配置。

它是以:進(jìn)行分割的,所以左半部分要求不能有特殊字符,否則就暈菜了。不不不,它沒(méi)有暈菜,因?yàn)樗褋y七八糟的字符,正確的識(shí)別了出來(lái)。比如下面的yml配置。

 
 
 
  1. a&& xk@71: 0x14

這樣的代碼接收。

 
 
 
  1. @Value("${a&& xk@71}")
  2. int a ;

嗯,容易被打死的寫(xiě)法。所以,你懂的。

還是我太幼稚了,yml文件根本就沒(méi)規(guī)定key不允許有特殊字符,它允許你這么做。

4. 對(duì)象

由字典,很容易可以擴(kuò)展到對(duì)象。因?yàn)閷?duì)象,也是一堆屬性的集合。json已經(jīng)證明,這些屬性,就是一堆KV,我們的yaml也是如此。

假設(shè)有如下的代碼,我們需要構(gòu)造dog中的數(shù)據(jù)。

 
 
 
  1. @Data
  2. public static class Dog{
  3.     private String xjjdog1;
  4.     private String xjjdog2;
  5. }
  6. @Bean
  7. @ConfigurationProperties(prefix = "dog")
  8. public Dog getDog(){
  9.     return new Dog();
  10. }

第一種yml的寫(xiě)法,是這樣。

 
 
 
  1. dog:
  2.   xjjdog1: i am xjjdog1
  3.   xjjdog2: i am xjjdog1++

而另一種方式,是把json數(shù)據(jù)直接給寫(xiě)到文件里。

 
 
 
  1. dog: {xjjdog1: 'i am xjjdog1',xjjdog2: 'i am xjjdog++'}

當(dāng)然,多個(gè)層次,可以在一行之中平鋪開(kāi)。比如prefix是super.dog,那么yml文件就可以這么寫(xiě)。

 
 
 
  1. super.dog: {xjjdog1: 'i am xjjdog1',xjjdog2: 'i am xjjdog++'}

5. 列表支持

列表,就是list,我們可以使用數(shù)組接收,也可以使用List等。

它也有兩種寫(xiě)法。這是最常見(jiàn)的一種。

 
 
 
  1. animal:
  2.   - dog
  3.   - cat
  4.   - monkey

當(dāng)然,也可以放在一行。

 
 
 
  1. animal: [dog,cat,monkey]

這沒(méi)什么問(wèn)題,關(guān)鍵是yml文件支持嵌套。比如List里嵌套Map,或者M(jìn)ap里嵌套List。當(dāng)嵌套層次比較深的時(shí)候,或者縮進(jìn)沒(méi)什么規(guī)律的時(shí)候,就顯得非常的亂。

比如下面這個(gè)k8s的pod配置。

 
 
 
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: xjjdog-Pod
  5.   labels:
  6.     app: front-web
  7. spec:
  8.   containers:
  9.     - name: front-web
  10.       image: nginx
  11.       ports:
  12.         - containerPort: 80
  13.     - name: front-app
  14.       image: xjjdog/frontapp
  15.       ports:
  16.         - containerPort: 14000
  17.   storages:
  18.   ...

比較復(fù)雜的是spec,里面有containers、storages等配置。其中containers是一個(gè)列表,列表之間是一個(gè)map,map中其中的ports屬性,又是一個(gè)列表...如此嵌套,如果配置文件比較長(zhǎng)的化,不熟悉業(yè)務(wù)屬性的同學(xué)就會(huì)容易暈菜。

6. 特殊數(shù)據(jù)

即使是這樣,yaml也比xml簡(jiǎn)單的多。它也有很多特殊的寫(xiě)法。

比如這個(gè)。

 
 
 
  1. str1: !!str 2021-06-03

它的意思是,把2021-06-04,強(qiáng)制轉(zhuǎn)化成字符串。這樣的強(qiáng)制轉(zhuǎn)化有很多,但大多數(shù)時(shí)候你不會(huì)用。但如果你想要把你的yaml文件變得復(fù)雜,讓別人不敢動(dòng),那就可以這么做。

 
 
 
  1. !!int               # 整數(shù)類型
  2. !!float             # 浮點(diǎn)類型
  3. !!bool              # 布爾類型
  4. !!str               # 字符串類型
  5. !!binary            # 也是字符串類型
  6. !!timestamp         # 日期時(shí)間類型
  7. !!null              # 空值
  8. !!set               # 集合
  9. !!omap, !!pairs     # 鍵值列表或?qū)ο罅斜?/li>
  10. !!seq               # 序列,也是列表
  11. !!map               # 鍵值表

既然yml文件有這么多復(fù)雜的寫(xiě)法,那么我們就可以去玩一把。比如下面的寫(xiě)法。

 
 
 
  1. from: &d !!str 2021-06-04
  2. str1: *d

這個(gè)配置,和上面的配置,效果是一樣的,&的意思是標(biāo)記,我們給它起了個(gè)名字,叫做d;*的意思是引用,我們?cè)谛枰牡胤揭靡话丫涂梢粤恕?/p>

yml中的key,竟然也可以用對(duì)象或者復(fù)雜的結(jié)構(gòu)作為key。為了標(biāo)識(shí)是一個(gè)特殊的key,我們還要做一點(diǎn)處理。

 
 
 
  1. ?[blue, reg, green]: Color

上面這個(gè)配置的?,就是說(shuō),我下面要進(jìn)行一個(gè)比較復(fù)雜的配置了,你準(zhǔn)備好了么?

7. End

學(xué)會(huì)了這些招數(shù)的你,是不是躍躍欲試了?想要在你的SpringBoot項(xiàng)目里搞一點(diǎn)有意思的東西?為了讓你的基礎(chǔ)架構(gòu)部門無(wú)法掃描出你的配置,為什么不呢?

這是我改造的一個(gè)普通datasource的配置文件。

 
 
 
  1. h2: &sa !!str sa
  2. driver: &driver !!str org.h2.Driver
  3. defaults: &defaults
  4.   ?username: *sa
  5.   ?password:
  6.   ?driverClassName: *driver
  7. spring:
  8.   datasource:
  9.     <<: *defaults
  10.     ?url: !!str >
  11.       jdbc:h2:mem:h2test;
  12.       DB_CLOSE_DELAY=-1;
  13.       DB_CLOSE_ON_EXIT=FALSE

你覺(jué)得美么?我反正腿挺疼的。

作者簡(jiǎn)介:小姐姐味道 (xjjdog),一個(gè)不允許程序員走彎路的公眾號(hào)。聚焦基礎(chǔ)架構(gòu)和Linux。十年架構(gòu),日百億流量,與你探討高并發(fā)世界,給你不一樣的味道。我的個(gè)人微信xjjdog0,歡迎添加好友,進(jìn)一步交流。


網(wǎng)頁(yè)題目:聊聊我寫(xiě)Yml的親身感受
轉(zhuǎn)載源于:http://www.5511xx.com/article/djjpdhj.html