19.3 推送JAR文件到Cloud Foundry上

19.3 推送JAR文件到Cloud Foundry上

服务器的硬件购买和维护成本可能代价高昂。当出现高负载时,恰当地对服务器进行扩展是非常困难的,对有些组织来说,这样做甚至是不允许的。如今,相对于在自己的数据中心运行应用,将应用部署到云中是一种人们广泛关注并且能够节省成本的方案。

我们有多种可选的云方案,但是人们目前最关注的是平台即服务(Platform as aService,PaaS)。PaaS提供了现成的应用部署平台,其中包含多种可以绑定到应用上的附加服务(比如数据库和消息代理)。除此之外,如果你的应用需要额外的处理能力,那么云平台很容易在运行时对应用进行扩展(或收缩),这是通过添加和移除实例实现的。

Cloud Foundry是一个开源的PaaS平台,起源于Pivotal(Spring框架和Spring平台中的其他库也都是由这家公司赞助的)。Cloud Foundry最令人关注的一点在于它提供了开源和基于商业的发行版,让我们可以选择如何以及在哪里使用CloudFoundry。它甚至可以运行在防火墙之内的公司数据中心里面,提供私有云方案。

虽然Cloud Foundry很乐意接受WAR文件,但是对于Cloud Foundry的需要来说,WAR文件格式过于重量级了。更简单的可执行JAR文件更适合部署到CloudFoundry中。

为了演示如何构建和部署可执行JAR文件到Cloud Foundry,我们将会构建配料服务应用并将其部署到Pivotal Web Services(PWS)上。如果想要使用PWS,我们就需要注册一个账户。PWS提供87美元的免费试用功能,在试用期间甚至不需要提供任何信用卡信息。

注册完PWS之后,我们需要从PWS下载并安装cf命令行工具。我们将会使用cf工具将应用推送至Cloud Foundry。首先,我们需要使用它来登录PWS账号:

1
2
3
4
5
6
$ cf login -a https://api.run.pivotal.io
API endpoint: https://api.run.pivotal.io
Email> {your email}
Password> {your password}
Authenticating...
OK

非常好!现在,我们已经准备好将配料服务部署到云中了。实际上,这个项目本身现在就可以部署到Cloud Foundry中,我们所需要做的就是构建并将其推送至云端。

要使用Maven构建项目的话,我们可以使用Maven包装器执行package goal(将会在target目录下得到形成的JAR文件):

1
$ mvnw package

如果使用Gradle,那么我们可以使用Gradle包装器运行build任务(将会在build/libs目录下得到形成的JAR文件):

1
$ gradlew build

现在,剩下的事情就是使用cf命令将JAR文件推送至Cloud Foundry:

1
$ cf push ingredient-service -p target/ingredient-service-0.0.19-SNAPSHOT.jar

cf push命令的第一个参数指定了在Cloud Foundry中该应用的名称。除了其他功能之外,这个名称还会用作应用托管的子域。因此,非常重要的一点在于,我们为应用设置的名称必须是唯一的,避免与Cloud Foundry已部署的应用(包括其他Cloud Foundry用户所部署的应用)冲突。

想一个唯一名称可能会比较麻烦,cf push命令提供了–random-route选项,它会为我们随机生成一个子域。如下的命令展现了如何将配料服务应用推送至一个随机生成的路由:

1
2
3
$ cf push ingredient-service \
-p target/ingredient-service-0.0.19-SNAPSHOT.jar \
--random-route

在使用–random-route的时候,依然需要应用名称,但是会在该名称上拼接两个随机选择的单词以生成子域。

假设所有的过程都很顺利,应用应该已经部署就位并且可以处理请求了,子域是ingredient-service,那么我们可以通过浏览器访问http://ingredient-service.cfapps.io/ingredients 来查看实际效果。在响应中,我们会看到一个可用配料的列表。

在我编写该应用的时候,它会使用嵌入式的Mongo数据库(这样做只是为了测试)来存放配料数据。在生产环境中,我们可能想要使用真正的数据库。在我编写本书的时候,PWS提供了一个完全托管的MongoDB服务,名为mlab。我们可以使用cf marketplace命令查看该服务(以及其他所有可用的服务)。要创建mlab实例,我们可以使用cf create-service命令:

1
$ cf create-service mlab sandbox ingredientdb

该命令会按照沙箱(sandbox)服务计划创建一个mlab服务,名为ingredientdb。服务创建完成之后,我们可以使用cf bind-service命令将其绑定到应用上。例如,要将ingredientdb服务绑定至配料服务应用,我们可以使用如下的命令:

1
$ cf bind-service ingredient-service ingredientdb

将服务绑定至应用只是为应用提供了如何连接至服务的详情,这是通过名为VCAP_SERVICES的环境变量实现的。它并没有改变应用使用服务的方式。服务绑定完成之后,我们需要重新部署(re-stage)应用才能使绑定生效:

1
$ cf restage ingredient-service

cf restage命令会强制Cloud Foundry重新部署应用并重新计算VCAP_SERVICES的值。在这个过程中,它会发现应用绑定了一个MongoDB服务,就会使用该服务作为应用的后端数据库。

PWS提供了很多可用的服务,我们可以直接将它们绑定到应用中,包括MySQL数据库、PostgreSQL数据库,甚至现成的Eureka和Config Server服务。建议你阅读一下PWS的Marketplace页面,以了解PWS都提供了哪些服务。关于PWS如何使用,可以参考其官网。

对于Spring Boot应用的部署来讲,Cloud Foundry是一个非常棒的PaaS方案。鉴于它与Spring项目之间的关系,所以会在这两者之间提供一些协同的功能。在云中部署应用程序的另一种常见方法是将应用程序打包到Docker容器中,然后发布到云中,在将应用程序推进到AWS这样的基础设施即服务(Infrastructure-as-a-Service, IAAS)平台时更是如此。下面让我们看看如何创建一个携带Spring Boot应用程序的Docker容器。