在 Cloud Foundry 上使用 Postgres

工程 | Thomas Risberg | 2011 年 8 月 30 日 | ...

VMware 在今年早些时候推出新的开源平台即服务 (PaaS) 产品 Cloud Foundry 时,它不仅提供了基于 MongoDB 和 Redis 的 NoSQL 选项,还包含了一个由 MySQL 支持的关系数据库服务。Open PaaS 的承诺之一是提供语言和框架的选择,以及可用的数据库服务。现在,我们有了一个新的、基于 PostgreSQL 的关系数据库服务。这非常好,因为我们现在可以在两个最流行的开源关系数据库之间进行选择。PostgreSQL 是一个非常健壮且可靠的数据库,它已经存在了很长时间,因此它绝对经过了实战考验。

Cloud Foundry 上的 vFabric Postgres

新的 PostgreSQL 服务是满足我们关系数据库需求的绝佳选择。PostgreSQL 最初的开发和优化是为了在物理机上运行。现在我们正在云中运行我们的数据库,将其优化以适应云环境是很有意义的。VMware 通过创建了一个针对虚拟化云环境进行了优化的版本,正是为 Postgres 做到了这一点。为了在 cloudfoundry.com 上为 PostgreSQL 服务提供支持,Cloud Foundry 团队正在使用 vFabric Postgres 9.0,这是 Postgres 的一个 vSphere 优化版本。vFabric Postgres 产品是 最近宣布vFabric Data Director 的一部分,vFabric Data Director 是一个新的数据库配置和运营解决方案,旨在为企业提供数据库即服务 (Database-as-a-Service) 模型。Data Director 支持的第一个数据库是 vFabric Postgres。

那么,从开发者的角度来看,vFabric Postgres 和普通的 PostgreSQL 有什么区别吗?没有,它们在功能上是相同的。您使用相同的 JDBC 驱动程序和 SQL 语法。所做的更改是内部的,与提供云所需的弹性和性能相关。

使用 Roo 构建书架示例应用程序

要开始在 Cloud Foundry 上使用 PostgreSQL,您首先需要一个 Cloud Foundry 账户。一旦准备好,我们就可以开始开发我们的第一个数据库应用程序。编写 Spring 应用程序最快的方法是使用 Spring 的 Java 开发人员快速应用程序开发工具 Spring Roo。当然,这意味着您需要 安装 RooCloud Foundry 插件

现在我们已经具备了所有先决条件,可以开始了。首先创建一个应用程序目录并打开 Roo shell。打开后,我们可以创建我们的项目。


roo> project --topLevelPackage org.springsource.data.demo.bookshelf

现在我们准备好为我们的 Roo 应用程序配置持久化选项。我将选择 Hibernate 作为 JPA 提供程序,并选择 Postgres 作为数据库。由于我们将在 Cloud Foundry 中运行此应用程序,因此无需提供任何自定义连接属性。连接详细信息由我们自动管理。


org.springsource.data.demo.bookshelf roo> persistence setup --provider HIBERNATE --database POSTGRES

接下来,我们需要为这个简单的示例创建实体类。我将创建一个 Book 类,它将成为我新 BookShelf 应用程序的一部分。我现在只创建 Book 类,将来再添加 Author 和任何其他类。


org.springsource.data.demo.bookshelf roo> entity --class ~.domain.Book
~.domain.Book roo> field string --fieldName title --sizeMax 200
~.domain.Book roo> field string --fieldName isbn --sizeMax 20
~.domain.Book roo> field date --fieldName published --type java.util.Date
~.domain.Book roo> field number --fieldName price --type java.math.BigDecimal

完成此操作后,我们就可以为我们的 Book 类创建 Web 应用程序和控制器了。


~.domain.Book roo> controller all --package ~.web

我们完成了,在我看来,这相当顺利。现在我们需要将所有内容打包,连接到 Cloud Foundry 并部署应用程序。


~.web roo> perform package
~.web roo> cloud foundry login
~.web roo> cloud foundry deploy --appName bookshelf --path /target/bookshelf-0.1.0.BUILD-SNAPSHOT.war

部署完成后,我们应该能够列出我们当前的一组应用程序。


~.web roo> cloud foundry list apps

================================================ Applications ================================================

Name                      Status      Instances     Services             URLs
----                      ------      ---------     --------             ----
bookshelf                 STOPPED     1                                  bookshelf.cloudfoundry.com

将应用程序连接到 Cloud Foundry 上的 PostgreSQL

现在我们来到了有趣的部分。如上所示,应用程序处于停止状态。我们现在无法启动它,因为我们还没有创建数据库并将其绑定到应用程序。所以,让我们现在就做,但首先让我们看看有哪些可用的数据服务。

~.web roo> cloud foundry list services

=================== System Services ====================

