使用 Cloud Foundry 服务与 Spring:第 4 部分 – Spring 配置文件

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

Spring 3.1 对环境添加了重要的全新支持。这个新的Environment API 简化了向应用程序公开属性或有条件地加载配置片段的过程。

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

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

查看全部