使用 Grails 和 Cloud Foundry 進行一鍵部署

工程 | Peter Ledbrook | 2011 年 4 月 12 日 | ...

幾年前,一家新創公司的共同創辦人在倫敦 Groovy 和 Grails 使用者社群發表了演講。 我清楚地記得他說,他夢想著「只需點擊一下」即可部署 Grails 應用程式。 隨著新的 Cloud Foundry 服務的宣布,對於所有 Grails 使用者來說,他的夢想幾乎成為現實。 現在,您不僅可以使用 Grails 進行簡單而快速的開發,還可以簡單而快速地部署到雲端託管供應商。

那麼 Grails 和 Cloud Foundry 如何協同工作? 正如長期 Grails 使用者所期望的那樣,我們有一個外掛程式! 為了展示它的運作方式,我將帶您完成將範例應用程式 Pet Clinic 部署到 Cloud Foundry 的過程。 這是一個簡單的應用程式,您已經可以在 Cloud Foundry 上看到它的實際運作

初始部署

我假設您已經安裝了 Grails 並擁有一個要使用的應用程式。 如果沒有,請查看網站上的 Grails 安裝快速入門指南。 然後,您可以取得 Pet Clinic 應用程式的原始碼

Pet Clinic 應用程式非常簡單,它將寵物、主人、獸醫和就診記錄儲存在 SQL 資料庫中。 因此,它所依賴的主要外掛程式是標準的 Hibernate 外掛程式。 那麼,我們需要做什麼才能將應用程式部署到 Cloud Foundry? 我們首先安裝 Cloud Foundry 外掛程式

    grails install-plugin cloud-foundry

完成後,我們需要提供使用者名稱和密碼才能存取 Cloud Foundry 服務。 當然,在您註冊帳戶之前,您無法執行此操作,因此請盡快完成註冊! 放置憑證的最佳位置是您的個人設定檔$HOME/.grails/settings.groovy因為它們將適用於所有您的 Grails 專案,並且您可以將它們保留在原始碼控制之外。 它們也可以放在grails-app/conf/BuildConfig.groovygrails-app/conf/Config.groovy如果您願意,但我通常不建議這樣做。

因此,我們將以下屬性新增到我們的settings.groovy檔案中,然後我們就可以開始了

grails.plugin.cloudfoundry.username = "<your_username>"
grails.plugin.cloudfoundry.password = "<pass>"

首先,我們檢查憑證是否有效,因此我們執行命令

    grails cf-info

如果一切順利,將會印出

    VMware's Cloud Application Platform
    For support visit [email protected]

    Target:   http://api.cloudfoundry.com (v0.999)

    User:     <your_username>
    Usage:    Memory   (1.0G of 2.0G total)
              Services (4 of 16 total)
              Apps     (2 of 20 total)

此命令會提供您的帳戶摘要,包括您正在執行的應用程式數量以及您正在使用的記憶體配額。

現在是您一直在等待的時刻:一鍵部署您的應用程式。 只需執行命令

    grails prod cf-push

請注意,我們甚至沒有配置DataSource.groovy- 這是故意的,我們稍後會回到資料來源配置。 但就目前而言,我們所要做的就是在詢問應用程式 URL 時以及在命令詢問我們是否要建立和繫結 MySQL 服務時按下 Enter 鍵。 然後我們等待外掛程式完成應用程式的部署 - 瞧! 應用程式已啟動並執行,可以使用了。

[callout title=Cloud Foundry Classic]您可能會注意到 0.1 和 0.2 版本的 Cloud Foundry 外掛程式。 這些外掛程式僅適用於 Classic Cloud Foundry 服務,因此請確保您不要意外安裝其中一個版本。[/callout]

還有什麼比這更簡單的? 在此階段需要注意的主要事項是您無法將應用程式部署到已在使用中的 URL,因此您無法將 Pet Clinic 應用程式部署到 URL http://petclinic-grails.cloudfoundry.com/。 不用擔心:您可以變更 application.properties 中的應用程式名稱,或在部署時指定其他應用程式名稱,稍後當我們更仔細地查看一些命令時,您將會看到。

