SpringIntegrationRamble

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Spring Integration是Spring家族的一员,专为简化企业应用集成(EAI)而设计。相较于硬编码客户端、传统消息队列和其他ESB产品,它更轻量、易测试且易于上手。Spring Integration增强了标准技术如EJB、RMI和JMS的使用,通过简单的配置即可实现复杂的集成场景。它基于Spring框架,继承了依赖注入等特性,使应用上下文成为消息传递的总线。此框架支持多种集成模式,包括文件传输、共享数据库、RPC及消息传递,并能整合不同协议和技术。尽管Spring Integration功能强大且易用,但在特定高级集成需求或专有协议支持方面可能不如某些专业ESB产品全面。

[toc]

Why SpringIntegration

翻译自 JoshuaLong,Getting Started With Spring Integration

Spring Integration 是 Spring 体系下创建的又一个 框架,面向企业应用集成(EAI)。说到集成,并不缺“解决办法”:硬编码的 Java 客户端、其它 ESB 产品,还有消息队列等更加传统的应用集成技术。

Spring Integration 对以上各种解决方法都有所改进,Spring Integration 非常轻量、易于测试;几乎没有入门门槛,概念上比任何“自己编写”的解决方法都要简单。长远来看,它更为灵活、更具有适应性。一旦使用,你就会恋上它。

Spring Integration 可以和 EJB、RMI、JMS 这些标准技术协同使用,能让你在一处对复杂的解决方法进行建模,从而对标准技术有所增强。这在很大程度上简化了这些技术的使用。由于 Spring Integration 非常轻量(直接嵌入到了SpringApp中),而且很注重开发生命周期(方便配置的 XML schema、友好的 POJO 形式 API、与 Spring 框架和 JEE 的强大集成),所以你会发现跟其它很多的 ESB 产品相比,Spring Integration 要更加适用。

Spring Integration 本身就很强大,毋庸置疑,它从 Spring 框架中得到了强大的支持。比如说,配置格式无非还是 Spring schema,这些配置格式反过来又为你抽象出了 bean 示例。Spring Integration 的使用没什么特殊之处,可以像编写其它Spring应用一样编写SpringIntegration代码。

Spring Integration 中很多对 RPC 和消息的可用支持都以 Spring 框架的支持为基础。Spring Integration 配置文件中的所有内容仍是标准的 Spring 应用上下文,和通常的 Spring bean 一样,它也受益于依赖注入和运行时可用的方面(Aspect)。使用 Spring Integration,应用上下文就是总线了。比如这能使依赖于应用上下文事件的解决方案成为可能。这是没有独立“运行时”的另一个原因,因为只要上下文可用,总线就存在。

Background

企业应用集成(EAI)是集成应用之间数据和服务的一种应用技术。它能解决很多问题,解决方案也是多种多样。全世界工程师们已经为这些解决方案的创建努力了数十年。就在最近,我们才确定了原则的最佳实践,并对这些方案进行了分类。现代 EAI 的模式通常要归功于 Gregor Hohpe 等人编著的《企业集成模式》,该书对集成解决方案共有的很多集成模式进行了分类和阐述。Hohpe 等人列出了四种集成风格:

  • 文件传输:两个系统生成文件,文件的有效负载就是由另一个系统处理的消息。该类风格的例子之一是针对文件轮询目录或 FTP 目录,并处理该文件。
  • 共享数据库:两个系统查询同一个数据库以获取要传递的数据。一个例子是你部署了两个 EAR 应用,它们的实体类(JPA、Hibernate 等)共用同一个表。
  • 远程过程调用:两个系统都暴露另一个能调用的服务。该类例子有 EJB 服务,或 SOAP 和 REST 服务。
  • 消息:两个系统连接到一个公用的消息系统,互相交换数据,并利用消息调用行为。该风格的例子就是众所周知的中心辐射式的(hub-and-spoke)JMS 架构。

