在 Cloud Foundry 上使用 Postgres

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

今年早些时候,VMware 推出了新的开源平台即服务 (PaaS) 产品 Cloud Foundry,其中包括由 MySQL 支持的关系型数据库服务,以及 MongoDB 和 Redis 等 NOSQL 选项。开放 PaaS 的承诺之一是为您提供选择,包括可用于开发的语言和框架,以及可用的数据库服务。我们现在新增了一个使用 PostgreSQL 的关系型数据库服务。这太好了,因为我们现在可以在两种最流行的开源关系型数据库之间进行选择。PostgreSQL 是一个非常健壮可靠的数据库,存在已久,因此绝对经受住了实战考验。

Cloud Foundry 上的 vFabric Postgres

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

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

使用 Roo 构建图书架示例应用

要开始在 Cloud Foundry 上使用 PostgreSQL,您首先需要在 Cloud Foundry 上拥有一个帐户。完成此步骤后,我们就可以开始开发第一个数据库应用程序了。编写 Spring 应用程序的最快方法是使用 Spring Roo,它是 Spring 为 Java 开发人员提供的快速应用程序开发工具。当然,这意味着您需要安装 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

接下来我们需要为这个简短的示例创建 Entity 类。我将创建一个 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 社区所有即将举办的活动。

查看全部