应用系统集成-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编程模型说明:

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

图3 通道简图(集成技术通道和逻辑通道)

  1. MessagingGateway(消息网关): 面向业务领域层提供的集成层接口,接口以业务领域模型的知识提出, 不揭示集成层的任何集成技术细节。

如:以下的接口定义了下单的集成接口,而不展示任何关于集成技术的知识。

@MessagingGateway

public interface Cafe {

@Gateway(requestChannel = "orders.input")

void placeOrder(Order order);

}

  1. 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;

}

  1. 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

  1. Bridge桥接,将通道消息桥接到目标通道;
  2. Router: 路由器,负责将来源通道上的消息路由到不同的目标通道
  3. Tranformer 转换器,将来源通道上的消息转化后发往目标通道
  4. Splitter 分流器,只将一个消息分流为多个小消息发往目标通道。如,下面例子中将订单转换为订单行信息发往目标通道。

@Splitter(inputChannel="orders", outputChannel="drinks")

public List<OrderItem> split(Order order) {

    return order.getItems();

}

  1. Aggregator聚合器,和Splitter相反,将来源通道上的多个消息转换为一个消息发往目标通道。
  2. 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规则

报价是否有效

报价选择通道

有效报价按照特定规则选取中标报价。可以通过多种选择规则的选择通道,根据配置确定生效的规则。

中标报价

供应商报价记录通道

记录供应商所有报价

供应商报价分析通道

对供应商历史报价进行分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/182505.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

策略模式在数据接收和发送场景的应用

在本篇文章中&#xff0c;我们介绍了策略模式&#xff0c;并在数据接收和发送场景中使用了策略模式。 背景 在最近项目中&#xff0c;需要与外部系统进行数据交互&#xff0c;刚开始交互的系统较为单一&#xff0c;刚开始设计方案时打算使用了if else 进行判断&#xff1a; if(…

【Redis】SSM整合Redis注解式缓存的使用

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Redis》。&#x1f3af;&#x1f3af; &#x1f4…

机器学习中的关键组件

机器学习中的关键组件 数据 每个数据集由一个个样本组成&#xff0c;大多时候&#xff0c;它们遵循独立同分布。样本有时也叫作数据点或数据实例&#xff0c;通常每个样本由一组称为特征或协变量的属性组成。机器学习会根据这些属性进行预测&#xff0c;预测得到的称为标签或…

Intel oneAPI笔记(2)--jupyter官方文档(oneAPI_Intro)学习笔记

前言 本文是对jupyterlab中oneAPI_Essentials/01_oneAPI_Intro文档的学习记录&#xff0c;包含对SYCL、DPC extends SYCL、oneAPI Programming models等介绍和SYCL代码的初步演示等内容 oneAPI编程模型综述 oneAPI编程模型提供了一个全面而统一的开发人员工具组合&#xff0…

在Linux系统下部署Llama2(MetaAI)大模型教程

Llama2是Meta最新开源的语言大模型&#xff0c;训练数据集2万亿token&#xff0c;上下文长度是由Llama的2048扩展到4096&#xff0c;可以理解和生成更长的文本&#xff0c;包括7B、13B和70B三个模型&#xff0c;在各种基准集的测试上表现突出&#xff0c;最重要的是&#xff0c…

OSPF 高级特性3

目录 一、OSPF安全特性 二、加快收敛 三、缺省路由 四、路由控制 五、显示OSPF的错误统计信息 附录E&#xff08;了解&#xff09; 六、OSPF防环 七、OSPF选路原则 八、OSPF综合实验 一、OSPF安全特性 1、OSPF报文验证&#xff1a; 区域验证模式&#xff1a;在区域下配…

el-tree中展示项换行展示

文章目录 效果如下所示&#xff1a;没有换行展示的效果修改样式换行之后的展示效果 想要了解el-tree使用的详情往下看代码和数据如下所示Vue代码中可能使用到的数据如下Vue的代码如下&#xff1a;没有换行展示的效果换行之后的展示效果样式调试 效果如下所示&#xff1a; 没有…

论文阅读—— CEASC(cvpr2023)

arxiv&#xff1a;https://arxiv.org/abs/2303.14488 github&#xff1a;https://github.com/Cuogeihong/CEASC 为了进一步减轻SC中的信息损失&#xff0c;使训练过程更加稳定&#xff0c;我们在训练过程中除了稀疏卷积之外&#xff0c;还保持了正常的密集卷积&#xff0c;生成…

