適用於 Spring 開發人員的 Cloud Foundry

工程 | Mark Fisher | 2011年4月12日 | ...

到目前為止,你們中的許多人可能已經看過 Cloud Foundry 網路研討會 和 Rod 今天的 部落格。我想提供一個快速的後續,其中包含部署在雲中的“hello-spring”示例應用程式。多虧了 Cloud Foundry,幾乎沒有學習曲線。

在我們開始之前,讓我們考慮一下自 Spring 誕生以來推動它的三個目標

  1. 專注於簡單性和生產力,讓開發人員的生活更輕鬆
  2. 以一致的方式支援創新技術
  3. 確保應用程式在不同部署環境中的可移植性

然後,考慮這三個目標與 Cloud Foundry 的關係

  1. 簡單性和生產力:將 Spring 應用程式部署到雲端就像在 SpringSource Tool Suite 中拖放一樣簡單,即使構建要在雲中執行的應用程式,開發人員也可以像往常一樣利用 Roo 和 Grails 實現的生產力提升。
  2. 持續創新:Spring Social 和 Spring Data 等專案擁抱 Twitter 和非關係型資料儲存等創新技術,這些技術在基於雲的應用程式中越來越受歡迎,並且它們以與現有 Spring 平臺一致的方式做到這一點。Cloud Foundry 提供服務來支援此類應用程式。RabbitMQ 將很快作為雲服務提供,因此這同樣適用於透過 Spring AMQP 和 Spring Integration 依賴 RabbitMQ 進行訊息傳遞的應用程式。
  3. 可移植性:雲首先是一個新的部署環境,但建立可以在雲內外執行的應用程式卻很容易,甚至無需交換配置檔案。

帶著這些目標,我們設計了一個示例應用程式,為Spring開發人員介紹了Cloud Foundry。這是未來幾天和幾周內將在本部落格中介紹的眾多示例應用程式中的第一個。它演示了單個配置如何支援本地測試和雲部署。它還演示了Cloud Foundry中可用的服務:MySQL、Redis和MongoDB。讓我們快速地走一遍實際部署,然後反向瞭解配置。

有了Cloud Foundry賬戶,您可以將應用程式部署(或“推送”)到雲端。這些應用程式可以透過繫結服務來使用服務。當您使用vmc命令列工具或STS外掛時,您可以繫結到現有服務或建立一個新服務。讓我們看看如何使用命令列工具vmc來完成此操作。這是“vmc push”命令的輸出

Would you like to deploy from the current directory? [Yn]: y
Application Deployed URL: 'hello-spring.cloudfoundry.com'? 
Detected a Java SpringSource Spring Application, is this correct? [Yn]: y
Memory Reservation [Default:512M](64M, 128M, 256M, 512M, 1G or 2G) 256
Creating Application: OK 
Would you like to bind any services to 'hello-spring'? [yN]: y 
Would you like to use an existing provisioned service [yN]? n 
The following system services are available:: 
1. redis 
2. mongodb 
3. mysql 
Please select one you wish to provision: 3 
Specify the name of the service [mysql-63854]: hello-db
Creating Service: OK 
Binding Service: OK 
Uploading Application: 
  Checking for available resources: OK 
  Processing resources: OK 
  Packing application: OK 
  Uploading (42K): OK   
Push Status: OK 

vmc輸出顯示了各個步驟,但透過將SpringSource Tool Suite中的應用程式拖放到Cloud Foundry Server例項中,也可以完成相同的任務,如下所示

Cloud Foundry Server in STS

現在我們已經看到了部署,讓我們來看看配置。它出奇地簡單,因為您甚至不需要配置顯式憑據和連線字串。相反,您可以使用CloudFoundry的“cloud”名稱空間從雲本身檢索此DataSource的引用。讓我們看看如何配置一個名為DataSourceCustomerService的bean,以引用CloudFoundry提供的資料庫服務


<cloud:data-source id="db"/>

<bean class="example.AccountRepository">
    <property name="dataSource" ref="db"/>
</bean>

第一個元素將建立一個java.sql.DataSource型別的bean,第二個元素將注入其引用以滿足其依賴項。這幾乎是您將新應用程式部署到雲並配置服務所需瞭解的全部內容。但是,我們還想在本地測試應用程式。值得慶幸的是,即將釋出的Spring 3.1版本透過Spring配置檔案提供了一些幫助。Spring 3.1中的“profiles”功能(Chris Beams在這篇最新部落格中解釋得非常清楚)使您能夠在執行時“開啟”某些bean。

當您想要將bean與特定環境關聯時,這非常有用。使用Spring的屬性佔位符解析機制也可以實現類似的功能,根據外部屬性更改物件的定義。但這有所不同:例如,假設您想要在雲中使用<cloud:data-source/>元素,在localhost上將DriverManagerDataSource定義為<bean>,並透過<jee:jndi-lookup/>在整合測試中檢索DataSource。Spring配置檔案使得將這些bean中的每一個與一個配置檔案關聯變得容易,這樣,雖然所有三個都在配置中定義,但任何時候只有一個是活動的,具體取決於環境。

Spring 提供了一些預先打包的策略來啟用配置檔案。其中之一是使用命令列系統屬性。但是,如果您需要根據僅在執行時已知的資訊動態設定活動配置檔案,那麼請考慮使用 ApplicationContextInitializer 實現,如 Chris Beams 在這篇其他文章中所述。

讓我們看看hello-spring應用程式的配置以及它如何考慮配置檔案


<beans>
    <beans profile="default">
        <jdbc:embedded-database id="dataSource"/>
    </beans>

    <beans profile="cloud">
        <cloud:data-source id="dataSource"/>
    </beans>
</beans>

巢狀的<beans>元素及其“profile”屬性是這裡使用的唯一新的Spring 3.1特性。巢狀的beans元素允許我們指定,其中包含的任何bean只有在指定的配置檔案處於活動狀態時才應啟用。

透過這些簡單的步驟,我們現在可以在本地構建和測試我們的邏輯,然後將完全相同的應用程式部署到雲端,而無需進行任何更改。雲名稱空間也支援其他服務。如果新增MongoDB和Redis支援,配置將如下所示


<beans profile="default">
    <jdbc:embedded-database id="dataSource"/>
    <bean id="mongo" class="com.mongodb.Mongo"/>
    <bean id="redis" class="org.springframework.data.keyvalue.redis.connection.jedis.JedisConnectionFactory"/>
</beans>

<beans profile="cloud">
    <cloud:data-source id="dataSource"/>
    <cloud:mongo id="mongo"/>
    <cloud:redis-connection-factory id="redis"/>
</beans>

hello-spring示例展示了所有這些以及更多內容,可以從這個儲存庫克隆。該應用程式最重要的特性是它可以部署到本地伺服器,例如STS中可用的tc Server例項,或者新的Cloud Foundry伺服器。

這是在本地部署的hello-spring應用程式的截圖

Hello Spring deployed locally

這是在雲中執行的完全相同的應用程式。請注意URL和連線字串是如何不同的

Hello Spring deployed in the cloud

目前就這些了,但請關注這個空間。我們計劃在未來幾天和幾周內推出更多示例應用程式(請關注此儲存庫)和部落格!

獲取 Spring 新聞通訊

透過 Spring 新聞通訊保持聯絡

訂閱

領先一步

VMware 提供培訓和認證,助您加速進步。

瞭解更多

獲得支援

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案,只需一份簡單的訂閱。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視所有