什么是企业服务总线?它包含哪些技术组件?

news2024/11/15 11:59:20

我们每个人都会去医院,您描述下我们去医院的场景,然后引出这个挂号流程,通过挂号流程中的一个问题或者什么东西来吸引他的好奇心,这样呢?会比现在的预设场景好一些。我举个例子,人工智能怎么帮人看病。如果一上来就讲人工智能芯片、处理器什么的,我们看一分钟就觉得够够的了。一个比较好的方式是描述医院做脑CT的场景,医生分析一张张脑CT,那太慢了,最好是有一个能帮医生分析脑CT的人工智能,不会疲倦还能精准判断那我们就会好奇,它怎么做到的呢?然后就引出问题了,接下来一步步解决疑惑就好了

我们每个人一年当中或多或少都可能会有生病去医院看医生的场景。在医疗信息化高速发展的今天,我们可以借助于一些在线挂号APP来事先完成显示的挂号预约。相信你应该有这样的经历,但你是否有想过,全国有这么多家医院,每个医院内部都可能有自己的信息化系统,在线挂号APP是如何帮你准确而高效的找到目标医院和医生的呢?

要想回答这个问题,我们先来看一下挂号预约的整个业务流程,如下图所示。这里的移动医疗系统就是APP供应商所开发的系统,而医院信息系统则位于各个医院的内部。


如何实现这个场景呢?这里的核心需求在于使用合适的系统集成机制完成我们自己的移动医疗系统与医院信息系统之间的整合,而这个整合过程需要做到高扩展性和灵活性,因为医院系统的差异化对系统集成的影响非常大。我们可以进一步梳理所涉及到的技术难点,包含:

  1. 如何对数据进行有效的路由?因为用户需要选择目标医生进行挂号,而该医生可能位于某一家具体医院中,需要把用户请求正确的路由到该家医院的系统中;
  2. 如何完成异构系统之间的适配?因为各个医院系统的技术体系可能不尽相同,所以需要处理异构系统的数据交互问题;
  3. 如何根据特定医院做定制化扩展和过滤?由于不同的医院对于问诊排班流程的处理方式同样不尽相同,针对特定医院的特定需求,需要实现对数据的扩展和过滤;
  4. 如何实现系统集成组件与平台系统之间的解耦?从架构上讲,平台系统应该专注于处理平台级的业务流程,而系统集成组件则只需要处理与医院系统对接方面的逻辑,两者应该各司其职,独立发展

显然,通过硬编码的方式实现与外部多个医院系统之间的信息传递和交互就不合适了,我们需要引入更为合适的技术体系来对整个流程进行建模并实现。

企业服务总线就是用来处理这类场景的最佳技术方案。什么是企业服务总线?企业服务总线的英文为Enterprise Service Bus,也就是我们通常所说的ESB。本质上,它是一种系统集成组件,用于解决分布式环境下的异步协作问题,可以看作是对消息传递系统的扩展和延伸。服务总线是用于连接分布式异构后端和前端系统的一种中间层软件服务,能够隐藏复杂性,简化数据处理过程。对系统集成需求的剖析引出了服务总线的整体解决方案,如下所示:


在上图中,我们可以看到在企业服务总线中,所有的数据都被抽象成是一种消息,而上图也展示了其包含的三大核心组件,即路由器、转换器和端点,我们可以把这三个组件的功能与案例中的需求对应起来,如下图所示:


我们先来看路由器,路由器需要考虑的核心问题有三个,即:

  1. 一次路由单条/多条数据?
  2. 路由结果面向一个/多个目标?
  3. 路由是否有状态?

围绕上述三个问题所得出的答案,我们加以排列组合可以得到多种常见的路由器表现形式,如下表所示,其中有状态的路由器指的就是需要根据消息传递的上下文确定路由结果,通常涉及多个消息,具有较高的复杂性。

路由器

输出数据数

输入数据数

有无状态

内容路由器

1

1

接收表

1

0或n

分解器

1

n

聚合器