这些风格迥然不同,因为没有一种解决办法能解决所有的问题。这导致整个中间件领域都在基于这些模式寻求可用或者更好的解决办法,通常被称为企业服务总线(ESB)。ESB 是最终的代理人:它知道如何使用各种语言在各种协议上调解传递的各种消息。

这些架构风格是不同的,它们各有所长。通常,JEE 标准存在着不足(坦率地说,现今的任何开发平台都是一样),与其它系统集成时这些标准并不能提供解决方案。考虑到很多项目都是维护项目,新平台中又有多少技术会使用旧服务或功能呢?少之又少!

JEE 以及后来的 Spring 在简化企业编程模型方面都有了长足的进步。JEE 进行了标准化并商业化了常见企业问题——数据库访问、远程过程调用、事务、认证、目录服务等等。除了基本的 RPC 和消息,JEE 中并没有对 EAI 解决方案的直接支持。

JMS、REST 和 SOAP 都与平台无关,但这是假设有单一的消息协议。比如说,有一个旧的主机应用,其输入、输出都是存放在一些 FTP 端点上的批处理文件,解决方案要求集成该应用就是不可能的。简单来说:现今的中间件能很好地处理常见问题,但在特殊情况的处理上就有所不足了。

之后复杂性会急剧上升。随着时间的推移,应用变得更为重要,与商业伙伴、其它应用、其它平台集成的负担也变得更加昂贵。对必须进行维护的系统来说,每次集成都增加了系统间点对点的新通道。最终,集成各个端点的通道就会成为一个维持不了的烂摊子、复杂的架构。

SpringIntegration 简化了编程方式,以此改进了标准的 ESB。

Consolidate Architecture

如何统一企业级应用集成方案并消除架构壁垒?

企业应用集成有很多模式,同样有很多需要处理的协议。Spring Integration 提供 ESB 风格解决方案的建模能力,但使用方法及其便利性与 Spring 框架并无二致。ESB 不仅能提供消息解决方案的建模能力,还有其它不同的技术 / 协议。

ESB service

大多数 ESB 产品都有一些共性。其中最重要的有:

  • 路由:能按条件逻辑或配置好的路由规则路由消息。
  • 消息传递:对任何复杂的解决方案来说,将消息的有效负载从一种类型转换为另一种类型都至关重要。在消息传递中,标准数据模型模式要求系统提供通用的格式。处理消息自然也是 ESB 的另一个重要组成部分。
  • 调解:适配器和服务映射。
  • 复杂事件处理(CEP):根据相关性将总线上的事件处理为聚集的能力。
  • 调用:这应该是最明显的一个。每个 ESB 都要能消费、提供服务。

除了上面列出的服务,ESB 通常还要包括记日志、审计、认证(安全)和管理等机制。如果你的需求更加复杂,那 ESB 会提供很大的价值。对比你在 JEE 平台中已经获得的东西和 ESB 能带给你的东西很有价值。

Popular Solutions

Spring Integration 是新生事物,当然会遭受质疑。

Mule 是一个非常受欢迎的的 ESB 产品,值得密切关注。Mule 似乎有很大的影响力,在解决方案的灵活性上也令人印象深刻。通过 MuleForge 实现的开源扩展使其成为几乎所有问题令人信服的选择。它是一个标准的服务器:能部署并运行解决方案。Maven 插件有助于开发的生命周期。

ServiceMix 也比较受欢迎。ServiceMix 原本基于 Java 业务集成规范(JBI;JSR 208[9])。JBI 是构建 ESB 产品的 JCP 规范。由于出身 JBI,ServiceMix 不如 Mule 那般灵活,但它正在进行改进。容器正转向 OSGi 基础设施。

这里没有列出其它所有有价值的 ESB 产品,要是有机会你还是要对它们多了解一下。有些非常有价值,值得研究。

Spring Integration 开箱即用的功能表现得很好,非常易于使用。开发用例非常引人注目:如果你已经被 POJO 和近年来测试友好的框架宠坏了,那这个框架也是你的拿手好戏。只要你愿意,你可以使用接口或标准框架类,你还可以完全为 POJO 和你的领域模型进行编码,或者,你可以将两者结合使用。

