api网关和esb区别

我最近谈论了微服务模式的演变,以及来自Lyft的Envoy之类的服务代理如何帮助将弹性,服务发现,路由,指标收集等责任推到应用程序下一层。 否则,我们冒着希望并祈祷各种应用程序将正确实现这些关键功能或依靠特定于语言的库来实现这一目标的风险。 有趣的是,这种服务网格的想法与企业空间中的客户所知道的其他概念有关,并且我对此关系有很多疑问。 具体来说,服务网格与ESB,消息代理和API管理之类的事物有何关系? 这些概念肯定存在重叠,因此让我们深入研究吧。 欢迎在Twitter上关注@christianposta,以获取有关此主题的更多信息!

四个假设

1)服务通过网络进行通信

首先要说的是:我们正在谈论通过异步,分组交换网络相互通信和交互的服务。 这意味着它们在自己的进程和自己的“时间边界”(因此在这里是异步性)中运行,并通过网络发送数据包进行通信。 不幸的是, 不能保证异步网络的交互 :我们可能会以失败的交互,停滞/潜在的交互等为最终结果,而这些场景彼此之间是无法区分的。

2)如果仔细观察,这些相互作用是不平凡的

第二点是:这些服务如何相互交互并非易事; 我们必须处理失败/部分成功,重试,重复检测,序列化/反序列化,语义/格式转换,多语言协议,路由到正确的服务以处理我们的消息,处理消息泛滥,服务编排,安全性等问题含义等。很多事情可能并且确实会出错。

3)了解网络有很多价值

第三:了解应用程序之间如何通信,消息如何交换以及潜在地控制此流量的方法具有很大的价值。 这一点与我们对3/4层网络的看法非常相似; 了解哪些TCP段和IP数据包正在穿越我们的网络,控制有关如何路由它们,允许什么的规则等,这很有价值。

4)最终是应用程序的责任

最后:正如我们从头到尾的论点所知道的那样,是应用程序本身负责其声称的业务逻辑的安全性和正确的语义实现–不管我们从底层基础结构(重试,事务,重复检测等)获得什么可靠性。我们的应用程序仍必须防范用户的愚蠢行为(两次下订单)–有助于实现这一目标的任何事情都是实施/优化细节。 不幸的是,这没有办法。

应用网络功能

我认为,无论您喜欢哪种服务体系结构(微服务,SOA,对象请求代理,客户端/服务器等),这些观点都是有效的–但是,在过去,我们模糊了关于优化属于何处的界限。 在我看来,有水平的应用程序网络功能是公平的游戏,可以优化我们的应用程序(并放入基础架构中,就像我们在较低级别的堆栈中所做的一样),还有其他一些与我们的业务更紧密相关不应轻易“优化”的逻辑

网络

让我们快速退后一步,了解我们的应用程序下面的网络是什么样的(非常琐碎和高级:)。 当我们从一项服务向另一项服务发送“消息”时,我们将其传递到操作系统的网络堆栈,然后该网络堆栈将弄清楚如何将其放入网络。 网络根据级别来处理传输单元 (帧,数据报,数据包)等。这些传输单元通常由一个结构组成,该结构包括一个“标头”和一个“有效载荷”,而“标头”包含有关该标头的足够元数据。我们可以做一些基本的事情,例如路由,确认跟踪/去重复等。

这些传输单元是通过网络中的不同点发送的,这些点决定是否允许该单元通过,是否将其路由到其他网络或将其传递给预期的接收者。 这些传输单元可以在路径上的任何位置被丢弃,复制,重新排序或延迟。 我们的操作系统的网络堆栈中存在TCP等更高级别的“可靠性”功能,可以跟踪重复,确认,超时,排序,丢失单元等情况,并可以重试故障,重新排序数据包等。

这些功能类型是由基础结构提供的,并且没有与业务逻辑混合使用-并且可以很好地扩展(Internet规模!)。我刚刚遇到了Phil Calcado的精彩博客,也对此做了很好的解释 。

应用

