理解现代企业集成系统架构

企业应用程序集成(EAI)是一个需要解决的复杂问题,不同的软件供应商产生了不同类型的软件产品,如ESB、应用服务器、消息代理、API网关、负载均衡器、代理服务器等。这些产品已经从单一的、重量级的、高性能的运行时发展到精益的、模块化的、微服务运行的。微服务体系结构(MSA)对架构师设计企业软件系统的方式产生了重大影响。由于MSA、容器、DevOps、敏捷,客户需求与十年前相比发生了巨大的变化。

如果你来这里是为了了解新的EIP模式,这篇文章我们不去介绍相关内容。实际上,由Gregor Hohpe引入的65个EIP模式仍然在运行中,还将出现一些其他模式。请参考下图,以了解您仍然可以在现代架构中使用的EIP模式。

另一个误解是,“集成”只是连接使用异构协议和消息格式进行通信的不同系统。在实践中,集成架构师需要了解企业软件体系结构的整个生态系统。

上图描述了现代企业中典型的集成体系结构,它由以下层组成。

数据层——这是业务数据所在的层。数据库可以是RDBMS、NoSQL或SAP、PeopleSoft、MS Dynamics等ERP/CRM系统,也可以是您所构建的任何私有系统。

服务层——这就是MSA和诸如容器、Docker、Kubernetes等技术开始产生影响的地方。有了域驱动设计(DDD)或“最好只做一件事”之类的概念,这一层变得更加精益。

集成层——这是服务编排、数据转换、协议切换以及上面提到的所有EIP模式的传统集成在这一层中发挥着重要作用。

API管理层——这已经成为任何集成项目的组成部分,它为业务和消费者提供了一个清晰的抽象。该层提供了认证、授权、缓存、节流和分析等功能,因此每个集成或后端服务都不需要担心实现它。

负载平衡层——这是在实现负载均衡时,网络和威胁保护的层。在这一层,可以防止像DOS或XML注入这样的外部攻击。

如果您正在设计一个企业软件系统,那么了解这些层是非常重要的。但是了解它们和每个层的特性并不足以在实际执行实现时做出决定。在决定具体的技术或供应商之前,您需要了解体系结构级别上每个层的主要需求。

数据层

这是业务关键数据驻留在系统中的位置。您将为实现选择的任何技术/供应商都应该包含以下主要需求。

一致性——您在这个层中存储的数据应该是一致的。需要避免对数据的任何篡改,需要采取必要措施防止这种企图。

在规模上的持久性——您的系统应该能够以非常高的速率存储事件,而不会丢失一致性。同时,应该可以读取持久数据。

安全性——这是您的数据存储的关键需求,因为此数据为您的业务获取价值。任何无意的使用或访问都需要避免。

服务层

这个层由实际的业务逻辑和服务组成,它们提供了大多数客户端系统所需要的信息。在SOA领域,您可能有一些服务,每个服务在宏观级别覆盖特定功能领域。但是在MSA类型的实现中,每个服务都包含一个在微观层面上的独特功能。例如,您可能在SOA中有一个航班预订服务,在MSA中有一个作为独立的微服务的航班信息服务、航班时刻表服务和航班费率服务。在任何情况下,您都需要独立地部署这些服务,以便在出现故障时它们不会相互影响。

在这一层,系统应该能够满足以下主要要求:

敏捷性——这个层应该以敏捷的方式实现,并围绕它构建适当的测试和自动化策略。由于这一层提供了最新的、对业务至关重要的信息,所以当业务增长时,需要更频繁地实现新服务。适当的CI/CD过程和构建管道需要与所选择的技术集成。

延迟——这个层的另一个重要方面是延迟。结果应该以最小的延迟交付,因为有额外的层,由于网络的干扰,这些层加起来就是总的延迟。在此层实现的服务应该更干净、更高效,以提供更好的延迟。

