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

檢視所有