应用系统集成-Spring Integration

news2024/10/6 14:26:02

应用系统集成-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.coloradmin.cn/o/1178612.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-全自动二维码识别

纯笔记&#xff0c;可以做到全屏识别二维码&#xff0c;自动识别&#xff0c;复制链接&#xff0c;生成简单的二维码&#xff0c;将识别到的内容转为txt import pyautogui from PIL import Image from pyzbar.pyzbar import decode import tkinter as tk from tkinter import …

【JAVA学习笔记】64 - 坦克大战1.4,限制坦克发射子弹,敌方击中我方坦克爆炸

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter18/src/com/yinhai/tankgame1_3 增加功能 1.我方坦克在发射的子弹消亡后&#xff0c;才能发射新的子弹. >扩展(发多颗子弹怎么办)&#xff08;其实已经解决了&#xff0c;在62章我们已经…

【科普】电脑屏幕刷新率:了解和选择需要的刷新率

在日常使用电脑的过程中&#xff0c;我们经常会听到刷新率这个词&#xff0c;但是你了解它的意义和作用吗&#xff1f;接下来&#xff0c;让我们一起来深入了解一下吧。 01 什么是刷新率 首先&#xff0c;我们要解释一下什么是刷新率。刷新率就是屏幕在一秒内能刷新的次数&…

微信小程序之自定义组件开发

1、前言 从小程序基础库版本 1.6.3 开始&#xff0c;小程序支持简洁的组件化编程。所有自定义组件相关特性都需要基础库版本 1.6.3 或更高。开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以便在不同的页面中重复使用&#xff1b;也可以将复杂的页面拆分成多个低耦…

践行“人人可用”:更轻量、更好用、更优雅、更全面,DataEase开源数据可视化分析平台发布v2.0版本

2023年11月6日&#xff0c;DataEase开源数据可视化分析平台正式发布v2.0版本。DataEase开源项目创立于2021年1月&#xff0c;于2021年6月发布v1.0版本。相比v1.x版本&#xff0c;DataEase v2.0版本采用了更加轻量级的架构设计&#xff0c;功能模块在保留原有“仪表板”模块的基…

领域认知智能走向落地,B端企业还缺些啥?

大模型如何为我所用&#xff1f; 这是当下B端众多企业都在深入思考的一个问题。今年以来&#xff0c;大模型在办公、对话、搜索等领域所展现出的强大能力&#xff0c;让越来越多B端企业意识到大模型对于业务的巨大价值。 因此&#xff0c;领域认知智能迅速成为B端企业关注的焦…

rhcsa-压缩和解压缩

