使用 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 服务。

当您将 Postgres 或 Mongo 等 Cloud Foundry 服务绑定到应用程序时,有关绑定服务的信息(例如主机、端口和凭据)通过环境变量公开,其值编码为 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> <applciation-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 社区中所有即将举行的活动。

查看全部