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

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

Spring 3.1 为环境增加了重要的全新支持。这种新的 Environment API 使您可以轻松地将属性公开给应用程序或有条件地加载配置片段。

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

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

隔离 Cloud Foundry 特定配置

当 Spring 应用程序部署到 Cloud Foundry 时,会自动启用“cloud” Profile。这为 Cloud Foundry 特定的应用程序配置提供了一个预定义的便捷位置。cloud 命名空间的所有特定用法都应发生在 cloud Profile 块中,以允许应用程序在 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 上启用应用程序功能

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

但是,仍然可以从您的 Cloud Foundry 应用程序发送电子邮件。诸如 SendGrid 之类的服务提供商可以通过 HTTP Web 服务代表您发送电子邮件。当应用程序在您自己的数据中心中运行时,您可能想要使用公司 SMTP 服务器,然后在 CloudFoundry.com 上运行时使用 SendGrid。以下是如何在 cloud Profile 中创建服务 bean 以连接到 SendGrid 的示例。


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

Cloud 属性

除了 Profiles 之外,Cloud 特定属性现在直接暴露到应用程序中,并且可以使用 Spring 的属性占位符支持来使用。这些属性包括关于应用程序的基本信息,例如其名称和 Cloud 提供商,以及绑定到该应用程序的所有服务的详细连接信息。这使得创建您自己的服务连接工厂变得容易。如果您的应用程序由于某种原因需要 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 Profile 和属性都自动提供给在 Cloud Foundry 上运行的所有 Spring 应用程序。需要使用 Spring 3.1(或更高版本)。我们的目标是创建一个无摩擦的路径,以便在 Cloud Foundry 上运行,同时仍然可以轻松地在需要时进行控制。最重要的是,我们希望允许 Spring 应用程序的最大可移植性,以便在任何地方运行,而无需为每个部署环境手动配置应用程序。

获取 Spring 新闻简报

通过 Spring 新闻简报保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部