1 概念
YAML是一種人們可以輕松閱讀的數據序列化格式,並且它非常適合對動態編程語言中使用的數據類型進行編碼。YAML是YAML Ain't Markup Language簡寫,和GNU("GNU's Not Unix!")一樣,YAML是一個遞歸着說“不”的名字。不同的是,GNU對UNIX說不,YAML說不的對象是XML。YAML不是XML。它可以用作數據序列,配置文件,log文件,Internat信息和過濾。
2 優點
YAML的可讀性好。
YAML和腳本語言的交互性好。
YAML使用實現語言的數據類型。
YAML有一個一致的信息模型。
YAML易於實現。
3 YAML的適用范圍
由於實現簡單,解析成本很低,YAML特別適合在腳本語言中使用。列一下現有的語言實現:Ruby,Java,Perl,Python,PHP,OCaml,JavaScript。除了Java,其他都是腳本語言.
YAML比較適合做序列化。因為它是宿主語言數據類型直轉的。
YAML做配置文件也不錯。比如Ruby on Rails的配置就選用的YAML。對ROR而言,這很自然,也很省事.
由於兼容性問題,不同語言間的數據流轉建議現在不要用YAML.
4 YAML不足
YAML和XML不同,沒有自己的數據類型的定義,而是使用實現語言的數據類型。這一點,有可能是出奇制勝的地方,也可能是一個敗筆。如果兼容性保證的不好的話,YAML數據在不同語言間流轉會有問題。
假如兼容性沒問題的話,YAML就太完美了。輕巧,敏捷,高效,簡便,通用。
YAML與properties的不同
YAML的配置文件格式例如:
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
與其等價的properties:
environments.dev.url=http://dev.bar.com environments.dev.name=Develop Setup environments.prod.url=http://foo.bar.com environments.prod.name=My Cool App
通過YAML的配置方式我們可以看出,配置字符量比properties少了很多,且結構變得更清晰。
自定義參數
除了可以在Spring Boot的配置文件中設置各個starter模塊中預定義的配置屬性,我們還可以在配置文件中定義一些我們需要的自定義屬性。比如在application.properties中添加:
book.name=SpringCloudInAction
book.author=ZhaiYongchao
然后,在應用中可以通過@Value注解來加載這些自定義的參數,比如:
@Component public class Book{ @Value(“${book.name}”) private String name; @Value(“${book.author}”) private String author; //省略getter和setter }
然后再Spring Boot的主類中指出該類所在包即可。
@Value注解加載屬性時可以支持兩種表達式來進行配置:
- 一種是上面介紹的PlaceHolder方式,格式為${…},大括號內為PlaceHolder.
- 另一種是使用SpEL表達式,格式為#{…},大括號內為SpEL表達式。
參數引用
book.name=Spring Cloud book.author=ZhaiYongchao book.desc=${book.author} is writing 《${book.name}》
這樣,book.desc的值為:ZhaiYongchao is writing 《Spring Cloud》。
使用隨機數
在配置文件中使用${random.int}即可獲得一個隨機的int型數據。
名稱 |
描述 |
${random.value} |
取得隨機字符串 |
${random.int} | 取得隨機int型數據 |
${random.long} | 取得隨機long型數據 |
${random.int(10)} | 取得10以內的隨機數 |
${random.int[10,20]} | 取得10~20的隨機數 |
命令行參數
我們使用java -jar命令來啟動一個spring boot應用,啟動時,可以設置參數,例如:
java –jar xxx.jar --server.port=8081
該命令直接以命令行的方式指定了spring boot應用啟動的端口號為8081.
以命令行的方式啟動spring boot應用時,連續的--就是對application.properties中的屬性進行賦值的標識。
多環境配置
上面通過命令行的方式修改應用的配置文件,當應用特別多時,這樣的方式也許並不太好。因此需要多環境配置。
關於profile更多內容見《Spring 3.1新特性之一:spring注解之@profile》
方式一:
YAML還可以在一個單個文件中通過使用spring.profiles屬性來定義多個不同的環境配置。例如:
server:
port:8881 --- spring: profiles:test server: port:8882 ---- spring: profiles: prod server: port:8883
當指定為test環境時,server.port將使用8882端口;prod環境時,server.port將使用8883端口;沒有指定時使用8881端口。
方式二:
YAML將屬性加載到內存中保存的是有序的,所以當配置文件中的信息需要具備順序含義時,YAML的配置方式比起properties配置文件更有優勢。
在spirng boot中,多環境配置的文件名需要滿足 application-{profile}.properties的格式,比如:
- application-dev.properties 開發環境
- application-test.properties 測試環境
- application-prod.properties 生產環境
具體哪個配置文件會被加載,需要在application.properties文件中通過string.profiles.active屬性來設置,其值對應配置文件中的{profile}值(也可以使用java -jar xxx.jar --spring.profiles.active命令指定需要加載的配置文件)。如spring.profiles.active=test就會加載application-test.properties配置文件內容。
加載順序
監控與管理
簡短的前言
在為服務架構中,通過將龐大的單體系統拆分成多個提供不同服務的應用。雖然各個應用的內部邏輯因分解而得以簡化,但由於部署應用的數量成倍增長,使得系統的維護復雜度大大提升。
隨着應用的不斷增加,系統集群中出現故障的次數也越來越多,雖然在高可用機制的保護下,個別故障不會影響系統的對外服務,但是這些頻繁出現的鼓掌需要被及時發現和處理才能長期保證系 統處於健康可用狀態。為了達到這個目的,我們需要一套自動化的監控運維機制,該機制要能夠不間斷地收集各個微幅務應用的各項指標情況,並根據這些基礎指標信息來制定監控和預警規則。
初始actuator
引入該模塊能夠自動為spring boot構建的應用提供一系列用於監控的端點。Spring Cloud在實現各個為服務組件的時候,進一步為該模塊做了不少擴展。比如,為原生端點增加了更多的指標和度量信息。
引入actuator
- 在現有的spring boot應用的pom.xml文件中引入spring-boot-starter-actuator依賴即可。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.增加該依賴后重新啟動應用。此時可以在控制台中看到如下所示:
上圖顯示了一批端點定義,這些端點並非我們在程序中定義的,而是由spring-boot-starter-actuator模塊根據應用依賴和配置自動創建出來的監控和管理端點。端點具體還以不再說明,可以自行百度。