在应用程序级别,我们做类似的事情。 我们将与合作者服务的对话分成“消息”(请求,事件等)的传输单元 。 当我们通过网络拨打电话时,我们必须能够对应用程序消息执行超时,重试,确认,施加反压等操作。 这些是普遍的应用程序级问题,并且在我们构建服务风格的体系结构时总是会出现。 我们需要以某种方式解决它们。 我们需要一种实现应用程序网络功能的方法。

例如:过去,我们尝试使用消息传递代理解决这些问题。 我们有一套集中的,面向消息传递的中间件(甚至可能具有多协议支持,因此我们可以转换消息有效负载并“集成”客户端),这些中间件负责在客户端之间传递消息。 在我看到的许多示例中,该模式基本上是在消息传递系统上执行请求/答复(RPC)。

这默认地帮助解决了围绕应用程序网络功能的一些问题:诸如负载平衡,服务发现,背压,重试等之类的事情都委托给了消息传递代理。 由于所有流量都打算通过这些代理流动,因此我们有一个中心点可以从中观察和控制网络流量。 但是,正如@tef_ebooks在Twitter上指出的那样,这种方法相当繁琐 。 它也往往是体系结构中的一个大瓶颈,并且在交通控制,路由,策略执行等方面并没有我们想象的那么容易。

因此,我们也尝试这样做。 我们认为“好吧,让我们只添加路由,转换,策略控制”到我们已经拥有的集中式消息总线中。 实际上,这是自然发展的过程–我们可以使用消息传递主干来提供集中化/控制和应用程序网络功能,例如服务发现,负载平衡,重试等–但是,我们还将在更多事情上分层,例如协议中介,消息转换,消息路由,业务流程等。我们认为,如果我们可以将这些看似水平的东西推入基础架构,我们的应用程序可能会更轻/更薄/更敏捷等。这些担忧确实是ESB真正发展起来的,可以帮助解决这些问题。

正如我的同事Wolfram Richter指出的那样:“关于ESB概念,IBM 2005年关于SOA体系结构的白皮书( http://signallake.com/innovation/soaNov05.pdf第2.3.1章 )将ESB定义如下:”

The enterprise service bus (ESB) is a silent partner
in the SOA logical architecture. Its presence in the
architecture is transparent to the services of your
SOA application. However, the presence of an ESB is
fundamental to simplifying the task of invoking
services – making the use of services wherever they
are needed, independent of the details of locating
those services and transporting service requests
across the network to invoke those services wherever
they reside within your enterprise.

似乎是合法的! 甚至似乎是我们正在尝试的新兴技术中要做的一些事情。 你知道吗? 我们是!!! 过去的问题不仅已经神奇地消失了 ,而且背景和环境也发生了变化。 希望我们能够从过去的未兑现承诺中学习。

例如,在大型供应商所设想的SOA时代(通过委员会等编写了无休止的规范,对EAI进行了品牌重塑等),我们发现三件事促成了“ ESB”的未兑现承诺:

  • 组织结构(让我们再建一个筒仓!)
  • 技术很复杂(SOAP / WS-*,JBI,Canonical XML,专有格式等)
  • 需要业务逻辑来实现路由,转换,中介,编排等操作

最后一点是什么过分的事情。 我们希望敏捷,但是我们将重要的业务逻辑从我们的服务中分散到另一个团队拥有的集成层中。 现在,当我们想对我们的服务进行更改(敏捷)时,我们就可以了。 我们必须停止并与ESB团队进行重大同步(脆弱)。 随着这个团队和这个体系结构成为许多应用程序的中心,我们可以了解ESB团队是如何被请求(敏捷)所淹没,但却无法跟上(脆弱)的。 因此,尽管用意良好,但我们发现将核心应用程序网络功能与与业务逻辑相关性更高的功能混合在一起并不是一个好主意。 我们最终会出现膨胀和瓶颈。

随之而来的是REST革命和基于API的思维方式。 这一运动在某种程度上是对SOAP / ESB / SOA复杂性的抵制,再加上一种新的思考方式(通过API)将我们的数据内翻以激发新的业务模型并扩展现有模型。 我们还为我们的体系结构引入了新的基础架构:API管理网关。 该网关为我们提供了集中式控制方式,以通过安全ACL,访问配额和API使用计划,指标收集,计费,文档编制等来控制外部对我们业务API的访问。但是,就像我们在前面的示例中看到的消息代理一样,当我们进行某种集中式治理时,我们冒着想要用它完成太多事情的风险。 例如,当API调用通过我们的网关进行时,为什么不添加路由,转换和编排之类的内容呢? 问题在于,我们开始着手构建将基础架构级别的网络问题与业务逻辑相结合的ESB。 这是一个死胡同。

但是,即使在REST /非SOAP时代,我们仍然必须解决服务之间的上述问题(不仅仅是所谓的“南北”流量,我们还需要解决“东西向”流量)互动)。 更具挑战性的是,我们需要找出一种使用商品基础架构环境(又名云)的方法,这种环境会加剧这些问题。 传统的消息代理,ESB等不太适合此模型。 相反,我们最终在业务逻辑中编写了应用程序网络功能。 …我们开始看到诸如Netflix OSS堆栈 , Twitter Finagle甚至我们自己的Fuse Fabric之类的东西可以解决这些问题。 这些通常是旨在解决上述某些问题的库或框架,但是它们是特定于语言的,并与我们的业务逻辑(或我们遍布整个基础架构的业务逻辑)混合在一起。 该模型也存在问题。 这种方法需要在每种语言/框架/运行时上进行大量投资。 我们基本上必须跨语言/框架重复工作,并期望所有不同的实现都能高效,正确且一致地工作。