另一個注意事項:cf-*命令預設為「development」環境,但您通常希望使用「production」環境進行部署。 這就是我們在上面的命令中指定「prod」的原因。

當然,並非每次部署都如此順利,您的應用程式可能會啟動失敗。 如果是這種情況,您可以透過命令取得 Tomcat 記錄

    grails cf-crashlogs

這些記錄應提供您足夠的資訊來診斷問題。

這就是一鍵部署! 在本文的其餘部分中,我將介紹您每天都會用到的一些最常見的命令,但您可以在外掛程式使用者指南中找到完整的參考資料。

應用程式更新和對佈建的細粒度控制

將應用程式部署到 Cloud Foundry 後,這並不是故事的結束。 當您想要部署新版本時會發生什麼? 或者擴展應用程式以處理更多並行使用者? Cloud Foundry 外掛程式具有豐富的命令集,可讓您處理這些和其他情況。

更新應用程式

假設您已將一個精美的新 UI 新增到 Pet Clinic 應用程式,現在您希望讓全世界都可以使用它。 您可能會認為您只需要再次執行cf-push,但實際上,有一個單獨的命令用於更新已部署的應用程式

    grails prod cf-update

有趣的是,此命令只會推送 WAR 檔案中已變更的部分,因此在初始部署之後,上傳到伺服器的速度會非常快。 它也會自動停止然後重新啟動應用程式伺服器。 因此,如果應用程式無法正確啟動,cf-crashlogs是您的好幫手。

應用程式名稱

正如我之前提到的,您無法使用 Cloud Foundry 上已在使用的名稱來部署應用程式。 那麼,這是否意味著您必須變更application.properties中的應用程式名稱? 您當然可以這樣做,因為外掛程式會將其用作 Cloud Foundry 上的預設應用程式名稱,但這不是唯一的選擇。

大多數cf-*命令都採用--appname選項,可讓您覆寫預設值。 例如,Pet Clinic 範例的應用程式名稱為「petclinic-grails」,但您可以使用以下命令在 Cloud Foundry 上以不同的名稱部署它

    grails cf-push --appname=my-pet-clinic

然後,該應用程式將可在 URL http://my-pet-clinic.cloudfoundry.com/ 上使用。

服務

大多數應用程式都需要將資料儲存在某個地方,無論是在 SQL 資料庫中,還是 MongoDB 等 NoSQL 資料儲存區中。 Cloud Foundry 透過服務的概念提供對這些儲存區的存取。 未來,預計還會看到其他類型的服務 - 例如快取和文字搜尋。

因此,您的應用程式只有在它需要的服務首先經過佈建,即建立/分配,然後繫結到應用程式後才能運作。 例如,對於 Pet Clinic,我們必須佈建 MySQL 服務並將其繫結到應用程式,以便它有一個儲存資料的地方。 幸運的是,cf-push命令會自動為我們執行此操作。

如果我執行cf-apps命令,您將看到如何將 MySQL 服務繫結到 petclinic-grails 應用程式

    +------------------+----+---------+-----------------------------------+---------------+
    | Application      | #  | Health  | URLs                              | Services      |
    +------------------+----+---------+-----------------------------------+---------------+
    | petclinic-grails | 1  | RUNNING | petclinic-grails.cloudfoundry.com | mysql-52db6   |
    +------------------+----+---------+-----------------------------------+---------------+

這表示「petclinic-grails」應用程式繫結到服務「mysql-52db6」,換句話說,「petclinic-grails」將其資料儲存在給定的 MySQL 執行個體中。 如果我執行cf-services,您將看到所有可佈建的服務以及您已佈建的服務的清單

    ============== System Services ==============

    +----------+---------+-------------------------------+
    | Service  | Version | Description                   |
    +----------+---------+-------------------------------+
    | mysql    | 5.1     | MySQL database service        |
    | redis    | 2.2     | Redis key-value store service |
    | mongodb  | 1.8     | MongoDB NoSQL store           |
    +----------+---------+-------------------------------+

    =========== Provisioned Services ============

    +---------------+---------+
    | Name          | Service |
    +---------------+---------+
    | mysql-52db6   | mysql   |
    +---------------+---------+