JAVA虚拟机-第3章 垃圾收集器与内存分配策略

概述 第2章了解了运行时数据区&#xff0c;这一章探讨垃圾收集器与内存分配策略 程序计数器、虚拟机栈、本地方法栈3个区域随线程而生&#xff0c;随线程而灭&#xff0c;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。因此这几个区域的内存分配和回收都具…

【3D图像分割】基于Pytorch的VNet 3D 图像分割5(改写数据流篇)

在这篇文章&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2&#xff08;基础数据流篇&#xff09; 的最后&#xff0c;我们提到了&#xff1a; 在采用vent模型进行3d数据的分割训练任务中&#xff0c;输入大小是16*96*96&#xff0c;这个的裁剪是放到Dataset类…

开放式耳机能保护听力吗?开放式耳机有哪些优缺点?

先说答案&#xff0c;开放式耳机是可以保护听力的&#xff01; 想要了解开放式耳机是否能保护听力&#xff0c;就要先知道什么是开放式耳机&#xff0c;开放式耳机是一种无需入耳&#xff0c;并且使用时不会堵塞耳道&#xff0c;也不会隔绝外界声音的蓝牙耳机。 一、开放式耳…

【服务器使用】vscode winscp进行服务器容器连接(含修改初始密码)

1&#xff1a;获取docker的登陆信息 例如节点&#xff08;host&#xff09;、端口&#xff08;port&#xff09;、密码&#xff08;passwd&#xff09;等信息&#xff0c;这个自己找组内的前辈获取即可 2&#xff1a;配置config文件 找到vscode里面ssh处的config文件 人工找…

spring面试题笔记

SpringBoot 有几种读取配置文件的方式 1.value 必须是bean里才能生效&#xff0c;&#xff0c;final或static无法生效 2ConfigurationProperties注解 ConfigurationProperties是springboot提供读取配置文件的一个注解 注意&#xff1a; 前缀定义了哪些外部属性将绑定到类的字…

C++模板编程与泛型编程之函数模板

文章目录 函数模板(第一部分)定义函数模板使用函数模板样例 两阶段翻译 Two-Phase Translation模板的编译和链接问题 多模板参数引入额外模板参数作为返回值类型让编译器自己找出返回值类型将返回值声明为两个模板参数的公共类型样例 默认模板参数样例 重载函数模板模板函数特化…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

Kafka(二)消息系统设计

文章目录 前言整体设计时序图时序图解释 最后 前言 当多个系统之间通过Kafka来解耦时&#xff0c;在系统设计初期&#xff0c;基本的要求都是相似的&#xff0c;只不过是消费消息时的业务逻辑可能不同。 本文以业务系统和邮件系统解耦作为示例。业务系统需要发送邮件时&#…

SQL左连接实战案例

要求&#xff1a;用表df1和表df2的数据&#xff0c;得到df3 一、创建表 CREATE TABLE df1 (姓名 varchar(255) DEFAULT NULL,年龄 int DEFAULT NULL,部门 varchar(255) DEFAULT NULL,id int DEFAULT NULL );CREATE TABLE df2 (部门 varchar(255) DEFAULT NULL,年龄 int DEFAU…

API接口测试工具的功能及重要性

在现代软件开发中&#xff0c;API(Application Programming Interface)接口的测试至关重要。API接口是不同软件组件之间的桥梁&#xff0c;通过它们实现数据传输和功能交互。API接口测试工具是一类专门用于验证和测试这些接口的软件工具。本文将探讨API接口测试工具的定义、功能…

【高德地图API】JS高德地图API实现多边形绘画,高德获取多边形提交数据

目录 前言效果实现引入js 在项目中使用效果图引入htmlCSS具体实现JS调用说明添加的时候修改的时候判断是否在范围内 java绘画和判断是否在范围内pom.xml依赖引入import引入实现 前言 高德地图官方API&#xff1a;https://lbs.amap.com/demo/javascript-api/example/overlayers…

HTTPS的加密方式超详细解读

在了解https的加密方式之前&#xff0c;我们需要先行了解两个特别经典的传统加密方式&#xff1a; 1、对称加密 1.1、定义 需要对加密和解密使用相同密钥的加密算法。所谓对称&#xff0c;就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解…