VMware 的 CloudFoundry 服务获得对 PostgreSQL 支持

  • Kostis Kapelonis
  • 吴宇

2011 年 11 月 10 日

话题:JavaMySQL云计算DevOps语言 & 开发

今年年初,VMware 宣布了 CloudFoundry 项目,一款平台即服务(PAAS)开源解决方案,其预置提供对 MongoDB、MySQL 及 Redis 此类服务的支持。最近它将 PostgreSQL 和 RabbitMQ 加入到云服务列表中以便为各应用所使用,同时也提供了一个可运行在单个工作站上的Micro 版CloudFoundry。

PostgreSQL纳入 CloudFoundry 还是很有趣的,因为它是一个非常有特色的传统数据库,其受众较之 MySQL 或 MongoDB 的用户截然不同。为了更好使用 PostgreSQL,cloudfoundry 并没有直接使用其正常发布的版本而是在vFabric之上定制了一个版本,这在官方博客上有做解释。(译者注:针对云平台对 PostgreSQL 做了一些优化。)

该博客上给了一个样例说明如何利用 Spring Roo 在一个 Java 项目中使用 PostgreSQL。我们这里介绍另一种可选方案,针对的 Java 应用是某个基于 Spring 使用了 JPA 的WAR

假设你的应用已有的 Spring 上下文初始化内容如:


<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
	<property name="persistenceUnitName" value="myJpaManager" />
	<property name="dataSource" ref="dataSource"/>
</bean>

<bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
	<property name="driverClassName" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost/postgres" />
	<property name="username" value="postgres" />
        <property name="password" value="postgres" />
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" />
<context:annotation-config />

META-INF/persistence.xml文件如:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
	<persistence-unit name="myJpaManager" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
	<properties>
                <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
		<property name="hibernate.hbm2ddl.auto" value="update" />
        </properties> 
	</persistence-unit>
</persistence>

多亏了 CloudFoundry 的自动配置功能,此应用可以被直接上传到 CloudFoundry,完全不用做任何修改。

PostgreSQL(包括 MySQL 和其他平台支持的服务)充分利用了 Cloudfoundry 提供的自动配置功能。在特定条件下,使用了 PostgreSQL 的某一本地 Java 应用可以上传到 Cloudfoundry 而无需修改任何一行代码

自动配置利用了 Spring 核心容器的功能,当下面两个条件都满足的情况下可以生效

  1. 任一给定的服务类型有且只有一个服务实现。比如,你应该只给自己的应用绑定一个关系型数据库服务(MySQL 或 PostgreSQL)。
  2. 每个匹配类型对应有且只有一个 bean。比如,在你的应用上下文中应该只出现一个数据源 bean。

如果满足上述需求,那 Cloudfoundry 将会自动拦截你的本地数据源,并使用 Cloudfoundry 服务来代替那些设置在 Spring 上下文中的值。

剩下唯一要做的就是积极地回答当应用被上传到云上,vmc是何时请求服务绑定的。

对于更加复杂的应用,Spring 3.1预计能增加一个特殊的命名空间并提供运行时概要支持。

查看英文原文:VMware's CloudFoundry Service Gains Support for PostgreSQL

JavaMySQL云计算DevOps语言 & 开发