如您所見,Cloud Foundry 目前支援 MySQL、Redis 和 MongoDB,在我的下一篇文章中,我將介紹一個更複雜的範例,該範例使用所有三種類型的服務。

在目前的範例中,佈建服務的名稱「mysql-52db6」是由 Cloud Foundry 自動為我們產生的,但如果您手動佈建服務,也可以為服務指定自己的名稱。 例如

    grails cf-create-service mysql my-db

將佈建一個名為「my-db」的 MySQL 服務。 然後,您可以透過繫結服務將其用作應用程式的資料庫

    grails cf-bind-service my-db --appname=my-pet-clinic

您甚至可以在將應用程式推送到 Cloud Foundry 時指定應用程式應繫結到的服務:只需指定「--services」選項,如外掛程式使用者指南中所述。

此時,您的腦海中應該有一個大問題:應用程式如何知道在哪裡可以找到 MySQL 執行個體? 我們在任何時候都沒有指定資料庫連線 URL,但應用程式執行時沒有任何問題。 怎麼回事?

這是一種魔法

當您在 Cloud Foundry 中將服務繫結到應用程式時,您正在告訴雲端在執行時將該服務的連線設定傳遞給應用程式。 然後,Cloud Foundry 外掛程式會提取該資訊並覆寫應用程式中的連線設定。 彷彿是魔法一般,您的應用程式隨後會透明地針對雲端服務運作,而您無需執行任何操作! 這適用於所有可用的服務,而不僅僅是 MySQL。

僅覆寫連線設定,因此您仍然可以透過自訂方言(例如 InnoDB)來控制建立哪種類型的 MySQL 表格,以及 Hibernate 是否應使資料庫結構描述保持最新(透過「dbCreate」屬性)。 只要確保將自訂項目放在適當的環境區塊中即可。 例如,在DataSource.groovy中,您可能有

    production {
        dataSource {
            dialect= org.hibernate.dialect.MySQLInnoDBDialect
            driverClassName = "com.mysql.jdbc.Driver"
            username = "n/a"
            password = "n/a"
            url = "n/a"
            dbCreate = "update"
        }
    }

使用者名稱、密碼和 URL 可能是本機 MySQL 執行個體的值,因為一旦應用程式部署到 Cloud Foundry,這些值將被覆寫。

覆寫連線設定的過程並不是 Cloud Foundry 外掛程式提供的唯一魔法。 它還知道與 Cloud Foundry 服務相對應的外掛程式,因此如果您安裝了其中任何一個外掛程式,它將檢查您在部署應用程式時是否已佈建適當的服務。 這就是它詢問我們是否要為 Pet Clinic 應用程式佈建和繫結 MySQL 服務的原因:該應用程式已安裝 Hibernate 外掛程式。 這也適用於 MongoDB 和 Redis 外掛程式。

在結束之前,最後一件事:請確保在將使用這些服務的應用程式部署到 Cloud Foundry 之前,安裝最新版本的 MongoDB 和 Redis 外掛程式。

部署的聖杯

我已經介紹了相當多的 Cloud Foundry 服務和 Grails 外掛程式,但我希望您可以看到,透過 Grails 和 Cloud Foundry 的組合,部署變得多麼簡單。 它們確實可以實現簡單而快速的 Web 應用程式部署。 隨著 Cloud Foundry 目前版本的成熟,將會新增越來越多的服務,以便您可以在其上託管更複雜的應用程式。

最後,正如我先前所提到的,在下一篇文章中,我將會探討一個更複雜的範例應用程式,它結合了多種 Cloud Foundry 服務。文章將更深入地探討如何部署到雲端服務,以及您需要考量的各種事項。您也可以從 GitHub 上的 Cloud Foundry Samples wiki 獲取更多資訊。期待下次再見,祝您使用新服務愉快!

取得 Spring 電子報

隨時掌握 Spring 電子報的最新消息

訂閱

領先一步

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

了解更多

取得支援

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

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部