Getting Started

Spring Integration 应用就是使用 Spring schema 配置的简单 Java 程序。如果你倾向于用常规的 Spring 配置来配置一切,就可以不使用 schema。Schema 会使事情更为简单,这和用 schema 配置使用 Spring 中方面的事务功能会更加简单大致一样。Spring Integration 为一般概念(集成命名空间)提供了方便的 schema,还有适配器的具体配置,比如针对消息队列、电子邮件或文件类型的配置。

Overview

Spring Integration 应用处理从通道传递过来的消息概念。消息的生命周期始于一个端点,通常是对适配器做出的反应。消息在经过处理管道的过程中,会在总线内被转化、路由至其它通道、分发、响应,或者被中断并发送到一个死消息通道中去,即消息生命终结了。

message

Message 类是个包装器,包装被处理消息的有效负载。对它进行操作,很容易获得有效负载和消息头,你可以对有效负载进行类型转换,可以检查、改变消息头。Spring Integration 不要求你直接使用 Message 接口,而应该将其转化为应用所需的数据传输对象。

例如,对于来自文件适配器(可以从文件系统发送消息的适配器)的消息可能会被改为 java.io.File 实例。对于来自MQTT适配器的消息可能会从二进制转换为JavaBean。

channel

消息在通道中传递,通道总是从一端传递到另外一端,例如,往往消息始于适配器,并流入到通道里面,在一些列的操作之后,消息离开了通道,完成了自己的使命。

通道中有多个组件:

  • 转换器:获取消息内容(即负载),并改变消息本身,例如进入通道的时候是MQTT的二进制消息,转换之后变成了JavaDomainBean或其它。转换之后,消息将继续向下走
  • 过滤器:根据自身业务要求,过滤出需要处理的消息
  • 路由器:将经过处理的消息发送到其它的 SpringIntegration 组件,或者是SpringService,甚至可以是Event。。。SpringIntegration的宿主是SpringApplicationContext,所以IOC容器中的所有可访问的地方都可以是消息的下一个目的地
  • 更多的组件。。。

Fall Short

Spring Integration 是全新且强大的。你可以对其背后的 SpringSource 的价值及其自身的不断发展抱有信心。但这并不意味着它是完美的——它离完美还远着哩!

应用集成不是一个新的领域,考虑解决方案和架构已经有数十年。应用集成的一些用法按惯例包含了重量级的适配器,比如那些与 SAP 集成的集成方法或 JDEdwards OneWorld。Spring Integration 不能直接支持这些具体情况。

尽管 Spring Integration 支持大量开箱即用的功能,但它对一些典型的适配器缺少支持,比如 SFTP、HTTPS 或 AS2。

目前,一些专有的解决方案能更好地支持这些需求。有些解决方案非常昂贵,所以你可以为 Spring Integration 试着改造第三方库、编写自己的适配器。如果你有兴趣,你会因为为 Spring Integration 编写适配器相当简单而感到惊喜。你要想开始创建解决方案,

基于种种情况,可能最终,Spring Integration 可能并不是你现在最佳的解决方案。

Conclusion

Spring Integration 是一个干净、简练的 EAI 手段,也是很好的 ESB 产品替代者。现在的 ESB 方案沉重且很难引入到一些环境中。Spring Integration 则是一个功能强大、低摩擦的替代方案,它能温和地解决一些最复杂的集成问题。

引用

