Spring 使用 Cloud Foundry 服务:第三部分 - <cloud> 命名空间

工程 | Thomas Risberg | 2011年11月9日 | ...

我们在上一篇博客文章使用 Cloud Foundry 服务与 Spring:第二部分 - 自动重新配置中看到,当你部署 Spring 应用时,系统会检测你对数据服务的使用,并且你的应用将自动重新配置以使用你的应用可用的云服务。这对于简单的应用和演示来说非常有效,但如果你有一个严肃的生产应用,你可能希望有更多的控制权。如果存在多个相同类型的服务,你也需要更多的控制。Ramnivas 暗示了这一点,他说你可以通过显式使用云数据服务工厂 Bean(如 CloudMongoDbFactoryBeanCloudRedisConnectionFactoryBean 等)来选择不进行自动重新配置。最简单的方法是使用 <cloud> 命名空间来定义你的服务。这篇博客文章将更详细地介绍这个命名空间。

在你的应用中包含 <cloud> 命名空间。

你需要在构建中包含 org.cloudfoundry:cloudfoundry-runtime 依赖项。如果你使用 Maven,将此依赖项添加到你的 pom.xml 中


<dependencies>
    <dependency>
        <groupId>org.cloudfoundry</groupId>
        <artifactId>cloudfoundry-runtime</artifactId>
        <version>0.8.1</version>
    </dependency>

    <!-- additional dependency declarations -->
</dependencies>

你还需要在 pom.xml 中拥有 Spring Framework Milestone Repository。只需将此仓库声明添加到你的 repositories 中


<repositories>
    <repository>
        <id>org.springframework.maven.milestone</id>
        <name>Spring Framework Maven Milestone Repository</name>
        <url>http://maven.springframework.org/milestone</url>
    </repository>

    <!-- additional repository declarations -->
</repositories>

现在我们准备将 <cloud> 命名空间添加到我们的应用上下文文件中。我们需要声明命名空间(第 5 行)并提供模式位置(第 8 行)。一旦声明了这些,我们就可以在 xml 文件中使用 <cloud> 命名空间元素(第 10 行)。以下是完整示例:


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:cloud="http://schema.cloudfoundry.org/spring"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
	http://schema.cloudfoundry.org/spring http://schema.cloudfoundry.org/spring/cloudfoundry-spring-0.8.xsd">

    <cloud:mongo-db-factory id="mongoDbFactory">

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongoDbFactory"/> 	
    </bean>

    <!-- more beans for your app -->

</beans>

本博客文章的其余部分将涵盖所有可用的命名空间元素及其配置选项。

可用命名空间元素

<cloud:data-source>

<cloud:data-source> 元素提供了一种方便的方式来为你的 Spring 应用配置 JDBC DataSource

基本属性

  • id - 默认为服务名称
  • service-name - 仅当你绑定到应用的服务中有多个关系型数据库服务时才需要

一个简单的 DataSource 配置示例,用于注入到 JdbcTemplate 中,看起来像这样,唯一的属性是指定数据源 Bean 的 id。


<cloud:data-source id="dataSource" />

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource" />
</bean>

有一些子元素可用于配置特定的连接和连接池设置。<cloud:data-source> 命名空间元素通过 <cloud:connection><cloud:pool> 子元素支持最常用的配置选项。支持的选项解释如下:

<cloud:connection> 选项

命名空间属性 描述 类型
properties 建立新连接时将发送给 JDBC 驱动程序的连接属性。字符串格式必须为 "propertyName=property;" string

<cloud:pool> 选项

命名空间属性 描述 类型 默认值
pool-size 池中最大连接数,或者用连字符分隔的最小和最大大小范围。 int 使用 Apache Commons Pool 的默认设置,最小为 0,最大为 8
max-wait-time 当没有可用连接时,连接池等待连接返回的最长毫秒数,超过此时间将抛出异常。-1 表示无限等待。 int 使用 Apache Commons Pool 的默认设置,即无限 (-1)

以下是一个指定了额外设置的 DataSource 配置示例:


<cloud:data-source id="mydatasource">
    <cloud:connection properties="charset=utf-8;" />
    <cloud:pool pool-size="5-10" max-wait-time="2000" />
</cloud:data-source>

<cloud:mongo-db-factory>

<cloud:mongo-db-factory> 元素提供了一种方便的方式来为你的 Spring 应用配置 MongoDB 连接工厂。

基本属性

  • id - 默认为服务名称
  • service-name - 仅当你绑定到应用的服务中有多个 MongoDB 服务时才需要
  • write-concern - 用于创建的所有 DB 连接的 WriteConcern(NONE, NORMAL, SAFE, FSYNC_SAFE)。如果未指定,则不会为 DB 连接设置 WriteConcern,所有写入将默认为 NORMAL

write-concern 属性的值对应于 com.mongodb.WriteConcern 类中可用的值。

描述
NONE 不抛出异常,即使是网络问题
NORMAL 对网络问题抛出异常,但不包括服务器错误
SAFE 对网络问题和服务器错误都抛出异常;在服务器上等待写入操作完成
FSYNC_SAFE 对网络问题和服务器错误都抛出异常,并且写入操作等待服务器将数据刷新到磁盘

一个简单的 MongoDbFactory 配置示例,用于注入到 MongoTemplate 中,看起来像这样,唯一的属性是指定 mongoDbFactory bean 的 id。


<cloud:mongo-db-factory id="mongoDbFactory" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg ref="mongoDbFactory"/> 	
</bean>

有一些可通过 <cloud:mongo-options> 子元素获得的高级配置属性,如下所示。

<cloud:mongo-options>

