将 Cloud Foundry 服务与 Spring 结合使用:第 1 部分 - 基础知识

工程 | Ramnivas Laddad | 2011年10月13日 | ...

Cloud Foundry 中提供的服务使得编写高效且有效的应用程序成为可能。开发人员现在可以选择恰到好处的服务,而无需担心这些服务的操作。例如,应用程序的一部分可以选择 Postgres 用于事务访问至关重要的部分,MongoDB 用于将数据作为文档集合进行交互有意义的部分,Redis 用于键值是正确抽象的部分,以及 RabbitMQ 用于消息传递有助于创建有效架构的部分。在这个由四部分组成的博客系列中,我们将探讨 Spring 应用程序如何使用 Cloud Foundry 服务。虽然我们的重点是 Spring,但使用其他框架,尤其是基于 JVM 的框架(Grails、Lift 和纯 Java Web)的开发人员会发现这些博客的大部分内容都具有相关性。

在第一部分中,我们将探讨 Cloud Foundry 如何向应用程序公开服务信息。在下一篇博客中,我将描述一个典型的 Spring 应用程序如何使用自动重新配置机制,该机制允许在不进行任何修改的情况下使用服务。在第三篇博客中,Thomas Risberg 将解释如何使用“cloud”命名空间来明确控制服务的消费。在第四部分中,Scott Andrews 将展示如何将 Spring 3.1 中的配置文件支持与“cloud”命名空间结合起来,创建允许明确控制服务,同时允许应用程序在本地或 Cloud Foundry 中运行而无需任何更改的应用程序。通过本系列博客,您应该拥有足够的信息来有效地从 Spring 应用程序中使用 Cloud Foundry 服务。

当您将 Cloud Foundry 服务(例如 Postgres 或 Mongo)绑定到应用程序时,有关绑定服务的信息(例如主机、端口和凭据)通过环境变量公开,其值以 JSON 编码。为了说明这一点,我们将创建一个简单的 Web 应用程序,显示所有环境变量。我们从一个 Spring MVC 模板项目开始,并在 HomeController 中添加以下端点(您可以在 GitHub 上查看此应用程序)。


@RequestMapping("/env")
public void env(HttpServletResponse response) throws IOException {
    response.setContentType("text/plain");
    PrintWriter out = response.getWriter();
    out.println("System Environment:");
    for (Map.Entry<String, String> envvar : System.getenv().entrySet()) {
        out.println(envvar.getKey() + ": " + envvar.getValue());
    }
}

让我们部署这个应用程序。我将使用“vmc”工具,但使用带有 Cloud Foundry 插件的 STS 也可以。请注意,我使用 hello-env 作为应用程序名称,并基于它使用默认 URL (hello-env.cloudfoundry.com)。如果您正在按照本博客进行编码,您会想要选择一个应用程序名称,以便其默认 URL 尚未被占用。或者,您可以部署到 Micro Cloud Foundry


$ vmc push hello-env -n
Creating Application: OK
Uploading Application:
  Checking for available resources: OK
  Processing resources: OK
  Packing application: OK
  Uploading (8K): OK   
Push Status: OK
Staging Application: OK                                                         
Starting Application: OK

此时,如果您导航到 http://hello-env.cloudfoundry.com/env,您将看到一个页面,其中包含所有环境变量,其中许多以 VCAP_ 开头,公开了有关应用程序的各种信息。我们感兴趣的是 VCAP_SERVICES 变量,它目前显示为:


VCAP_SERVICES: {}

我们看到该变量为空映射(在 JSON 表示中),这正确地表明没有绑定任何服务。让我们创建一个 Postgres 服务,将其命名为 env-postgresql,并将其绑定到我们的应用程序。请注意命令的形式:vmc create-service <service-type> <service-name> <application-name>


$ vmc create-service postgresql env-postgresql hello-env
Creating Service: OK
Binding Service: OK
Stopping Application: OK
Staging Application: OK                                                         
Starting Application: OK

现在,让我们再次导航到 http://hello-env.cloudfoundry.com/env,您将看到 VCAP_SERVICES 环境变量(此处为提高可读性已格式化)显示为:


{
    "postgresql-9.0": [{
        "name": "env-postgresql",
        "label": "postgresql-9.0",
        "plan": "free",
        "credentials": {
            "name": "de24667f9344b4eeaad6b5a2326d52faa",
            "host": "172.30.48.122",
            "hostname": "172.30.48.122",
            "port": 5432,
            "user": "u50ce600bba434bacbc99e034bb415644",
            "username": "u50ce600bba434bacbc99e034bb415644",
            "password": "pf4dca5bd449d4732841f0c4ae3f299d0"
        }
    }]
}

这包含了应用程序连接到它所需的所有信息:主机、端口和名称用于创建 JDBC URL,以及用户名和密码用于连接到它(hostname 已弃用,并将在未来版本中删除)。

让我们绑定另一个服务,这次是 MongoDB。


$ vmc create-service mongodb env-mongodb hello-env

现在环境变量将看起来像:


{
    "mongodb-1.8": [{
        "name": "env-mongodb",
        "label": "mongodb-1.8",
        "plan": "free",
        "tags": ["mongodb", "mongodb-1.8", "nosql"],
        "credentials": {
            "hostname": "172.30.48.68",
            "host": "172.30.48.68",
            "port": 25026,
            "username": "b8b312a0-9b43-4104-90f8-52f2ac8bc7c6",
            "password": "6a62732d-f820-4690-9bab-d1c85af13323",
            "name": "416e990a-6f81-46f9-abaa-1233a11ca5d6",
            "db": "db"
        }
    }],
    "postgresql-9.0": [{
        "name": "env-postgresql",
        "label": "postgresql-9.0",
        "plan": "free",
        "credentials": {
            "name": "de24667f9344b4eeaad6b5a2326d52faa",
            "host": "172.30.48.122",
            "hostname": "172.30.48.122",
            "port": 5432,
            "user": "u50ce600bba434bacbc99e034bb415644",
            "username": "u50ce600bba434bacbc99e034bb415644",
            "password": "pf4dca5bd449d4732841f0c4ae3f299d0"
        }
    }]
}

同样,MongoDB 部分包含了连接到它所需的所有信息。

这就是 Cloud Foundry 如何向您的应用程序公开服务信息,以便它可以消费绑定到它的服务。这需要访问环境变量、解析 JSON 并创建访问对象(例如关系数据库的 DataSource)。虽然不难,但这并不是程序员想要或喜欢直接处理的事情。因此,Cloud Foundry 提供了一些机制来简化连接服务的任务,我们将在本系列的后面部分探讨这些机制。

在下一部分中,我将向您展示自动重新配置机制,该机制允许典型的 Spring 应用程序在不更改应用程序的任何内容的情况下消费服务。在此之前,尽情享受吧!

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有