什么是ESB,它有什么作用?

91
在以前的工作中,有很多关于“企业服务总线”(ESB)的讨论。我读了一本概念书的部分内容,但从未真正理解如何具体实现和集成它。我熟悉SOA /排队/目录服务等,但我不明白ESB究竟是什么。
它是一个具体的东西(服务/服务器/代理等),你只需以不同的方式将所有应用程序与其相连,还是更多地是一种设计系统的概念方式?
任何解释或好的示例链接都将不胜感激。谢谢。

5
如果你问Martin Fowler,他会告诉你这意味着糟糕的意大利面盒子。 - anataliocs
你也可以在这里找到有关ESB的信息:http://wso2.com/library/articles/2017/07/what-is-wso2-esb/,尽管它专门讲解了WSO2 ESB。 - Riyafa Abdul Hameed
ESB构成了SOA架构的支柱。 - Aniket Thakur
7个回答

55

这是一个相当高层次的抽象概念。核心概念是ESB提供中间件和接口,使企业能够在不编写代码的情况下连接其应用程序。

这可能包括通过调解来协调不兼容的协议、数据和交互。

将所有内容都经过中央总线传递的想法为附加层次的抽象提供了机会。使用行业标准将其他应用程序、客户端等“插入”到这个总线中,使得连接新服务、数据源和具有不同需求的客户端变得相对容易。

实际实现

就实际实现而言,这是非常大型企业支持企业的领域。虽然它非常时髦,但目标是理想状态,可以通过与互联网进行比较,在某些小范围内理解:

与互联网相似之处

一个大型通信总线,具有广泛不同的用途和数据,但所有运行标准化协议。

事实上,可以编写一个HTTP到FTP连接器,使浏览器可以访问FTP站点而不需要调用FTP客户端(通常已内置于浏览器中)。

混搭

混搭演示了一种有趣的实现方式-从旧金山机构获取公交路线数据,从谷歌地图中获取地图数据,从雅虎地图中获取带评级的寿司餐厅位置,并运行一个简单的查询,以便找到最近的寿司餐厅,如果餐厅更好,则愿意走更远的路程。

所有完全不同的服务,本身不兼容,但使用标准连接器(例如Yahoo Pipes),它们可以被组合成一个连贯且有用的整体。

-Adam


47
免责声明:我在IBM工作并咨询WebSphere ESB,这是一款IBM产品,旨在构建ESB。以下是我的个人观点,不一定代表IBM的立场。
对于不同的人来说,ESB有不同的含义,不幸的是。
对我而言,ESB是指任何你可以插入到SOA(面向服务的架构)中的技术,允许你连接不同的系统。它通常执行协议转换、消息修改、路由、日志记录、充当安全网关等功能。例如,你可以使用ESB将以前仅作为Web服务提供的服务公开为基于JMS的服务。
在这方面,ESB实现(或更准确地说,用于构建ESB的软件,比如我所咨询的那种)在技术上通常类似于曾经被称为消息代理或队列代理的东西,尽管目的略有不同,因为(正如首字母缩写所暗示的那样)它是围绕服务而不是将消息从一个地方移动到另一个地方而定位的。在技术上这种区别的重要性是一个主观看法。

1
我同意。类似讨论 - Aniket Thakur

39

我对商业ESB的经验是它是一种过度夸大和昂贵的技术,解决问题的同时也会创造许多问题。ESB将连接新系统和旧系统,消息将通过总线传输,所有东西都能够无缝地相互通讯。加入一些弹性、编排等功能,就可以拥有一个非常强大的企业应用软件。

问题出现在尝试实际使用它们时,撰写总线、创建消息结构等管理开销可能会超过其好处。作为高成本的项目,ESB被视为解决所有技术问题的万灵药,但事实并非如此,太多时间花费在总线上而非应用程序/数据连接上。通常情况下,多个竞争标准会在同一组织内争夺统治地位,导致这些系统实际上应该修复的典型技术主导的孤立状况。

在我看来,更好的做法是创建一小部分特定接口,通常在仅需要的系统之间使用Web服务。


