在 Cloud Foundry 上使用 Postgres

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

当 VMware 推出的新的开源平台即服务 (PaaS) 产品 Cloud Foundry 在今年早些时候推出时,它包含了一个由 MySQL 提供支持的关系数据库服务,以及 MongoDB 和 Redis 的 NoSQL 选项。开放 PaaS 的承诺之一是提供选择,包括您可以开发的语言和框架,以及可供使用的数据库服务。我们现在可以使用 PostgreSQL 提供新的关系数据库服务。这很棒,因为我们现在可以在两个最流行的开源关系数据库之间进行选择。PostgreSQL 是一个非常强大可靠的数据库,已经存在很长时间了,因此它绝对经受了考验。

vFabric Postgres on Cloud Foundry

新的 PostgreSQL 服务是我们关系数据库需求的绝佳选择。PostgreSQL 最初开发并优化用于在物理机器上运行。现在我们正在云中运行我们的数据库,因此有必要为该环境对其进行优化。这正是 VMware 为 Postgres 所做的,它创建了一个针对虚拟化云环境优化的版本。为了在 cloudfoundry.com 上为 PostgreSQL 服务提供支持,Cloud Foundry 团队正在使用 vFabric Postgres 9.0,这是一个针对 vSphere 优化的 Postgres 版本。vFabric Postgres 产品是 最近宣布的 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

接下来,我们需要为这个简短的示例创建我们的实体类。我将创建一个 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

访问应用程序,我们可以看到一个指向 Database Info Controller View 的新链接,该链接返回以下页面

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 社区中所有即将举行的活动。

查看全部