領先一步
VMware 提供培訓和認證,助您加速進步。
瞭解更多幾年前,一家初創公司的聯合創始人曾在倫敦 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.groovy或grails-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 服務時按回車鍵即可。然後我們等待外掛完成應用程式的部署 - 瞧!應用程式已啟動並執行,可以使用了。
[callout title=Cloud Foundry Classic]您可能會注意到 Cloud Foundry 外掛的 0.1 和 0.2 版本。這些版本只適用於 Classic Cloud Foundry 服務,因此請確保您不會意外安裝這些版本之一。[/callout]
還有什麼比這更簡單呢?在此階段需要注意的主要一點是,您不能將應用程式部署到已被使用的 URL,因此您將無法將 Pet Clinic 應用程式部署到例如 http://petclinic-grails.cloudfoundry.com/ 這個 URL。不用擔心:您可以更改 application.properties 中的應用程式名稱,或者在部署時指定不同的應用程式名稱,正如我們稍後更詳細地檢視一些命令時所看到的那樣。
另外一點說明:cf-*命令預設使用“development”環境,但您通常希望在部署時使用“production”環境。這就是為什麼我們在上面的命令中指定“prod”。
當然,並非每次部署都如此順利,您的應用程式可能會啟動失敗。如果出現這種情況,您可以透過以下命令獲取 Tomcat 日誌
grails cf-crashlogs
日誌應該會提供足夠的資訊來診斷問題。
這就是一步部署!在本文的其餘部分,我將介紹一些您日常會用到的大多數常用命令,但您可以在外掛使用者指南中找到完整的參考。
將應用程式部署到 Cloud Foundry 後,這並不是故事的結局。當您想部署新版本時會發生什麼?或者擴充套件應用程式以處理更多併發使用者?Cloud Foundry 外掛擁有一系列豐富的命令,可讓您處理這些情況以及其他情況。
假設您為 Pet Clinic 應用程式添加了一個漂亮的新 UI,現在您想讓它對全世界可用。您可能認為只需要再次執行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。
只有連線設定會被覆蓋,因此您仍然可以透過自定義方言控制建立何種型別的 MySQL 表(例如 InnoDB),以及 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 外掛也有效。
在結束之前,最後一點:在將使用 MongoDB 和 Redis 服務的應用程式部署到 Cloud Foundry 之前,請確保您已安裝這些外掛的最新版本。
我已經介紹了相當多的 Cloud Foundry 服務及其 Grails 外掛,但我希望您能看到 Grails 和 Cloud Foundry 結合後部署變得多麼簡單直接。它們確實使 Web 應用程式的部署變得簡單快捷。隨著當前版本的 Cloud Foundry 日趨成熟,將新增越來越多的服務,以便您可以在其上託管更復雜的應用程式。
最後,正如我前面提到的,在下一篇文章中,我將介紹一個更復雜的示例應用程式,它結合了多個 Cloud Foundry 服務。它將更深入地探討部署到雲服務以及您需要考慮的事項。您還可以從 GitHub 上的Cloud Foundry Samples wiki 中獲取額外資訊。直到下次,享受新服務吧!