Service        Version     Description
-------        -------     -----------
rabbitmq       2.4         RabbitMQ messaging service
mongodb        1.8         MongoDB NoSQL store
redis          2.2         Redis key-value store service
postgresql     9.0         PostgreSQL database service (vFabric)
mysql          5.1         MySQL database service

太好了,PostgreSQL 确实可用。那么,让我们创建一个数据库服务实例,将其绑定到应用程序并启动应用程序。


~.web roo> cloud foundry create service --serviceName books --serviceType postgresql
~.web roo> cloud foundry bind service --serviceName books --appName bookshelf
~.web roo> cloud foundry start app --appName bookshelf

让我们看看访问 http://bookshelf.cloudfoundry.com 时会得到什么。

bookshelf screen

所以应用程序已经启动并运行,我们可以添加和查看书架上的书籍。

更多关于 Cloud Foundry 上的 PostgreSQL

我们在上面的示例中看到,我们可以将应用程序连接到 PostgreSQL。但是我们如何知道我们是运行在普通的 PostgreSQL 安装还是 vFabric Postgres 上呢?一种确定方法是检查 version() 函数的输出。它通常会显示类似“PostgreSQL 9.0.4 on x86_64-pc-linux-gnu, compiled by GCC gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3, 64-bit”的内容。由于在 cloudfoundry.com 上运行的 Postgres 数据库基于 vFabric Postgres 9.0,我们实际上会看到一个返回值,上面写着“[PostgreSQL 9.0.4 ] vPostgres 1.0 release-v build”。让我们看看是否可以轻松地向我们的 Web 应用程序添加一个页面来显示一些数据库信息。我将创建一个 DatabaseInfo 控制器,我可以对其进行修改。

~.web roo> controller class ~.web.DatabaseInfoController

这创建了一个控制器 (bookshelf/src/main/java/org/springsource/data/demo/bookshelf/web/DatabaseInfoController.java),我在 index 方法中添加了一个 DataSource 和一些数据库信息检索代码。


@RequestMapping("/databaseinfo/**")
@Controller
public class DatabaseInfoController {

   @Autowired
   DataSource dataSource;

    @RequestMapping
    public void get(ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    }

    @RequestMapping(method = RequestMethod.POST, value = "{id}")
    public void post(@PathVariable Long id, ModelMap modelMap, HttpServletRequest request, HttpServletResponse response) {
    }

    @RequestMapping
    public String index(ModelMap modelMap) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    	String userInfo = jdbcTemplate.queryForObject("select user", String.class);
    	String urlInfo = "?";
    	if (dataSource instanceof BasicDataSource) {
    	    urlInfo = ((BasicDataSource) dataSource).getUrl();
	}
	String versionInfo = jdbcTemplate.queryForObject("select version()", String.class);
        modelMap.put("userInfo", userInfo);
        modelMap.put("urlInfo", urlInfo);
        modelMap.put("versionInfo", versionInfo);
        return "databaseinfo/index";
    }
}

还有一个 JSP 文件 (bookshelf/src/main/webapp/WEB-INF/views/databaseinfo/index.jspx) 由此控制器使用,并且需要添加一些代码。


<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" version="2.0">
  <jsp:directive.page contentType="text/html;charset=UTF-8"/>
  <jsp:output omit-xml-declaration="yes"/>
  <spring:message code="label_databaseinfo_index" htmlEscape="false" var="title"/>
  <util:panel id="title" title="${title}">
    <spring:message code="application_name" htmlEscape="false" var="app_name"/>
    <h3>
      <spring:message arguments="${app_name}" code="welcome_titlepane"/>
    </h3>
    <p>  The database user is ${userInfo}. </p>
    <p>  The dataSource URL is ${urlInfo}. </p>
    <p>  The database version is ${versionInfo}. </p>
  </util:panel>
</div>

现在我们可以构建修改后的应用程序并将其部署到云端。


~.web roo> perform package
~.web roo> cloud foundry deploy --appName bookshelf --path /target/bookshelf-0.1.0.BUILD-SNAPSHOT.war

访问应用程序,我们可以看到一个指向 数据库信息控制器视图 的新链接,该视图返回以下页面。

bookshelf db info

正如您所见,我们在云部署的应用程序中使用了 vFabric Postgres。

我可以在自己的服务器或私有云上运行 vFabric Postgres 吗?

是的,您可以获取 vFabric Postgres 用于开发或生产。您还需要配套产品 vFabric Data Director 来管理数据库实例。vFabric Data Director 是一种软件解决方案,使您能够为您的云提供数据库即服务 (DBaaS)。它专为云环境设计,能够管理数千个数据库,同时为应用程序开发人员提供自助数据库管理。

有关此新产品的更多信息,请参阅 Jignesh Shah 的博客

 

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

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

了解更多

即将举行的活动

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

查看所有