将 Cloud Foundry 服务与 Spring 结合使用:第四部分 – Spring Profiles

工程 | Scott Andrews | 2011年11月10日 | ...

Spring 3.1 为环境添加了重要的新支持。这个新的环境 API 使得向应用程序公开属性或有条件地加载部分配置变得容易。

在本系列较早的一篇文章中,Ramnivas 展示了 Cloud Foundry 如何无需手动配置即可自动连接到数据库。当您需要对这个过程进行更多控制时,例如连接到多个数据库,云命名空间会将 DataSource 的配置精简为一行 XML。云命名空间功能强大,但它只支持在 Cloud Foundry 中运行的应用程序。使用云命名空间意味着将该部分配置与 Cloud Foundry 耦合。未部署到 Cloud Foundry 时,应禁用此配置。容器外测试是 Spring 哲学的一个基本原则,因此如果应用程序必须部署才能运行集成测试,那是不可接受的。Spring Profiles 解决了这个问题。

Spring 中的配置文件是配置的一个片段,只有当特定条件为真时才会被激活。许多应用程序平台都有开发、测试和生产配置的概念。虽然配置文件可以这样使用,但它们也更加灵活。没有预定义的配置文件集,除了在没有定义其他配置文件时激活的“default”配置文件。配置文件可以用于在不同环境中运行时交换配置,或者在应用程序中启用可选功能。如何使用它取决于您。

隔离 Cloud Foundry 特定配置

当 Spring 应用程序部署到 Cloud Foundry 时,“cloud”配置文件会自动启用。这为 Cloud Foundry 特定应用程序配置提供了一个预定义、方便的位置。所有云命名空间的特定用法都应发生在云配置文件块内,以允许应用程序在 Cloud Foundry 环境之外运行。

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory" />
</bean>
<beans profile="default">
    <mongo:db-factory id="mongoDbFactory" dbname="pwdtest" host="127.0.0.1" port="27017" username="test_user" password="efgh" />
</beans>
<beans profile="cloud">
    <cloud:mongo-db-factory id="mongoDbFactory" />
</beans>

此示例配置显示 Spring 的 MongoTemplate 从两个替代配置的连接工厂填充。在 Cloud Foundry 上运行时,连接工厂会自动配置。未在 Cloud Foundry 上运行时,连接工厂会手动配置连接设置以连接到本地运行的 MongoDB 实例。

在 Cloud Foundry 上启用应用程序功能

我们收到的一个常见问题是:“如何从我的应用程序发送电子邮件?”不幸的是,CloudFoundry.com 上运行的应用程序会阻止 SMTP,以防止垃圾邮件和其他滥用。

但是,仍然可以从您的 Cloud Foundry 应用程序发送电子邮件。服务提供商,例如 SendGrid,可以通过 HTTP Web 服务代表您发送电子邮件。当应用程序在您自己的数据中心运行时,您可能希望使用公司 SMTP 服务器,然后在 CloudFoundry.com 上运行时使用 SendGrid。这是一个如何在云配置文件中创建服务 bean 以连接到 SendGrid 的示例。


<beans profile="cloud">
    <bean name="mailSender" class="example.SendGridMailSender">
        <property name="apiUser" value="[email protected]" />
        <property name="apiKey" value="secureSecret" />
    </bean>
</beans>

云属性

除了配置文件,云特定属性现在直接暴露到应用程序中,并且可以通过 Spring 的属性占位符支持来使用。这些属性包括有关应用程序的基本信息,例如其名称和云提供商,以及所有绑定到应用程序的服务的详细连接信息。这使得创建自己的服务连接工厂变得容易。如果您的应用程序由于某种原因需要 c3p0 连接池而不是提供的连接池,这也很容易实现。

<beans profile="cloud">
    <bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql://${cloud.services.mysql.connection.host}:${cloud.services.mysql.connection.port}/${cloud.services.mysql.connection.name}" />
        <property name="user" value="${cloud.services.mysql.connection.username}" />
        <property name="password" value="${cloud.services.mysql.connection.password}" />
    </bean>
</beans>

服务属性通常采用“cloud.services.{service-name}.connection.{property}”的形式。可用的特定连接属性取决于服务类型。

为方便起见,如果应用程序绑定了给定类型的单个服务,则会根据服务类型而不是服务名称创建别名。对于 MySQL 服务,属性将采用“cloud.services.mysql.connection.{property}”的形式。

今天即可自动使用

云配置文件和属性均可自动用于在 Cloud Foundry 上运行的所有 Spring 应用程序。需要使用 Spring 3.1(或更高版本)。我们的目标是创建一个无摩擦的路径,以便在 Cloud Foundry 上运行,同时在需要时仍然可以轻松控制。最重要的是,我们希望 Spring 应用程序能够最大限度地实现可移植性,以便在任何地方运行,而无需为每个部署环境手动配置应用程序。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有