通过这些试验和磨难,我们可以将应用程序网络功能以最低的开销和高度分散的功能推入基础架构,并具有控制/配置/监视应用程序级请求的能力,从而解决了一些较早的问题。 我们一直称其为“服务网格”。 一个很好的例子是基于Envoy Proxy的istio.io项目。 这使我们在架构上将应用程序网络功能的关注点与侧重于区分业务逻辑的关注点分开:

正如Phil Calcado解释的那样 ,这与我们对TCP / IP网络层所做的非常相似。 网络功能被推出到操作系统中,并且不直接属于应用程序。

那么这与…有什么关系?

通过服务网格,我们将应用程序网络功能与应用程序代码,业务逻辑明确分离,并将其向下推入一层(进入基础结构),这与我们对网络堆栈,TCP等所做的操作类似)。

有问题的网络功能包括:

  • 简单的基于元数据的路由
  • 自适应/客户端负载平衡
  • 服务发现
  • 断路
  • 超时/重试/预算
  • 限速
  • 指标/记录/跟踪
  • 故障注入
  • A / B测试/流量调整/请求屏蔽

明确不包含的内容(更适合您的业务逻辑/应用程序/服务,而不是某些集中式基础结构):

  • 信息转换
  • 消息路由(基于内容的路由)
  • 服务编排

那么,服务网格与…有何不同?

ESB

  • 某些网络功能重叠
  • 分散的控制点
  • 特定于应用程序的策略
  • 不尝试处理业务逻辑问题(映射,转换,基于内容的路由等)

消息经纪人

  • 服务发现,负载平衡,重试,背压方面的重叠(从30,000英尺高度开始)
  • 分散的控制点
  • 特定于应用程序的策略
  • 对消息不承担任何责任

API管理

  • 在策略控制,速率限制,ACL,配额安全性的某些方面存在重叠
  • 不处理API的业务方面(定价,文档,用户到计划的映射等)
  • 相似之处在于它不执行业务逻辑

关于API管理,似乎确实有些重叠,但是我想将这些东西视为高度互补。 API管理提供有关API的高级语义(例如文档,用户注册/访问,生命周期管理,针对开发人员的API计划,用于计费和退款的计量等)。 调用API时,低级应用程序网络(如断路器,超时,重试等)至关重要,但它们非常适合服务网格层。 重叠点,例如ACL,速率限制,配额和策略实施等,可以由API管理层定义,但实际上由服务网格层实施。 这样,我们可以拥有完整的端到端策略和访问控制,并可以增强对北/南流量和东/西流量的弹性。 正如@ZackButcher (来自Istio团队) 在Twitter上指出的那样: “随着您的规模越来越大,从生产和管理服务的角度来看,东西向的流量开始越来越像南北向。”