目录
相关文章
|
16天前
|
缓存 应用服务中间件 nginx
安装nginx-http-flv-module模块
本文介绍如何为Nginx安装`nginx-http-flv-module`模块。此模块基于`nginx-rtmp-module`二次开发,不仅具备原模块的所有功能,还支持HTTP-FLV播放、GOP缓存、虚拟主机等功能。安装步骤包括:确认Nginx版本、下载相应版本的Nginx与模块源码、重新编译Nginx并加入新模块、验证模块安装成功。特别注意,此模块已包含`nginx-rtmp-module`功能,无需重复编译安装。
49 1
|
1月前
|
Java Docker 容器
SpringBoot Jar 包太大 瘦身 【终极版】
SpringBoot Jar 包太大 瘦身 【终极版】
108 1
|
4月前
|
Java Maven 开发工具
记录一次Maven无法打包的排查过程
【5月更文挑战第3天】记录一次WhatTheFuck经历
103 2
记录一次Maven无法打包的排查过程
|
4月前
【qt】最快的开发界面效率——混合编程2
【qt】最快的开发界面效率——混合编程
59 1
|
3月前
|
SQL 存储 JSON
StarRocks进阶
【6月更文挑战第1天】StarRocks支持四种表类型:明细表、聚合表、更新表(正被主键表取代)和主键表。建表后类型不可修改,排序键需先于其他列定义,不支持BITMAP和HLL类型。主键表具有唯一非空约束的主键,适合实时更新和高效查询。明细表用于追加新数据,不支持修改。聚合表用于聚合统计,排序键需唯一。表引擎默认为OLAP,也可连接到外部数据源如MySQL、Hive等。数据类型包括数值、字符串、日期和半结构化类型如JSON。此外,还支持多种函数、DDL操作和HTTP SQL API。
149 0
|
4月前
抖音最近很火的QQ在线价值评估网站源码(qq价值在线评估)
这个源码是很多年以前的了,最近又在抖音刷到别人直播需要刷礼物才能给你评测,所以又找了一下测试了可用,将源码上传后解压,访问可以直接使用。
776 0
抖音最近很火的QQ在线价值评估网站源码(qq价值在线评估)
|
4月前
|
消息中间件 Java API
【微服务系列笔记】MQ消息可靠性
消息可靠性涉及防止丢失,包括生产者发送时丢失、未到达队列以及消费者消费失败处理后丢失。 确保RabbitMQ消息可靠性的方法有:开启生产者确认机制,确保消息到达队列;启用消息持久化以防止未消费时丢失;使用消费者确认机制,如设置为auto,由Spring确认处理成功后ack。此外,可开启消费者失败重试机制,多次失败后将消息投递到异常交换机。
76 1
|
4月前
|
Java 数据挖掘 BI
Java医院绩效考核系统源码B/S+avue+MySQL助力医院实现精细化管理
医院绩效考核系统目标是实现对科室、病区财务指标、客户指标、流程指标、成长指标的全面考核、分析,并与奖金分配、学科建设水平评价挂钩。
61 0
|
4月前
|
运维 数据可视化 持续交付
如何解决技术债
本文介绍了技术债的概念及其影响。技术债是指在开发过程中因选择快速解决方案而非最优方法而产生的额外工作量。文章指出,技术债可能导致项目中出现如流水线失败、无用代码、难以理解的代码等问题。还强调了管理技术债的重要性,因为它会影响软件的交付速率和质量。有效的管理包括识别技术债、可视化问题、分析优先级、制定执行计划和持续改进。建议团队通过价值/成本矩阵来确定优先解决的技术债,并通过建立技术规范、服务责任人制度和持续关注技术趋势来预防和解决技术债。此外,应确保持续投入资源进行技术优化,并与团队和客户分享改进成果,以维持软件的高质量和稳定性。
180 1
|
4月前
|
设计模式 运维 Java
Spring5深入浅出篇:Spring中静态代理与动态代理
Spring框架中的代理模式分为静态代理和动态代理。在JavaEE分层开发中,Service层最为重要,包含核心业务逻辑和额外功能。静态代理通过手动创建代理类来增加原始类的额外功能,但当代理类数量多时管理不便且不易于维护。动态代理则解决了这一问题,通过Spring的AOP(面向切面编程)实现,无需手动创建代理类,只需定义切点和增强(额外功能),在运行时动态生成代理对象,提高了代码的灵活性和可维护性。动态代理主要利用了JVM的字节码技术,在运行过程中创建代理类,执行完毕后随着虚拟机的结束而销毁,不会产生持久化的代理类。