自动化——这里要考虑的另一个重要因素是自动化水平和在发布之前进行的不同级别的测试。由于这一层是企业系统的核心和业务的核心,任何错误的数据或服务中断都可能导致业务损失。

集成层

这一层提供了不同系统相互交互所需的中介功能。您可以找到大量不同的集成产品和技术,它们提供了在这个级别上需要的特性集,但不是每个技术/供应商都能够满足这些关键的但未来的需求:

简单性——服务集成不需要像在服务层实现业务逻辑那样困难。您应该具有易于使用的语法和可视化工具来构建这些集成,而无需太大的麻烦。同时,它应该提供必要的构建块来处理生产部署中的集成需求。需要支持数据类型、弹性、容器化等概念。

敏捷性——在过去,这可能不是为集成部署大量esb、消息代理的需求。但是在现代企业中,您的集成技术需要敏捷,能够支持频繁的发布、自动化和DevOps集成。

稳定性——当您处理异构系统时,系统很有可能与意想不到的数据类型交互。这可能导致集成层中的稳定性问题。重要的是,您的集成系统应该能够在不失去稳定性的情况下处理此类场景。

弹性——集成异构系统的另一个方面是,这些系统在任何时候都可能失败,集成层应该能够承受这些失败,而不会将这些失败传播到上层。为了具有弹性,需要支持断路器和重试等技术。

性能——当涉及到集成层的性能时,它应该能够以更高的速率接受并发请求,同时将它们以更低的速率发送到不能处理并发连接的后端服务。当您的系统具有不同的消息处理速率时,此功能是非常重要的。

缓存——考虑到它更接近于实际的后端服务,这种功能在集成层很好。如果后端服务层出现故障,集成层可以在某些场景中提供某种类型的缓存数据。

API管理层

一旦实现了后端服务层和集成层,系统就可以向外部系统公开有价值的信息。如果您的系统正在处理内部系统,您可能不需要API管理层。但是在大多数实用的集成项目中,API管理层是核心需求。与在每个服务级别实现公共需求不同,添加API管理层更高效、更可伸缩。您将在市场上找到几十个API管理供应商,它们提供与传统API管理需求相同的基本特性集。

一个更现代的API管理解决方案应该能够满足以下需求:

身份验证和授权——系统应该能够对请求访问服务层的用户进行身份验证。授权可以是一个附加的特性,用于在细粒度级别上保护服务。OAuth2已经成为访问授权和认证的实际标准。系统应该能够处理OAuth2。

节流—系统需要得到适当的控制,以便用户能够公平地共享整个系统的访问权限,如果您正在收费使用的话;您需要应用更高级的节流策略。

分析——监视和分析您的API使用情况对于改进您的业务流程和驱动新的收入至关重要。在这里,业务级分析与系统状态监视相比更为重要。

高可用性——高可用性在这个层非常重要,因为用户不希望在任何给定的时间看到空页或内部服务器错误。通过使这个层具有高可用性,我们可以通过在API网关上的缓存来解释上游层(如集成层和后端服务)的失败。

弹性——API管理层的另一个关键需求是能够承受上游层的失败。它不应该将这些系统的故障传播到其他下游层,比如负载均衡器。这可以通过像断路器、隔离壁和重试在这一层的机制来实现。

高速缓存——智能和自适应高速缓存技术可以为用户提供不间断的服务。通过减少后端系统的负载,缓存有助于提高系统的整体性能。当后台服务不可用时,智能缓存系统仍然可以向消费者提供缓存的结果。

开发人员体验——如果您将api公开给开发人员,以便浏览api并创建自己的应用程序,那么开发人员体验是系统的另一个关键需求。有时开发人员可能需要通过组合现有的api来构建自己的api。在大多数情况下,这个API组合能力是一个很好的需求。

负载均衡器/代理层

鉴于世界各地发生的数据泄露和黑客活动的数量,将您的业务功能公开到公共internet上需要非常小心。这就是为什么您需要有一个适当的负载平衡或代理层来为您的信息系统提供基本的保护。这一层需要满足的主要需求是

