搭配 Spring 使用 Cloud Foundry 服務:第 4 部分 – Spring 設定檔

工程 | 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 Profile 解決了這個問題。

Spring 中的設定檔是組態片段,僅在滿足特定條件時才會啟動。許多應用程式平台都有開發、測試和生產組態的概念。雖然設定檔可以以這種方式使用,但它們也更加靈活。除了「default」設定檔(在未定義其他設定檔時啟動)之外,沒有預定義的設定檔集。設定檔可用於在不同環境中運行時交換組態,或在您的應用程式中啟用可選功能。如何使用它取決於您。

隔離 Cloud Foundry 特定組態

當 Spring 應用程式部署到 Cloud Foundry 時,「cloud」設定檔會自動啟用。這為 Cloud Foundry 特定應用程式組態提供了預定義的便利位置。cloud 命名空間的所有特定用法都應在 cloud 設定檔區塊內發生,以允許應用程式在 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 網路服務代表您發送電子郵件。當應用程式在您自己的資料中心運行時,您可能想要使用公司 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.{服務名稱}.connection.{屬性}」的形式。可用的特定連線屬性取決於服務類型。

為了方便起見,如果應用程式綁定了給定類型的單一服務,則將根據服務類型而不是服務名稱建立別名。對於 MySQL 服務,屬性將採用「cloud.services.mysql.connection.{屬性}」的形式。

今天可用,自動地

雲端設定檔和屬性都自動提供給在 Cloud Foundry 上運行的所有 Spring 應用程式。需要使用 Spring 3.1(或更高版本)。我們的目標是創建一個在 Cloud Foundry 上順暢運行的路徑,同時仍然可以輕鬆地在需要時進行控制。最重要的是,我們希望允許 Spring 應用程式在任何地方都能最大程度地可移植運行,而無需為每個部署環境手動配置應用程式。

取得 Spring 電子報

保持與 Spring 電子報的聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進制檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部