.zip: zip 程序压缩打包的档案;(很常见&#xff0c;但是因为不包含文档名编码信息&#xff0c;跨平台可能会乱码).rar: rar 程序压缩打包的档案:(在windows上很常见&#xff0c;但是是商业软件。gz: gzip 程序压缩的档案;(linux目前使用最广泛的压缩格式).bz2: bzip2 程序压…

Linux之Nignx及负载均衡动静分离

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …

这可能是全网最晚的低代码技术总结

低代码的发展一向结伴着质疑前行&#xff0c;一些人认为低代码平台限制了开发人员的创新能力&#xff0c;使得开发过程变得过于简单&#xff0c;缺乏深度的定制和灵活性。他们担心&#xff0c;低代码平台可能只适合于简单的应用程序&#xff0c;无法满足复杂业务需求。另一面&a…

Android codec2 视频框架 之应用

文章目录 应用流程外部主动获取输入和输出buffer外部设置回调 内部流程 应用流程 外部主动获取输入和输出buffer 解码的调用流程&#xff0c;以android原生的一个bin来说明 android 原生代码位置&#xff1a; frameworks/av/cmds/stagefright/codec.cpp frameworks/av/cmds/st…

在Windows 10中共享打印机,以便其他用户可以访问,发挥打印机的最大作用

知道如何在Windows 10中共享打印机是非常宝贵的。如果没有打印机共享&#xff0c;多个用户从单个设备进行所有打印的唯一方法就是手动连接自己的计算机。在本指南中&#xff0c;我们将向你展示一种更简单的方法。 通过网络共享打印机&#xff0c;只需连接一台PC或笔记本电脑。…

svn使用图形化界面从trunk目录下创建下的分支

1、svn目录 要从trunk目录右键创建一个新的目录出来。Branch/tag下创建&#xff1a; 然后源目录和提交目录的编写&#xff1a; 这样新的分支目录chuanqi_4就创建好了。要注意:这样创建要确保目标目录在svn目录下不存在。

ROS中MPC局部路径规划器使用方法及源码流程解读

本文主要介绍ROS中Navigation导航框架中MPC局部路径规划器mpc_local_planner的使用方法&#xff0c;并对源码进行解读&#xff0c;梳理其规划流程等&#xff0c;具体包含MPC模型预测控制算法简介、mpc_local_planner使用方法、mpc_local_planner源码解读与规划流程梳理三部分内…

微信小游戏软件开发手机微信休闲游戏

当今&#xff0c;微信已经成为了中国最受欢迎的社交媒体平台之一&#xff0c;拥有数亿活跃用户。随着微信的不断发展&#xff0c;微信小游戏成为了一个热门的应用领域&#xff0c;吸引了许多开发者和玩家。微信小游戏是一种小型游戏&#xff0c;可以直接在微信内嵌入和玩&#…

【JavaEE初阶】 TCP服务器与客户端的搭建

文章目录 &#x1f332;前言&#x1f334;ServerSocket API&#x1f384;Socket API&#x1f340;TCP中的长短连接&#x1f38d;建立TCP回显客户端与服务器&#x1f6a9;TCP搭建服务器&#x1f6a9;TCP搭建客户端&#x1f6a9;通信过程展示&#xff1a; &#x1f333;多个客户端…

offsetof宏的使用、模拟实现及 (size_t)(((struct_type*)0)->mem_name)的解释

宏原型&#xff1a;offsetof(type,member) 作用&#xff1a;返回数据结构或联合体类型中成员的偏移量&#xff0c;以字节为单位 返回值&#xff1a;size_t类型的无符号整数 使用案例&#xff1a; #include <stdio.h> #include <stddef.h> struct foo {ch…

爬取东方财富股票信息

爬取股票信息 爬虫爬取信息&#xff0c;一般有两种大的思路&#xff0c;分别是&#xff1a; 模拟header信息&#xff0c;发送请求&#xff0c;得到相应的数据&#xff08;html文件 或者 json数据&#xff09;使用selenium模拟打开浏览器&#xff0c;然后利用selenium提供的函…

高防CDN:企业网络安全的坚强后盾

随着互联网的快速发展&#xff0c;企业的网络面临着越来越多的安全威胁。在这种背景下&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;已经成为了企业网络安全的坚强后盾。本文将理性分析高防CDN对于企业发展的影响&#xff0c;强调其在维护网络稳定性、…

内核态内存映射

内核态的内存映射机制&#xff0c;主要包含以下几个部分&#xff1a; 内核态内存映射函数 vmalloc、kmap_atomic 是如何工作的&#xff1b;内核态页表是放在哪里的&#xff0c;如何工作的&#xff1f;swapper_pg_dir 是怎么回事&#xff1b;出现了内核态缺页异常应该怎么办&am…

MySQL(10):创建和管理表

基础知识 在 MySQL 中&#xff0c;一个完整的数据存储过程总共有 4 步&#xff0c;分别是&#xff1a;创建数据库、确认字段、创建数据表、插入数据。 要先创建一个数据库&#xff0c;而不是直接创建数据表&#xff1a;从系统架构的层次上看&#xff0c;MySQL 数据库系统从大到…