安全性——该层应该能够处理基本的安全威胁,如DOS攻击、XML注入、CSS、CRLF等。它还应该能够支持SSL。

弹性——在这一层,弹性意味着上游系统中的任何失败都不能使这一层降低。当上游系统无法使用时,应通过断路器和重试等技术在这一层进行适当的处理。

性能——这一层将为进入系统的所有请求提供服务。我们可以通过在其他层使用缓存技术来减少后端系统的负载。但这一层无法做到这一点,因为它处于用户的最前沿。在并发处理方面具有良好的性能是这一层的关键。

缓存——通过减少上游系统的负载,这一层的缓存功能将最终提高整个系统的性能。由于上游系统中存在多个数据失效层,因此缓存需要智能和自适应。

负载平衡——显然,这是这一层处理进入系统的巨大负载所需的核心能力之一。

可用性——这是可用性最关键的层。由于没有其他方法来模拟这个层的可用性(类似于缓存),所以必须在这个层具有高可用性。

正如上面几节所讨论的,拥有分层的体系结构可以让我们深入思考这些层及其需求。它还提供了在每个层中选择最适合的技术或供应商的方法。有些技术/供应商在每一层都受到分析师报告的高度赞扬。解决方案架构师和cto的任务是做出最终决定。

原文发布于微信公众号 - 程序你好(codinghello)

原文发表时间:2018-07-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

Golang语言社区--游戏服务器开发都要学什么

大家好,我是Golang语言社区(www.golang.ltd)主编彬哥,本篇给大家转载一篇关于游戏服务器开发都要学什么的文章;主要帮助初学者了解下游戏服务器都...

7093
来自专栏软件测试经验与教训

一般系统瓶颈

3355
来自专栏程序员的知识天地

提升 Web 应用的代码质量【干货持续输出】

Web 应用的质量提升,是一个非常有意思的话题。我们明知道有一系列的手段可以提升代码质量,但是限于多种原因,我们并不会去做。在我工作的第一个项目里,由于大家都是...

831
来自专栏腾讯移动品质中心TMQ的专栏

完美组合:用例精简+精准测试

一、 为什么要做用例精简和精准测试 1、 测试用例越来越多,测试效率低下 这是因为在目前的快速迭代开发模式下,测试人员需要不停覆盖不断调整的产品逻辑需求,因此测...

24210
来自专栏Bug生活2048

.net core项目实战之回顾总结

项目需求其实很简单,类似于一个简单的审批+简单的任务管理系统,但需要同时有PC端和APP端。

1621
来自专栏微服务生态

Martin Fowler关于微服务的原文翻译(一)

原文如下:http://martinfowler.com/articles/microservices.html

844
来自专栏我的小碗汤

GitHub上优秀的Go开源项目

近一年来,学习和研究Go语言,断断续续的收集了一些比较优秀的开源项目,这些项目都非常不错,可以供我们学习和研究Go用,从中可以学到很多关于Go的使用、技巧以及相...

1504
来自专栏JAVA高级架构

Java开发工程师理解的三种架构模型

常用的软件架构模型可以归类为三种架构模型:3/N层架构、“框架+插件”架构、地域分布式架构。 一.三种架构模型 1.3/N层架构 这是经典的多层架构模型,对于稍...

3447
来自专栏杨建荣的学习笔记

一种Oracle快速的整合迁移方案(r12笔记第98天)

最近在分析一个迁移案例的时候,突然多了一些额外的想法,也算是对原有方案的一个补充。 比如存在两个数据库 peak和esales,彼此是独立的业务,所幸两...

3708
来自专栏云计算D1net

管理混合云和多云:代理或无代理?

导语 混合云在节省更多IT成本方面提供更多的潜力,并将这些成本节约转向改善业务成果,但却带来了一些独特的挑战。人工手动的流程在一个混合的世界变得难以管理,因为云...

36110

扫码关注云+社区

领取腾讯云代金券