领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多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 应用程序在不更改应用程序任何内容的情况下使用服务。在此之前,祝您愉快!