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

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

在上一篇博客文章 “使用 Spring 的 Cloud Foundry 服务:第二部分 - 自动重配置” 中,我们了解到当您部署 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 存储库。只需将此存储库声明添加到您的存储库中。


<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 行)并提供 schema 位置(第 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 Core 中 <context:component-scan> 的云扩展,它会扫描类路径以查找带有特定注解的 bean,并为每个 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 应用程序自动启用的属性相匹配。我们将在下一篇博客中讨论属性形式。

结论

cloud 命名空间支持一种连接云服务的简单机制。开发人员经常希望在本地 Tomcat/tcServer、本地云和 CloudFoundry.com 中部署相同的应用程序(相同的“bits”)。Spring 3.1 的 profile 支持非常适合支持这种情况。在下一篇博客中,Scott Andrews 将对此进行解释。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

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

查看所有