命名空间属性 描述 类型 默认值
connections-per-host Mongo 实例每个主机允许的最大连接数。这些连接在空闲时会保存在连接池中。一旦连接池耗尽,任何需要连接的操作将阻塞等待可用连接。 int Mongo 驱动程序默认为 10
max-wait-time 线程等待连接可用的最大等待时间(毫秒)。 int Mongo 驱动程序默认为 120000

以下是一个指定了额外设置的 MongoDbFactory 配置示例:


<cloud:mongo-db-factory id="mongoDbFactory" write-concern="FSYNC_SAFE">
    <cloud:mongo-options connections-per-host="10" max-wait-time="2000" />
</cloud:mongo-db-factory>

<cloud:redis-connection-factory>

<cloud:redis-connection-factory> 元素提供了一种方便的方式来为你的 Spring 应用配置 Redis 连接工厂。

可用属性

  • id - 默认为服务名称
  • service-name - 仅当你绑定到应用的服务中有多个 Redis 服务时才需要

一个简单的 RedisConnectionFactory 配置示例,用于注入到 RedisTemplate 中,看起来像这样,唯一的属性是指定 redisConnectionFactory bean 的 id。


<cloud:redis-connection-factory id="redisConnectionFactory" />

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
    <property name="connection-factory" ref="redisConnectionFactory"/>
</bean>

可通过 <cloud:pool> 子元素获得的高级配置属性如下所示。

<cloud:pool> 选项

命名空间属性 描述 类型 默认值
pool-size 池中最大连接数,或者用连字符分隔的最小和最大大小范围。 int 使用 Apache Commons Pool 的默认设置,最小为 0,最大为 8
max-wait-time 当没有可用连接时,连接池等待连接返回的最长毫秒数,超过此时间将抛出异常。 int 使用 Apache Commons Pool 的默认设置,即无限 (-1)

以下是一个指定了额外设置的 RedisConnectionFactory 配置示例:


<<cloud:redis-connection-factory id="myRedisConnectionFactory">
    <cloud:pool pool-size="5-10" max-wait-time="2000" />
</cloud:redis-connection-factory>

<cloud:rabbit-connection-factory>

<cloud:rabbit-connection-factory> 元素提供了一种方便的方式来为你的 Spring 应用配置 RabbitMQ 连接工厂。

可用属性

  • id - 默认为服务名称
  • service-name - 仅当你绑定到应用的服务中有多个 RabbitMQ 服务时才需要

一个简单的 RabbitConnectionFactory 配置示例,用于注入到 RabbitTemplate 中,看起来像这样,唯一的属性是指定 rabbitConnectionFactory bean 的 id。此示例除了 <cloud> 命名空间外,还使用了 <rabbit> 命名空间。


<cloud:rabbit-connection-factory id="rabbitConnectionFactory" />

<rabbit:template id="rabbitTemplate"
    connection-factory="rabbitConnectionFactory" />

可通过 <cloud:rabbit-options> 获得的高级配置属性如下所示。

<cloud:rabbit-options>

命名空间属性 描述 类型 默认值
channel-cache-size 通道缓存的大小。 int 默认值为 1

以下是一个指定了额外设置的 RabbitConnectionFactory 配置示例:


<cloud:rabbit-connection-factory id="myRedisConnectionFactory">
    <cloud:rabbit-options channel-cache-size="10" />
</cloud:rabbit-connection-factory>

<cloud:service-scan>

<cloud:service-scan> 元素扫描绑定到应用的所有服务,并为每个服务创建一个相应类型的 Bean。你可以将此元素视为核心 Spring 中 <context:component-scan> 的云扩展,后者扫描类路径中带有特定注解的 Bean 并为每个 Bean 创建一个。<cloud:service-scan> 在应用开发的初始阶段特别有用,你希望立即访问服务 Bean,而无需为每个新绑定的服务添加一个 <cloud> 元素。

一旦你在应用上下文中包含 <cloud:service-scan> 元素,那么在你的 Java 代码中,只需为每个绑定的服务添加 @Autowired 依赖项


@Autowired DataSource dataSource;
@Autowired ConnectionFactory rabbitConnectionFactory;
@Autowired RedisConnectionFactory redisConnectionFactory;
@Autowired MongoDbFactory mongoDbFactory;

瞧!你可以轻松访问所有服务。

上述方式在你绑定到应用的每种类型只有一个服务时有效。在其他情况下,你需要使用 @Qualifier 指定服务名称(每个自动创建的 Bean 都以相关的服务名称命名)。


@Autowired @Qualifier("inventory-db") DataSource inventoryDataSource;
@Autowired @Qualifier("pricing-db") DataSource pricingDataSource;

在这里,inventoryDataSource bean 将绑定到 inventory-db 服务,pricingDataSource bean 将绑定到 pricing-db 服务。

<cloud:properties>

可用属性

  • id - Properties bean 的名称

<cloud:properties> 元素公开了服务的基本信息,这些信息可以通过 Spring 的属性占位符支持来使用。公开的属性与 Spring 3.1 应用自动启用的属性相匹配。我们将在下一篇博客中讨论属性形式。

结论

云命名空间提供了一种简便的方式连接到云服务。开发者通常希望在本地 Tomcat/tcServer、本地云和 CloudFoundry.com 上部署相同的应用(相同的“二进制文件”)。Spring 3.1 的配置文件支持正是为了支持这种可能性而量身定制的。在下一篇博客中,Scott Andrews 将解释如何实现。

获取 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

抢占先机

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

了解更多

获取支持

Tanzu Spring 通过一项简单的订阅,为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

即将举办的活动

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

查看全部