Cloud Foundry力求保持較低的初期投資。除了資金上的投入外,直接投資來自于開發(fā)者在Cloud Foundry中運行應用所花費的時間。當你打算使用Cloud Foundry時,自動重新配置機制能夠減少初期投資。在本文中,我們將研究自動重新配置如何與Spring應用協(xié)同工作(grails應用使用相同的底層機制,因此工作方式是一樣的。)
利用依賴注入進行自動重新配置
所有的應用都由業(yè)務邏輯以及服務交互(比如數(shù)據(jù)庫以及消息)構成。在典型的Spring應用中,你可以利用依賴注入(DI)為每個服務創(chuàng)建bean,并將這些bean注入到其他需要訪問相應服務的bean當中。
讓我們一起來看一下,一個使用關系型數(shù)據(jù)庫的典型Spring應用,其數(shù)據(jù)源bean的定義如下:
▲
我們可以在一個單獨的文件中給出相關屬性(比如用戶名和密碼)的值,但是我們在其中嵌入了值,這樣就可以只關注自動重新配置機制了。
該bean也可以被注入到其他bean當中(在下面這個例子當中,該bean被注入到JPA實體管理器中):
▲
我們能夠很容易地看到:數(shù)據(jù)庫URL指向本機上的數(shù)據(jù)庫,用戶名被設置為“myuser”,密碼被設置為“mypass”。當將該應用推送到Cloud Foundry上并綁定MySQL或Postgres服務后,數(shù)據(jù)庫服務的URL不再是jdbc:mysql://localhost:3306/inventory-db,用戶名、密碼也不會像之前那樣簡單。因此如果沒有額外的機制的話,這類應用將不能夠啟動。這時,自動重新配置機制就派上用場了。自動重新配置機制借助DI檢查Spring應用的上下文環(huán)境,查找與應用相關的bean,基于應用所綁定的服務創(chuàng)建bean,然后替換原有的bean。結果就是無論用戶的應用部署在本地還是在Cloud Foundry上,都不用進行任何的改變。
下面這個表格列舉了自動重新配置查找并進行重新配置的bean類型
▲
在創(chuàng)建bean并使用基于與應用進行綁定的服務所對等的bean替換現(xiàn)有bean之前,自動重新配置底層的機制使用BeanFactoryPostProcessor檢查應用上下文環(huán)境。對于關系型數(shù)據(jù)庫,同時還會重新配置JPA實體管理器工廠或者Hibernate會話工廠以調整正在使用的方言。
在部署過程中存儲應用時,Cloud Foundry將進行兩處修改:
1. 在包含BeanFactoryPostProcessor以及相關資源的應用中增加額外的jar包。請注意用于自動重新配置的jar包版本與cloudfoundry-runtime相關。然而,某些類會通過著色機制重新遷移到不同的包中。這樣一來,應用就能夠使用不同版本的jar包而不會產(chǎn)生沖突。
2. 修改web.xml文件更新組成Spring應用上下文的文件,在web.xml中添加BeanFactoryPostProcessor。
局限性
自動重新配置服務只有在以下兩種情況下才起作用:
1. 每一種服務類型只能綁定一種服務,例如,你只能為應用綁定一種關系數(shù)據(jù)庫服務(MySQL或Postgres)。
2. 每個bean的匹配類型只能有一個。例如,在應用上下文環(huán)境中只能有一個DataSource bean。
如果應用不滿足上述限制條件的話,那么自動配置機制就不能生效。在這種情況下你可能需要使用命名空間,該部分內容我們會在下一篇文章中進行介紹。
自動重新配置機制要求典型的Spring應用。如果應用上下文環(huán)境過于復雜,那么自動配置機制可能不會生效。在這種情況下,你可以選擇退出自動重新配置。
選擇退出自動重新配置
有些情況下,你可能想退出自動重新配置。例如,你有一個在內存中運行的關系數(shù)據(jù)庫,這時便不需要與Cloud Foundry服務進行綁定了。Cloud Foundry提供了一些方法能夠退出自動重新配置機制。
1. 部署應用時選擇"JavaWeb"框架。這會將你的應用視作非Spring應用,這時你的應用將保持不變(不會在應用中添加jar包,也不會對web.xml文件進行修改。)同時也意味著在該系列文章中所討論的配置文件特性對該類應用將不可用。
2. 使用任一元素創(chuàng)建代表服務的bean。目前元素包括, , ,以及。如果應用恰好包括了基于這些命名空間元素底層類型的bean的話(比如CloudMongoDbFactoryBean),那么選擇退出自動重新配置將會生效。
Cloud Foundry使用該機制選擇退出,這樣應用就可以選擇進行自動重新配置也可以完全控制服務創(chuàng)建。我們沒有看到過采用自動重新配置配置某些服務,然后手動配置其他服務的情況。
結論
Cloud Foundry提供的自動重新配置功能是一個很棒的起始創(chuàng)建方式。如果應用日趨成熟或者需要綁定多個服務,那么你可能需要對服務連接對象進行更好的控制。這時候 命名空間就派上用場了。在該系列文章的下一篇文章中,Thomas Risberg將講解如何使用 命名空間。