n

1

我们来看看表中这些路由器各自的特点。内容路由器(Content-based Router)是最简单的路由器,即通过消息的内容决定路由结果,这里的消息内容包括输入消息的消息头属性值、消息体类型以及各种对消息体内容的自定义的业务规则,通过内容路由器可以产生一对一的路由效果。

接收表(Recipient List Router)面向1对多的路由需求,当对同一消息进行路由时,特定场景下可能会满足多种路由条件从而产生多个路由结果,如下图所示。显然,结合前面的案例以及系统扩展性需求,接收表可以满足我们路由到不同医院的需求。


分解器(Splitter)往往和聚合器(Aggregator)一起使用,典型应用场景是消息包含多个元素,而每个元素处理方式不同,这时候我们可以把原始消息分解成多个消息,并通过一定聚合策略实现分解后消息的关联。下图所示的就是常见的一种聚合策略,也就是说根据消息头中所包含的“100”这个消息编号实现聚合。


可以看到分解器和聚合器的组合与大数据领域中的Map/Reduce算法有异曲同工之妙,对于数量较大的计算可以通过路由的策略并行执行,这也是解决类似问题的一种思路。

讲完路由器,我们再来看转换器(Transformer)。转换器解决服务总线中数据如何在异构系统之间进行适配的问题。服务总线常用于异构系统之间的交互和集成,通过转换可以消除异构系统之间由于数据格式所导致的依赖。最基本的转换思路就是通过一种自定义转换机制进行两种数据结构之间的映射,这些构成了数据结构转换器。另一方面,有时候我们也需要输入的数据结构进行内容上的扩充和过滤。

内容扩充器(Enricher)就是往消息中扩充新的数据,扩充的数据来源可以有很多,而扩充的对象可以是消息的消息头也可以是消息体,所以内容扩充器一般可以分成消息头扩充器和消息体扩充器。而内容过滤器(Filter)是内容扩充器的反向操作,目的是去除消息中的某一部分数据。

在案例中,使用内容过滤器就可以根据用户挂号请求中的目标医院信息来过滤那些不需要访问的医院系统,这是一种应用方式。再比如说,如果某家医院需要传入特定的安全标识符才能访问院内系统,那么通过扩充器也很容易在消息头中填充这种安全标识符而不需要修改消息体本身,效果如下所示:


关于企业服务总线,我们最后想要讨论的端点(Endpoint),而最常用的端点技术就是网关(Gateway)。当应用程序与系统集成组件进行交互时,从系统设计的角度讲我们希望应用程序中的业务代码和用于系统集成的非业务代码耦合度尽量低,也就是说应用程序应该封装对系统集成组件的访问接口,网关就是用来实现这方面的需求。网关中应该只包含业务领域层面的接口定义而不应该出现任何和系统集成技术相关的内容,如下图所示。


最后,让我们回到案例系统。通过综合应用企业服务总线中的各个核心组件,我们可以梳理移动医疗系统的实现效果图,如下图所示:


在上图中,我们综合应用了网关、内容扩充器、接收表、数据结构转换器等组件完成系统集成建模。网关用于剥离移动医疗系统后台服务与集成服务之间的耦合,内容扩充器和数据结构转换器可以通过数据转换实现针对医院异构系统的集成和定制化需求,而接收表则根据消息头中携带的目标医院信息自动路由到目标医院所在的医院服务,最后目标医院服务的返回结果将通过网关转回到移动医疗系统,从而实现系统集成的闭环。

至于如何实现服务总线,业界也提供了多种第三方工具,我们可以借助于Mule ESB、Apache Camel和Spring Integration等框架来实现上图中的整体流程。

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

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

相关文章

前端面试题23(css3)

关于CSS3的面试题,我们可以从多个维度来探讨,包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题,并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器? 答案: C…

【Java安装】windows10+JDK21+IDEA

文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…

手机飞行模式是什么意思?3个方法教你如何开启

