將 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 社群中所有即將舉行的活動。

檢視全部