Enterprise Integration Patterns (EIP)是 Gregor Hohpe 和 Bobby Woolf 的一本书,以模式语言的形式描述了 65 种用于使用 企业应用程序集成 和面向消息的中间件的模式。它们帮助我们使用标准化的方式来集成应用程序,而无需在每次遇到问题时都重新发明轮子。
企业集成模式的目标是创建一种通用语言和一组工作流操作,以便将它们组合在一起以创建成熟、实用的业务流程。它提供了一个包含 65 种模式的目录,可帮助您为您的企业设计有效的消息传递解决方案。
本书区分了四种顶级集成替代方案:
- 文件传输
- 共享数据库
- 远程过程调用
- 消息传递
引入了以下集成类型:
- 信息门户
- 数据复制
- 共享业务功能
- 面向服务的架构
- 分布式业务流程
- 企业对企业整合
- 紧耦合交互与松耦合交互
使用免费在线工具绘制企业集成模式图
Visual Paradigm 的免费 企业集成模式工具 (EIP 图表工具)具有一组编辑功能,使绘图更简单、更快捷,例如拖放和对齐指南,使编辑变得流畅和直观。EIP 图表工具还附带一组 EIP 符号和形状,可让您创建不同类型的 EIP 图表。

您可以轻松地开发您的模式,然后通过 PNG、JPG、GIF、SVG 和 PDF 等格式输出和共享它们。
通过示例和模板学习 EIP
您可以从空白图表或 EIP 模板开始。以下是一些模板。单击“编辑”按钮立即开始编辑。它是免费的,无需注册。
企业集成模式示例:智能代理

企业集成模式示例:组合消息传递 MSMQ

想采用其他一些企业集成模式吗?
来自 Visual Paradigm的EIP 在线编辑存储库
生态工业园区实施框架
Apache Camel 支持 Gregor Hohpe 和 Bobby Woolf 的优秀著作中的大多数 企业集成模式 。基于企业集成模式 (EIP) 通过应用开箱即用的最佳实践来帮助您解决集成问题。Camel 支持 Gregor Hohpe 和 Bobby Woolf 的优秀著作中的大多数企业集成模式,以及来自 微服务架构的更新集成模式。
如果您是 Camel 的新手,您可能想在尝试实现这些模式之前尝试用户指南中的 入门 。
消息系统

留言频道
一个应用程序如何使用消息传递与另一个应用程序通信?

信息
通过消息通道连接的两个应用程序如何交换一条信息?

我们如何在保持独立性和灵活性的同时对消息进行复杂的处理?

如何解耦各个处理步骤,以便根据一组条件将消息传递给不同的过滤器?

使用不同数据格式的系统如何使用消息传递相互通信?

应用程序如何连接到消息传递通道以发送和接收消息?
消息渠道

呼叫者如何确定只有一位接收者会收到文件或执行呼叫?

发送者如何向所有感兴趣的接收者广播事件?

消息传递系统将如何处理它无法传递的消息?

即使消息系统发生故障,发件人如何确保消息将被传递?

如何将应用程序连接到消息传递系统以便它可以发送和接收消息?

如何连接多个消息传递系统,以便在一个消息系统上可用的消息也可以在其他消息系统上可用?

什么样的架构能够使不同的应用程序一起工作,但以一种解耦的方式,以便可以轻松地添加或删除应用程序而不影响其他应用程序?

通过捕获对数据库所做的更改来同步数据,并将这些更改应用到另一个系统。
消息构造

如何使用消息传递将事件从一个应用程序传输到另一个应用程序?

当应用程序发送消息时,它如何获得接收者的响应?

回复者如何知道将回复发送到哪里?

收到回复的请求者如何知道这是针对哪个请求的回复?

发件人如何指示何时应将消息视为陈旧并因此不应处理?
消息路由

我们如何处理单个逻辑功能(例如,库存检查)的实现分布在多个物理系统中的情况?

组件如何避免接收到无趣的消息?

如何在保持效率的同时避免路由器对所有可能的目的地的依赖?

我们如何将消息路由到(静态或动态)指定收件人列表?

如果消息包含多个元素,我们如何处理它,每个元素都可能需要以不同的方式处理?

我们如何组合单个但相关消息的结果,以便将它们作为一个整体进行处理?

我们如何才能将相关但无序的消息流恢复到正确的顺序?

在处理由多个元素组成的消息时,如何维护整个消息流,每个元素可能需要不同的处理?
当一条消息需要发送给多个收件人时,您如何维护整个消息流,每个收件人都可能会发送回复?

当步骤顺序在设计时未知并且可能因每条消息而异时,我们如何通过一系列处理步骤连续路由消息?

当所需的步骤在设计时可能不知道并且可能不是连续的时,我们如何通过多个处理步骤路由消息?

如何将消息的目的地与发送者分离并保持对消息流的集中控制?
如何限制消息以确保特定端点不会超载,或者我们不会超过某些外部服务商定的 SLA?
如何在给定时间内从多条消息中抽取一条消息以避免下游路由不过载?
如何延迟发送消息?
如何在多个端点之间平衡负载?
如果服务中断,我如何停止调用外部服务?
如何在从某种服务注册表中查找服务的分布式系统中调用远程服务?
如何在 Camel 路线中定义一系列相关操作,这些操作应该成功完成(全部)或不执行/补偿?
如何将消息同时路由到多个端点?
如何在循环中重复处理消息?
消息转换

如果消息发起者没有可用的所有必需数据项,我们如何与另一个系统通信?

当您只对少数数据项感兴趣时,如何简化对大消息的处理?

我们如何在不牺牲信息内容的情况下减少跨系统发送的消息的数据量?

您如何处理语义上等效但以不同格式到达的消息?
如何对邮件正文进行排序?
如何执行可能不会更改消息的脚本?
如何验证消息?
消息传递端点
您如何在域对象和消息传递基础架构之间移动数据,同时保持两者相互独立?

应用程序如何在消息可用时自动使用它们?

当应用程序准备就绪时,应用程序如何使用消息?

消息传递客户端如何同时处理多个消息?

单个通道上的多个消费者如何协调他们的消息处理?

消息消费者如何选择它希望接收的消息?

订阅者如何在不收听消息时避免丢失消息?
消息接收者如何处理重复消息?

客户端如何控制其与消息传递系统的事务?

您如何封装从应用程序的其余部分对消息传递系统的访问?

应用程序如何设计一项服务,以便通过各种消息传递技术和非消息传递技术调用?
系统管理

我们如何有效地管理分布在多个平台和广泛地理区域的消息传递系统?

如何通过中间步骤路由消息以执行验证、测试或调试功能?

您如何检查在点对点通道上传输的消息?
我们如何有效地分析和调试松耦合系统中的消息流?
如何记录处理消息?
Steps 将一组 EIP 组合成一个组合逻辑单元,用于度量和监控。