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 社区的所有近期活动。

查看全部