CLOUD FOUNDRY实战:自动重新配置

Cloud Foundry力求保持较低的初期投资。除了资金上的投入外,直接投资来自于开发者在Cloud Foundry中运行应用所花费的时间。当你打算使用Cloud Foundry时,自动重新配置机制能够减少初期投资。在本文中,我们将研究自动重新配置如何与Spring应用协同工作(grails应用使用相同的底层机制,因此工作方式是一样的。)

  利用依赖注入进行自动重新配置

  所有的应用都由业务逻辑以及服务交互(比如数据库以及消息)构成。在典型的Spring应用中,你可以利用依赖注入(DI)为每个服务创建bean,并将这些bean注入到其他需要访问相应服务的bean当中。

  让我们一起来看一下,一个使用关系型数据库的典型Spring应用,其数据源bean的定义如下:

CLOUD FOUNDRY实战:自动重新配置

  我们可以在一个单独的文件中给出相关属性(比如用户名和密码)的值,但是我们在其中嵌入了值,这样就可以只关注自动重新配置机制了。

  该bean也可以被注入到其他bean当中(在下面这个例子当中,该bean被注入到JPA实体管理器中):

CLOUD FOUNDRY实战:自动重新配置

  我们能够很容易地看到:数据库URL指向本机上的数据库,用户名被设置为“myuser”,密码被设置为“mypass”。当将该应用推送到Cloud Foundry上并绑定MySQL或Postgres服务后,数据库服务的URL不再是jdbc:mysql://localhost:3306/inventory-db,用户名、密码也不会像之前那样简单。因此如果没有额外的机制的话,这类应用将不能够启动。这时,自动重新配置机制就派上用场了。自动重新配置机制借助DI检查Spring应用的上下文环境,查找与应用相关的bean,基于应用所绑定的服务创建bean,然后替换原有的bean。结果就是无论用户的应用部署在本地还是在Cloud Foundry上,都不用进行任何的改变。

  下面这个表格列举了自动重新配置查找并进行重新配置的bean类型

CLOUD FOUNDRY实战:自动重新配置

    在创建bean并使用基于与应用进行绑定的服务所对等的bean替换现有bean之前,自动重新配置底层的机制使用BeanFactoryPostProcessor检查应用上下文环境。对于关系型数据库,同时还会重新配置JPA实体管理器工厂或者Hibernate会话工厂以调整正在使用的方言。

  在部署过程中存储应用时,Cloud Foundry将进行两处修改:

  1. 在包含BeanFactoryPostProcessor以及相关资源的应用中增加额外的jar包。请注意用于自动重新配置的jar包版本与cloudfoundry-runtime相关。然而,某些类会通过着色机制重新迁移到不同的包中。这样一来,应用就能够使用不同版本的jar包而不会产生冲突。

  2. 修改web.xml文件更新组成Spring应用上下文的文件,在web.xml中添加BeanFactoryPostProcessor。

  局限性

  自动重新配置服务只有在以下两种情况下才起作用:

  1. 每一种服务类型只能绑定一种服务,例如,你只能为应用绑定一种关系数据库服务(MySQL或Postgres)。

  2. 每个bean的匹配类型只能有一个。例如,在应用上下文环境中只能有一个DataSource bean。

  如果应用不满足上述限制条件的话,那么自动配置机制就不能生效。在这种情况下你可能需要使用命名空间,该部分内容我们会在下一篇文章中进行介绍。

  自动重新配置机制要求典型的Spring应用。如果应用上下文环境过于复杂,那么自动配置机制可能不会生效。在这种情况下,你可以选择退出自动重新配置。

  选择退出自动重新配置

  有些情况下,你可能想退出自动重新配置。例如,你有一个在内存中运行的关系数据库,这时便不需要与Cloud Foundry服务进行绑定了。Cloud Foundry提供了一些方法能够退出自动重新配置机制。

  1. 部署应用时选择"JavaWeb"框架。这会将你的应用视作非Spring应用,这时你的应用将保持不变(不会在应用中添加jar包,也不会对web.xml文件进行修改。)同时也意味着在该系列文章中所讨论的配置文件特性对该类应用将不可用。

  2. 使用任一元素创建代表服务的bean。目前元素包括, , ,以及。如果应用恰好包括了基于这些命名空间元素底层类型的bean的话(比如CloudMongoDbFactoryBean),那么选择退出自动重新配置将会生效。

  Cloud Foundry使用该机制选择退出,这样应用就可以选择进行自动重新配置也可以完全控制服务创建。我们没有看到过采用自动重新配置配置某些服务,然后手动配置其他服务的情况。

  结论

  Cloud Foundry提供的自动重新配置功能是一个很棒的起始创建方式。如果应用日趋成熟或者需要绑定多个服务,那么你可能需要对服务连接对象进行更好的控制。这时候 命名空间就派上用场了。在该系列文章的下一篇文章中,Thomas Risberg将讲解如何使用 命名空间。