超前一步
VMware 提供培训和认证,助您加速进步。
了解更多今年早些时候,VMware 推出了新的开源平台即服务 (PaaS) 产品 Cloud Foundry,其中包括由 MySQL 支持的关系型数据库服务,以及 MongoDB 和 Redis 等 NOSQL 选项。开放 PaaS 的承诺之一是为您提供选择,包括可用于开发的语言和框架,以及可用的数据库服务。我们现在新增了一个使用 PostgreSQL 的关系型数据库服务。这太好了,因为我们现在可以在两种最流行的开源关系型数据库之间进行选择。PostgreSQL 是一个非常健壮可靠的数据库,存在已久,因此绝对经受住了实战考验。
那么,从开发人员的角度来看,vFabric Postgres 和常规 PostgreSQL 之间有什么区别吗?没有,它们在功能上是相同的。您使用相同的 JDBC 驱动程序和 SQL 语法。所做的更改是内部的,与提供云所需的弹性和性能有关。
现在我们已经具备了所有先决条件,可以开始了。首先为应用程序创建一个目录并打开 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
~.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 会得到什么
应用程序已启动并运行,我们可以添加和查看书架上的书籍。
~.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
访问应用程序时,我们可以看到指向 数据库信息控制器视图 的新链接,该视图返回以下页面
正如您所见,我们在云端部署的应用中使用了 vFabric Postgres。
有关此新产品的更多信息,请参阅 Jignesh Shah 的博客。