领先一步
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 中获取额外信息。直到下次,享受新服务吧!