1
我同意“过度夸大和昂贵的技术”这一部分。然而,你仍然需要一些东西来“粘合”个别的Web服务在一起。这可以是:新的Web服务(可能是最严格的),ESB上的BPEL - 一个大型基础设施但不那么严格,或者像混搭服务器这样更敏捷和灵活的东西。这些都是很好的敏捷开发的替代方案,不需要太多的仪式感(建模等)。 - Dan
混搭方法是我最喜欢的方法 - 我们曾经创建“单块式”的HTML+JS网页,现在我们创建各种内容混搭,针对不同的浏览器/设备。应用程序设计也将走向相同的路线。 - MrTelly
3
顺便说一句,我在回答中可能会有点对厂商的疲劳感 - 新的厂商太多了,支付的费用却只换来了微不足道的成果。 - MrTelly
你没有说明ESB是什么,而是将重点放在了在实施这种架构模式时遇到的具体问题上。 - user585968
1
企业服务总线(ESB)将连接新系统和遗留系统,消息将通过总线传递,一切都能够无缝地相互通信。加入一些弹性、编排,你就拥有了一个非常强大的企业应用软件。我认为这样概括得很好,你觉得呢? - MrTelly
十年过去了,这个答案现在还适用吗?技术成熟了吗? - Guilherme de Jesus Santos

13

这基本上是一种设计系统的概念方法 - 软件公司试图通过在其上贴上“ESB”标签来卖更多的软件,而经理们喜欢它,因为ESB从“高层次”看起来很好。

ESB基本上是带有附加数据模型和结构定义管理的消息导向中间件(MOM)。您可以为总线上的所有应用程序和适配器定义一个公共的数据定义(可以是具有共享XSD的XML)。连接到总线上的任何内容都必须按照此数据定义发送其信息。ESB支持加载、共享和版本控制此通用数据定义。将新组件连接到ESB时,您可以期望开箱即用的更多“兼容性”,而不是将其连接到MOM。总线上的每个组件在概念上都被视为“资源”,因此引入了其他抽象以解耦发送方和接收方。

例如:假设您想在标准的消息导向中间件中(例如JMS)将应用程序A与应用程序B连接起来,您需要与正在处理应用程序B的同事交谈,达成有关主题、消息类型和字段的协议,并发送以下伪代码:sendJms("TRADE.MSFT", {MapMessage trader="pete" price=101.4 vol=100})

如果您在面向服务的架构中执行同样的操作,则需要:

  1. 安装附加软件
  2. 学习许多新概念
  3. 在ESB的管理员GUI中定义您的新Java组件
  4. 实现一些由ESB控制的接口
  5. sendJms(getDestination(), {MapMessage trader="pete" price=101.4 vol=100}) - 注意目标是从ESB注入的

第一次可能有点痛苦,但我想您可以适应它,就像适应EJB一样。

您可以说MOM系统是“无类型”的(动态结构),而ESB是“类型化”的(静态结构)。与其他未命名/已命名的选择相比,原始消息传递和ESB之间的权衡类似于:

  • REST vs SOAP
  • 未验证的XML vs. 使用XSD验证的XML
  • Groovy vs. Java
  • 解释型语言 vs. 编译型语言
  • 对于较小的项目,快速确定功能很好(例如Groovy代码),但对于较大的项目,拥有调试器很重要(例如Java),可以在出现故障之前提前警告,并为人们在提交项目之前提供标准。

    因此,如果您的项目遭受太多人通过提交未经验证的更改来破坏系统,请向更具结构化的方向发展(使用ESB而非MOM)。 如果您的项目无法按时完成足够的任务,请选择更简单、无类型的解决方案。 如果两者都存在,则需要顾问(开个玩笑;-)


    4

    这要看你问的是谁了... 许多人会说ESB是一种“中间件”,它将各种“业务逻辑”模块连接在一起,以消除模块之间的编码消息传递。我认为这是一个足够概括的定义,但是我相信你已经通过维基百科等了解了这些内容。

    那些希望ESB拯救世界的人们认为,它最常见的用途是作为一个可做任何事情的中心枢纽。大多数ESB实现致力于封装我们在商业软件中看到的所有重复任务。这意味着大多数ESB负责数据传输、安全性、日志记录、协议转换、事件系统、通过Web服务公开API等。

    我想这是我能做到的最清楚的表述了... 希望对你有所帮助。


    3

    请查看我的演示文稿 "纠结不已 - 如何选择合适的ESB".

    我解释了何时使用ESB、集成套件或仅使用集成框架(如Apache Camel),同时讨论开源和专有ESB之间的差异。


    3
    除了从维基百科获取的标准定义外,我认为它是连接多个平台和技术上的遗留系统的绝佳工具。它也是构建分布式工作流和状态管理系统(如总账)的好工具。

    然而,它相当昂贵、复杂且不方便维护和扩展,这使得它作为一个通用工具来扩展您的应用程序的技术选择较差。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接