汇集全部

点击查看完整图片

我们需要对我们的系统架构采用API优先的方法。 我们还必须解决诸如弹性之类的问题。 我们还发现我们面临整合挑战。 并且在许多方面,基于异步事件传递和事件处理作为API和微服务交互的底板的体系结构可以帮助提高可用性,弹性和降低脆弱性。 过去,解决这些问题一直是充满挑战的产品,因为竞争产品和解决方案重叠并混淆了关注点-当我们迁移到云架构时,很明显,我们需要梳理这些关注点并将它们放在我们架构的适当位置,否则我们将会屈从于一些相同的经验教训。

从上图中,我们可以看到以下几点:

  • 北向/南向交通的API管理
  • 服务网格(控制+数据平面),用于服务之间的应用程序网络功能
  • 用于东西方流量的Service Mesh强制API管理策略
  • 集成(业务流程,转换,反腐败层)作为应用程序的一部分
  • 事件驱动的消息背板可实现真正的异步/事件驱动的交互

如果我们不听前面提出的四个假设,那么我们将努力解决这些问题:

  • 第一点:服务通过网络进行交互–我们使用服务网格数据平面/服务代理
  • 第二点:交互是不平凡的–在服务本身中实现业务集成
  • 第三点:控制和可观察性–使用API​​管理+服务网格控制平面
  • 第四点:您的特定业务逻辑; 使用服务网格/消息传递/等进行优化

您真的可以分离出业务逻辑吗?

我想是的。 但是,会有模糊的线条。 在服务网格中,我们是说我们的应用程序应了解应用程序网络功能,但不应在应用程序代码中实现。 关于使应用程序更智能,应用程序网络功能/服务网格层到底在做什么,有很多话要说。 我想我们会在这种情况下看到库/框架。 例如,如果Istio服务网格引发断路器,重试某些请求或由于特定原因而失败,那么对于应用程序而言,可以更好地了解这些情况或上下文将是很好的。 我们需要一种方法来捕获此错误并将其传达回服务。 另一个示例是在服务之间传播跟踪上下文(类似于OpenTracing的分布式跟踪),并透明地完成此操作。 我们可能会看到这些专用于应用程序/语言的精简库,这些库可以使应用程序/服务更智能,并允许他们采用特定于错误的资源。

我们从这里去哪里

今天,该体系结构的各个部分处于不同的成熟度级别。 即使如此,对我们的服务体系结构采取有原则的方法也是关键。 将业务逻辑与应用程序网络分开。 使用服务网格来实现应用程序网络,使用API​​管理层来处理以更高阶的API为中心的问题,特定于业务的集成驻留在服务层中,并且我们可以通过事件驱动的背板构建数据密集型/可用系统。 我认为,随着我们的前进,我们将继续在特定的技术实现中看到这些原则的发展。 在红帽(我工作的地方),我们看到这样的技术3比例 , Istio.io上Kubernetes , Apache的骆驼和消息传递技术,如ActiveMQ的阿蒂米斯 / Apache的Qpid调度路由器 (包括非红帽的技术,如Apache的卡夫卡恕我直言)强积木建立遵循这些原则的服务架构。

翻译自: https://www.javacodegeeks.com/2017/08/application-network-functions-esbs-api-management-now-service-mesh.html

api网关和esb区别

