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 服务时按回车键即可。然后我们等待插件完成应用程序的部署 - 瞧!应用程序已启动并运行,可以使用了。

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

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部