在现代生活中,手机已经成为我们日常生活中不可或缺的一部分。然而,有时我们需要暂时切断手机的通信功能,比如在飞机上、开会时或需要安静休息的时候。这时候,苹果手机上的“飞行模式”功能就派上了用场。 那么,手机飞…

【从零到一,如何搭建本地AI大模型】

摘要: 本文主要记录这一段时间对本地大模型搭建的心得。 作为一个资深程序员,在AI席卷全球的时候,深深感觉到了一丝危机感,不禁有一个想法不断在脑海闪现:我会不会真的哪一天被AI给取代了? 从哪入手 程序员出生的我,掌握了很多语言,从前端到数据库,再到运维,基本都…

uniapp-小程序获取用户位置

1. 需要在微信公众平台进行接口的申请。选择自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后,就可以使用了。 相关获取位置API的链接 4. 如果要获取当前位置到某一个指…

VS 附加进程调试

背景: 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1: 打开VS,调试->附加到进程,出…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0,var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型,通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

7月6日 VueConf 技术大会即将在深圳举办

7月6日,VueConf 2024 即将在深圳召开,本次大会正值 Vue.js 十周年,旨在聚焦 Vue.js 社区的成员,分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质(数据结构)数据的取值范围(字节大小)数据的存储方式参与的运算 Java是一门强类…

NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149

摘 要 随着移动互联网的快速发展,购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一,在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序,用户可以通过它方便地浏览…

C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

本篇大纲 前言一. 引用续讲1. 传值,传引用效率对比2. 类型转换和表达式传引用的注意事项3. 引用与指针 二. 内联函数1. 概念2. 特性3. 面试题 三. auto关键字(C11)1. 类型别名思考2. auto简介3. auto的使用细则4. auto不能推导的场景 四. 基于范围的for循环(C11)1. 范围for的语…

3DMAX软件如何导出和导入模型

在3DMAX软件中导出和导入模型的过程相对直观,以下是具体的步骤:导出模型:1、选择模型:首先,在3DMAX的视图中选择你想要导出的模型。2、导出设置:点击菜单栏中的“文件”(File)&#…

现货黄金技术出现这一信号赶紧止损!

很多现货黄金投资者都并不知道,移动平均线除了可以用于寻找进场的机会,还可以用来设置止损,让自己在交易中更好地进行防守。其实移动平均线止损,是常用的技术止损方法之一,本文将和大家分享怎样利用均线设置止损点&…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加密导入密钥(C/C++)】

加密导入密钥(C/C) 以加密导入ECDH密钥对为例,涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。 具体的场景介绍及支持的算法规格。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 设备A&#xf…

【日记】我就是世界上最幸福的人!(1124 字)

正文 今天想写的内容有点多,就不写在纸上了。 首先,最高兴的,还是我们的《艾尔登法环》有了进展。我和兄长终于通过了 “火山官邸:地底拷问所”。我真是不知道,我和他在这个地方被那两个掳人少女人拷问了多少次了。不仅…

笔记本电脑投屏怎么操作?一看就会!

日常工作或办公都会用到笔记本电脑,但很多新手用户不知道笔记本电脑的投屏要怎么操作?接下来系统之家给大家介绍三种简单的操作方法,帮助大家轻松完成笔记本电脑投屏投屏操作,从而满足自己的办公或学习使用需求。 方法一 1. 直接W…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念,dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

anaconda powershell prompt中的指令

1.查看安装目录 pip list 或者 conda list 2.查看虚拟环境 conda env list 3.进入虚拟环境 conda activate 环境名称 例如:conda activate pytorch_learn 4.安装虚拟环境 conda create -n “” python 5.在虚拟环境中安装某模块/包 先进入虚拟环境 再 conda install…

命令模式(大话设计模式)C/C++版本

命令模式 C #include <iostream> using namespace std;// Receiver类 知道如何实施与执行一个与请求相关的操作&#xff0c;任何类都可能作为一个接收者 class Receiver { public:void action(){cout << "请求执行!" << endl;} };// Command类&am…