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 将很快作为云服务提供,因此对于依赖 RabbitMQ 通过 Spring AMQP 和 Spring Integration 进行消息传递的应用程序也适用。
  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 服务器实例拖放到同一个任务中

Cloud Foundry Server in STS

既然我们已经看到了部署,那么让我们看一下配置。它非常简单,因为您甚至不需要配置显式凭据和连接字符串。相反,您可以使用 CloudFoundry 的“cloud”命名空间从云本身检索对该 DataSource 的引用。让我们看看我们如何配置一个 bean,DataSourceCustomerService,以引用 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 中 - 在 Chris Beams 的这篇近期博客中非常清楚地解释了 - 使您能够在运行时“打开”某些 bean。

当您想将 bean 与特定环境关联时,这非常有用。使用 Spring 的属性占位符解析机制可以根据外部属性改变对象的定义,从而实现类似的功能。但这与众不同:例如,假设您想在云中使用 <cloud:data-source/> 元素,在本地主机上定义为 <bean> 的常规 DriverManagerDataSource 以及通过 <jee:jndi-lookup/> 在集成测试中通过 JNDI 检索的 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 功能。嵌套的 bean 元素允许我们指定只有在指定配置文件处于活动状态时才应启用其中的任何 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 社区中所有即将举行的活动。

查看全部