适用于 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 社区所有即将举行的活动。

查看所有