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

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

我们在之前的博文中看到 使用 Cloud Foundry 服务与 Spring:第 2 部分 - 自动重新配置,当您部署 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 里程碑存储库。只需将此存储库声明添加到您的存储库中即可


<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;” 字符串

<cloud:pool> 选项

命名空间属性 描述 类型 默认值
pool-size 池中的最大连接数,或者用连字符分隔的指定最小和最大大小的范围。 整数 使用 Apache Commons Pool 的默认设置,最小值为 0,最大值为 8
max-wait-time 池在抛出异常之前等待(当没有可用连接时)返回连接的最大毫秒数。-1 表示无限期等待。 整数 使用 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 实例主机允许的最大连接数。这些连接在空闲时将保留在池中。池耗尽后,任何需要连接的操作都将阻塞,等待可用连接。 整数 Mongo 驱动程序的默认值为 10
max-wait-time 线程等待连接变为可用时的最大等待时间(毫秒)。 整数 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 池中的最大连接数,或者用连字符分隔的指定最小和最大大小的范围。 整数 使用 Apache Commons Pool 的默认设置,最小值为 0,最大值为 8
max-wait-time 池在抛出异常之前等待(当没有可用连接时)返回连接的最大毫秒数。 整数 使用 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 通道缓存的大小。 整数 默认为 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 创建一个 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 社区中所有即将举行的活动。

查看全部