使用 Cloud Foundry 服务与 Spring:第一部分 - 基础知识

工程 | 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> <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,以及连接到它的用户名和密码(主机名已弃用,将在未来版本中删除)。

让我们绑定另一个服务,这次是 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 社区中所有即将举行的活动。

查看全部