1. Spring Integration概述
1.1 背景
Spring框架的一个重要主题是控制反转。从广义上来说,Spring处理其上下文中管理的组件的职责。只要组件减轻了职责,它们同时也被简化了。例如,依赖注入降低了定位和创建组件间依赖的耦合性。同样地,面向方面编程通过模块化可重复利用方面,将业务组件和通用的横切面关注点解耦。在这样的情况下,最终的结果是系统更容易测试,理解,维护和扩展。
此外,Spring框架和相关工具集提供一个优秀的构建企业级应用的编程模型。这个模型的一致性对开发者非常有益,特别是其基于公认的最佳实践,比如基于接口的编程,尽量使用聚合而不是继承。Spring简化的抽象和功能强大的类库,在增加了系统可测试性和可移植性的同事,有力地促进了开发者的生产力。
Spring Integration是Spring项目中秉承其相同目标和原则的新成员。它扩展了Spring的编程模型到消息领域,在Spring已经存在的企业集成支持的基础上,提供了更高级别的抽象。它将控制反转添加到关注点,支持消息驱动架构,例如当特定业务逻辑应该执行时,响应也应该被发送。它支持路由和消息转换,所以不同的传输协议和不同的数据格式能在不影响易测试性的前提下被集成。换句话说,消息和集成关注点都被框架处理,所以业务组件能更好地与基础设施隔离,从而降低开发者所要面对的复杂的集成职责。
作为Spring编程模型的扩展,Spring Integration提供了各种的配置选项,包括注解,支持命名空间的XML,通用bean元素的XML,当然也包括直接使用底层API。这些API基于定义好的策略接口和非侵略性的代理适配器。Spring Integration的设计是受在Spring中的通用模式和知名的企业集成模式中的密切联系启发的。企业集成模式是2004年Gregor Hohpe 和Bobby Woolf在Addison Wesley出版社出版的《企业集成模式》一书中描述的。读过这本书的开发者应该能直接地适应Spring Integration的概念和术语。
1.2 目标和原则
Spring Integration主要有如下两个目标:
l 提供一个简单的模型来实现复杂的企业集成解决方案
l 为基于Spring的应用添加异步的、消息驱动的行为
l 让Spring用户可以直观的、增量的采用
Spring Integration基于两个原则:
l 组件应该松耦合,方便模型化和易测试
l 框架应该强制业务逻辑和集成逻辑的关注点分离
l 扩展点本质上应该是抽象的,而且限定在一个清晰的边界内,来促进可重用性和可移植性。
1.3 主要组件
纵向地看,一个分层的架构利于关注点的分离,各层间基于接口的契约实现了松耦合。典型地,基于Spring的应用就是这样设计的,Spring框架和工具集提供了一个遵从最佳实践、全栈式开发企业级应用的强大基础。横向地看,消息驱动架构添加了横向视图,虽然这些目标还是相关的。分层架构是一个非常通用和抽象的范式,消息系统非常符合同样抽象的“管道和过滤器”模型。“过滤器”代表任何能够生产和(或)消费消息的组件,“管道”在过滤器间传输消息,所以组件间保持松耦合。值得指出的是,这两个高级范式不是互斥的。其中的消息基础设施支持包装“管道”到契约被定义为接口的层。同样地,“过滤器”一般被管理在逻辑上位于应用系统的服务层之上的层中,其与那些服务在相同的方式下通过接口交互。
消息
在Spring Integration中,消息是任何Java对象连同框架处理对象时使用的元数据的一个通用包装。它由负载和头部组成。负载可以是任何类型,头部保存一般的请求信息,例如id,时间戳,过期时间和返回地址。头部也被用来在各种传输协议间传值。比如,从接收到的一个文件创建一个消息时,可以把文件名存储在头部,这些下游的组件就可以使用它。同样地,如果一个消息的内容最终被一个对外接出的Mail适配器发送,各种属性(收件人,发送人,抄送人,主题等)可以被上游组件配置为消息头部值。开发者也可以在头部存储任意的键值对。
消息通道
一个消息通道代表“管道和过滤器”架构中的一个“管道”。消息生产者发送消息到通道,消息消费者从通道接收消息。消息通道因此解耦了消息组件,同时也提供了消息拦截和监控的切入点。