应用系统集成-Spring Integration
应用系统集成-Spring Integration
图1 EIP 消息系统模式全景图。
Spring Integration 是系统集成的一个实现框架,提供了对EIP核心概念:Endpoint、Message、Channel、Router、Translator的抽象及相关框架实现,使得基于Spring Integration进行应用系统集成的应用开发专注于业务服务的实现,而能够轻便的使用集成相关的模式实现。
先提出结论:个人看法,Spring Integration 在非集成领域,业务领域模型内部的设计和实现上才有意义。
Spring Integration 编程模型

图2 Spring Integration 系统集成编程模型
Spring Integration编程模型说明:
- Channel(通道):以字符串形式的通道命进行标识。通道指MessageChannel的具体实现类型,如DirectChannel,其他所有的组件都是关联到特定通道上。通道在Spring Integration中是统一的逻辑,单可以从理解上将通道划分为集成技术通道和逻辑通道两部分。

图3 通道简图(集成技术通道和逻辑通道)
- MessagingGateway(消息网关): 面向业务领域层提供的集成层接口,接口以业务领域模型的知识提出, 不揭示集成层的任何集成技术细节。
如:以下的接口定义了下单的集成接口,而不展示任何关于集成技术的知识。
| @MessagingGateway public interface Cafe { @Gateway(requestChannel = "orders.input") void placeOrder(Order order); } |
- ServiceActivator(服务激活器):处理通道上消息的服务
如:以下表示一个业务逻辑通道处理服务,接收输入通道:tickers上的输入,并返回一个quote对象到输出通道quotes上。
| @ServiceActivator(inputChannel="tickers", outputChannel="quotes") public Quote lookupQuote(String ticker) { BigDecimal price = new BigDecimal(new Random().nextDouble() * 100);//NOSONAR return new Quote(ticker, price.setScale(2, RoundingMode.HALF_EVEN)); } |
对于负责具体集成技术的通道,ServiceActivator返回一个MessageHandler的实现了,具体实现类由Spring Integration各类协议实现提供。如以下是Http发送通道的处理服务,表示将通道httpOutRequest上的消息通过Http协议发送至目标地址。
| @ServiceActivator(inputChannel = "httpOutRequest") @Bean public HttpRequestExecutingMessageHandler outbound() { HttpRequestExecutingMessageHandler handler = new HttpRequestExecutingMessageHandler("http://localhost:8080/foo"); handler.setHttpMethod(HttpMethod.POST); handler.setExpectedResponseType(String.class); return handler; } |
- InboundAdaptor/OutboundAdator 和 InBoundGateway/OutBoundGateway:通道输入输出适配器或则通道输入输出路由,由具体集成技术来实现,用于接收从外部传入应用的消息或从将消息从应用发送出去, Adaptor是指单向通讯(发送后不管),而gateway指双向通讯(发送后通常等待响应)
以http协议实现为例:
| 概念 | 实现类 |
| InboundGateway | org.springframework.integration.http.inbound. HttpRequestHandlingMessagingGateway |
| outboundGateway | org.springframework.integration.http.outbound. HttpRequestExecutingMessageHandler |
关于Spring Integration支持的集成技术文档见:
https://docs.spring.io/spring-integration/docs/current/reference/html/endpoint-summary.html#spring-integration-endpoints
- Bridge:桥接,将通道消息桥接到目标通道;
- Router: 路由器,负责将来源通道上的消息路由到不同的目标通道
- Tranformer: 转换器,将来源通道上的消息转化后发往目标通道
- Splitter: 分流器,只将一个消息分流为多个小消息发往目标通道。如,下面例子中将订单转换为订单行信息发往目标通道。
| @Splitter(inputChannel="orders", outputChannel="drinks") public List<OrderItem> split(Order order) { return order.getItems(); } |
- Aggregator:聚合器,和Splitter相反,将来源通道上的多个消息转换为一个消息发往目标通道。
- Filter:过滤器,对通道上的消息进行过滤。
Spring Integration 真正内核
Spring Integration将应用和数据库、消息中间件、邮件服务器、缓存(Redis)、其他应用系统等任何系统的交互都纳入一个统一的消息集成模型中进行抽象设计。
以缓存的场景描述如下:
| 场景 | 功能性思维 | 消息集成思维 |
| 缓存 | 将订单信息通过缓存客户端写入缓存或从缓存中读取。 往往出于性能或特定目的引入缓存,并和领域模型的操作紧密联合去思考和设计,比如处理订单信息时,部分内容从缓存中获取,部分从数据库中获取。 | 订单信息通过消息网关在某个通道进行传递,缓存通道将收到的订单进行缓存。 订单领域模型专注领域业务的设计,而缓存的使用以消息通道的编排或从缓存中获取,或从数据库中获取。两者分隔。 |
Spring Integration框架的是领域驱动设计理念的产物,将应用集成和业务领域模型划分为不同的上下文。和传统设计的差异在于将应用集成作为一个专门的领域去进行抽象设计(消息集成模型)。传统的设计中功能组件通常以工具的角度出现,不同的功能组件,如缓存、消息中间件等都以独立的目的使用。
简单的说: Spring Integration期望大家以统一的方式去处理所有系统的集成。任何系统之间的集成都可以认为是消息在系统间按照特定的模式进行传递。
Spring Integration 是一个设计理念的产物,对于开发人员来说可以说并不产生新的功能性作用。
Spring Integration 还有意义吗?
Spring Integration对于产品实施还有意义吗?首先:应用集成模型并不是核心业务模型。是否需要独立抽象存在争议;其次:在特定系统的集成领域,都存在成熟和稳定的使用实践, 比如微服务网关、Http协议的Feign组件、 数据库的ORM模式、多级缓存等。这些功能组件由于目的和习惯的差异,有着各自的集成方式,全部以消息集成的思维去理解和使用反而带来歧义。
比如: 数据库操作的Service-Dao-ORM框架mapper层的三层结构已根深蒂固,并有着优秀的框架,如mybatis。 而期望以Spring Integration的设计理念来重新实现可以说是完全不可行的。
区别稳定点和变化点是系统设计永远的第一准则。从这个角度分析,我们发现应用和技术组件的通讯是稳定的,比如和数据库,消息中间件,缓存等系统的交互方式在系统的生命周期中并不会或很少发生变化,即使由于业务带来的技术需求的变化也会在迅速的技术调整后保存稳定。因而针对这部分实现进行抽象、过多考虑所谓扩展性对于应用系统来说就是过度设计了。
而对于业务系统来说,业务规则的是变化点。 因此在业务领域模型内部的业务逻辑实现中采用Spring Integration或使用其设计理念来才是有意义的。
结论:个人看法,Spring Integration 在非集成领域,业务领域模型内部的设计和实现上才有意义。
比如对于采购招标的业务从原来流程化设计理念转换为消息集成设计理念可以带来灵活的扩展性面对复杂多边的规则。如抽取未定的消息: 招标消息、报价消息、定标消息。将灵活多变的业务规则适配到领过的通道编排和消息处理上。
如下是供应商报价消息处理的示例。
| 消息 | 通道 | 业务逻辑 | 输出 |
| 供应商报价消息 | 审计通道 | 记录 | |
| A规则校验过滤通道 | 校验A规则 | 报价是否有效 | |
| B规则校验过滤通道 | 校验B规则 | 报价是否有效 | |
| 报价选择通道 | 有效报价按照特定规则选取中标报价。可以通过多种选择规则的选择通道,根据配置确定生效的规则。 | 中标报价 | |
| 供应商报价记录通道 | 记录供应商所有报价 | 无 | |
| 供应商报价分析通道 | 对供应商历史报价进行分析 |
相关文章:
应用系统集成-Spring Integration
应用系统集成-Spring Integration 图1 EIP 消息系统模式全景图。 Spring Integration 是系统集成的一个实现框架,提供了对EIP核心概念:Endpoint、Message、Channel、Router、Translator的抽象及相关框架实现,使得基于Spring Integration进行…...
亚马逊与TEMU平台欧代英代如何注册?注册欧代/英代流程及注意事项
亚马逊与TEMU平台欧代英代如何注册?注册欧代/英代流程及注意事项 亚马逊平台的商家的产品,由于受到欧盟商品安全新法规市场监管法规欧盟要求所有标有CE标志的商品,都要拥有欧盟境内的欧代作为商品合规的联系方式(也称为负责人)。由于英国脱离…...
【嵌入式开发工具】STM32+Keil实现软件工程搭建与开发调试
本篇文章介绍了使用Keil来对STM32F103C8芯片进行初始工程搭建,以及开发与工程调试的完整过程,帮助读者能够在实战中体会到Keil这个开发环境的使用方法,了解一个嵌入式工程从无到有的过程,并且具备快速搭建一个全新芯片对应最小软件…...
python 去除图像中的框
最近在做图像标注,会出现以下的图片,需要去除其中的边框。 1.思路 人工标注画框的范围P,并使用标注工具在画框上画一个点A。获取点A的坐标和颜色。在范围P内,将与点A颜色相似的每一个点x的颜色,替换为点x上下&#…...
企业邀约媒体的方式方法?-(快速精准)
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 快速而精确地邀约媒体通常需要有计划和策略性的方法。以下是一些方法,可以帮助企业有效地邀请媒体: 1. 媒体列表构建:首先,建立一个精心筛…...
旅游业为什么要选择VR全景,VR全景在景区旅游上有哪些应用
引言: VR全景技术的引入为旅游业带来了一场变革。这项先进技术不仅提供了前所未有的互动体验,还为景区旅游文化注入了新的生机。 一.VR全景技术:革新旅游体验 1.什么是VR全景技术? VR全景技术是一种虚拟现实技术&am…...
搭建第一个区块链网络与一键部署WeBASE步骤
官网 搭建第一个区块链网络 — FISCO BCOS v2 v2.9.0 文档 (fisco-bcos-documentation.readthedocs.io) 一键部署 — WeBASE v1.5.5 文档 (webasedoc.readthedocs.io) 步骤 默认如MySQL、Python、java等依赖已经引入 1.创建操作目录, 下载安装脚本 创建操作目录 cd ~ &a…...
MTK联发科、高通、紫光展锐手机SOC平台型号汇总(含详细参数)
MediaTek联发科手机平台汇总: Qualcomm高通SOC平台汇总: 紫光展锐SOC平台汇总: 新移科技已成功研发手机SOC平台: 联发科平台: MTK6739、MTK6761、MTK6762、MTK6765、MTK8788、MTK6853、MTK6873、MTK6833、MTK6877、…...
【ARM AMBA AXI 入门 12 -- AXI协议中的 WLAST 与 RLAST】
文章目录 AXI协议中的 WLAST 与 RLAST AXI协议中的 WLAST 与 RLAST AMBA AXI协议是由ARM公司定义的一种高性能,高频率的总线协议。总线协议中的 WLAST 信号是一个重要的信号,它在 AXI 协议中用来标识一个突发(Burst)传输的最后一…...
11.6 知识总结(筛选器方法、操作标签、事件)
一、 筛选器方法 document.getElementById()------>标签对象------------>直接就是标签 $(document.getElementById()) -------> jQuery对象-------->可以使用jQuery提供的方法 jQuery(document.getElementById()) -------> jQuery对象-------->可以使用jQue…...
Devchat插件:AI智能编程助手,让你告别脏活累活。
文章目录 前言注册登录DevChat的安装和配置DevChat插件安装DevChat插件配置 DevChat的简单使用后记 前言 随着人工智能技术的不断发展和普及,它正在深刻影响着各行各业,并逐渐成为改变世界的重要力量。在软件开发领域,人工智能技术也给开发者…...
0-1矩阵列互斥问题——回溯法 Python实现
三、 0-1 矩阵的列集互斥问题。给定一个 m n m \times n mn 的 0-1 矩阵 A \mathrm{A} A 。定义列互斥为: 对于矩阵 A A A 中的任意两列 i i i 和 j j j, 如果在对应的每一行上, i i i 和 j j j 不存在同时为 1 的情况, 则称列 i \mathrm{i} i 和 j \mathrm{j} j 互斥…...
wandb 安装本地部署使用教程
1、官网注册 wandb.ai是一个为机器学习开发者提供的开发工具平台,可以帮助用户跟踪实验,管理和版本数据,以及与团队协作,从而更专注于构建最佳模型。 wandb官网: https://wandb.ai 首先我们打开官网注册号自己的账号并…...
飞桨平台搭建PP-YOLOE模型
一、创建项目 此博客仅是运行PP-YOLOE源码,这里以变压器渗漏数据集为例COCO数据集太大了,跑不动,V100训练预估计得7天左右,即便是A100也得4天半,变压器渗漏油数据集跑一个小时左右,还可以接受,…...
Js重点内容
一,什么是js javascript是运行在客户端(浏览器,可预览)的编程语言 二,主要的功能 用来给静态页(html网页)增加一些动态功能(比如轮播图、tab切换) 三,应用…...
图形化ping工具gping
一、介绍 gping能够以折线图的方式,实时展示 ping 的结果,支持 Windows、Linux 和 macOS 操作系统。并且支持多个目标同时Ping同时展示折线图方便对比。下面扩展一下ICMP及ICMP隧道。 ICMP消息结构: ICMP消息是由一个类型字段、一个代码字段、…...
快速安装虚拟机centos7.5
vbox 快速导入安装centos7.5 环境准备 vbox安装(下载地址) ova镜像(下载地址)(默认是192.168.56.10 加nat网卡) 链接:https://pan.baidu.com/s/164Iprh_80HCQmKCU6V-RTw 提取码:if…...
2023.11.4 Idea 配置国内 Maven 源
目录 配置国内 Maven 源 重新下载 jar 包 配置国内 Maven 源 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf> …...
DAY11 字符串处理函数
1.测字符串长度函数 头文件: #include <string.h> 函数定义: size_t strlen(const char *s); 函数功能: 测字符指针 s 指向的字符串中字符的个数,不包括 ’\0’ void fun01() {char *num "hello";int len …...
Web自动化测试 —— PageObject设计模式!
一、page object 模式简介 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样板代码 driver/find/click 二、page object 设计原则 2.1、POM 模式的优势 降低 UI 变化导致的测试用例脆弱性问题让用例清晰明朗,与具体实现无关 2.…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