api网关和esb区别_具有ESB,API管理和Now .. Service Mesh的应用程序网络功能。相关推荐

  1. 具有ESB,API管理和Now ..服务网格的应用程序网络功能。

    我最近谈论了微服务模式的演变,以及来自Lyft的Envoy之类的服务代理如何帮助将弹性,服务发现,路由,指标收集等责任推到应用程序下一层. 否则,我们冒着希望并祈祷各种应用程序将正确实现这些关键功能或 ...

  2. api存在csrf攻击吗_使用rest api防止单页应用上的csrf攻击

    api存在csrf攻击吗 tl;dr - If your SPA uses a private REST API, use CORS and a CSRF Token header. If your ...

  3. python api文档管理工具_开源的api文档管理系统

    在项目中,需要协同开发,所以会写许多API文档给其他同事,以前都是写一个简单的TXT文本或Word文档,口口相传,这种方式比较老土了,所以,需要有个api管理系统专门来管理这些api,从网上找了许多比 ...

  4. @bean注解和@component注解的区别_通过源码查看 @Component,@Service 等注解是如何被解析的...

    点击上方"匠心零度",选择"设为星标" 做积极的人,而不是积极废人 来源:my.oschina.net/floor/blog/4325651 前言 1.@Com ...

  5. API网关是否真的起到了它该有的作用?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 以下内容来源 https://www.jianshu.co ...

  6. 你正在用的API网关,真的起到了它该有的作用?

    来源 | https://urlify.cn/ZfyyIv 最近看到一篇翻译一篇API网关的文章,介绍了其三种角色:API管理.集群入口控制.API网关模式,最后还讲了与服务网格的关系,通过此文可以更 ...

  7. 通讯网关 api网关_API网关正在经历身份危机

    通讯网关 api网关 这些年来,API网关正在经历一些身份危机 . 它们是否是集中的共享资源,从而促进了API对外部实体的公开和治理? 它们是集群入口哨兵,可以严格控制哪些用户流量进入或离开集群吗? ...

  8. API网关正在经历身份危机

    这些年来,API网关正在经历一些身份危机 . 它们是否是集中的共享资源,以促进对外部实体的API公开和治理? 它们是集群入口哨兵,可以严格控制哪些用户流量进入或离开集群吗? 还是他们根据自己拥有的客户 ...

  9. CTO问我,为什么需要API网关?

    最近看到了一篇 API 网关的文章,介绍了其三种角色:API 管理.集群入口控制.API 网关模式,最后还讲了与服务网格的关系,通过此文可以更全面的理解 API 网关的作用. 图片来自 Pexels ...

最新文章

  1. 中国电子学会青少年编程能力等级测试图形化四级模拟题
  2. 实体识别+entity resolution
  3. 关于log4net使用中遇到的错误
  4. python3中文手册-Python3.4中文手册 chm版
  5. UVa307 - Sticks(DFS+剪枝)
  6. VS2017中运行第一个C#控制台应用并输出HelloWorld
  7. Java编程思想之-主板示例
  8. 双向a*搜索算法_双向搜索算法
  9. 判断一个字符串在另一个字符串中出现的次数
  10. 9203学生工具页-建议放桌面
  11. 【总结】大规模数据测试,数据准备时需要注意的问题(【保护已有数据】【大规模数据影响普通测试】【不要着急删除数据】)
  12. 深度学习高速路上,PaddlePaddle正在弯道超车
  13. 动态提交使用jQuery 完成ajax 文件下载----后端php
  14. k3c最新官改非常稳定了_2020国庆过后玉米价格最新行情走势
  15. 张家界和桂林的旅游纪实(避坑指南)
  16. 如何在ps中添加图片上的塑料布效果
  17. IPv6的思科培训启用SSH在Cisco IPv6路由器
  18. BeanDefinitionParsingException Configuration problem Unabl
  19. 小米手环6天空人天气表盘
  20. 渗透工具之CS4.0使用说明书

热门文章

  1. CF573E-Bear and Bowling【dp,平衡树】
  2. P5540-[BalkanOI2011]timeismoney|最小乘积生成树【最小生成树,凸壳】
  3. 牛客小白月赛18-记录
  4. 2021牛客暑期多校训练营7 J-xay loves Floyd(最短路+bitset优化集合交)
  5. 【交互】【随机】Lost Root(CF1061F)
  6. 2019.01.28【NOIP普及组】模拟赛C组总结
  7. HDU5874 - Friends and Enemies
  8. SpringCloud Ribbon(一)之自定义负载均衡器ILoadBalancer
  9. Jdk8一行代码读取文件
  10. Oracle入门(十四.18)之使用动态SQL