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 賬戶,您可以將應用程式部署(或“push”)到雲上。這些應用程式可以透過繫結服務來使用它們。當您使用 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 Profiles 提供了一些幫助。Spring 3.1 中的“profiles”特性——Chris Beams 在這篇最近的部落格中解釋得非常清楚——使您能夠在執行時“啟用”某些 bean。

這在您希望將 bean 與特定環境關聯時非常有用。使用 Spring 的屬性佔位符解析機制也可以實現類似的功能,以便根據外部屬性改變物件的定義。但這不同:例如,假設您想在雲中使用 <cloud:data-source/> 元素,在 localhost 上使用定義為 <bean> 的常規 DriverManagerDataSource,並在整合測試中透過 <jee:jndi-lookup/> 透過 JNDI 檢索 DataSource。Spring profiles 使將每個 bean 與一個 profile 相關聯變得容易,這樣——儘管所有三個都在配置中定義——在任何給定時間,只有其中一個根據環境處於活動狀態。

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

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


<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 元素允許我們指定,僅當指定的 profile 處於活動狀態時,其中包含的任何 bean 才應啟用。

透過這些簡單的步驟,我們現在可以在本地構建和測試我們的邏輯,然後將完全相同的應用程式部署到雲上,無需進行任何更改。cloud 名稱空間也支援其他服務。如果我們新增 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 社群的所有近期活動。

檢視全部