编排微服务

2024-03-03

编排微服务的标准模式是什么?

如果一个微服务只知道自己的领域,但有一个数据流需要多个服务以某种方式交互,那么该怎么做呢?

假设我们有这样的东西:

  • 开具发票
  • Shipment

为了便于论证,我们假设订单发货后,就应该创建发票。

在某个地方,有人按下了某个按钮GUI,“我已经完成了,我们开始吧!” 在经典的整体服务架构中,我想说有一个ESB处理这个,或者发货服务知道发票服务并且只是调用它。

但在这个美丽的微服务新世界中,人们如何处理这个问题呢?

我确实知道这可以被认为是高度基于意见的。但它有一个具体的方面,因为微服务不应该执行上述操作。 因此,必须有一个“根据定义它应该做什么”,这不是基于意见的。

Shoot.


这本书构建微服务 https://rads.stackoverflow.com/amzn/click/com/1491950358详细描述了@RogerAlsing 在他的回答中提到的样式。

在第 43 页的 Orchestration vs Choreography 下,该书说:

当我们开始建模越来越复杂的逻辑时,我们必须处理 管理跨越整个业务流程的问题 个人服务的边界。借助微服务,我们将实现 这个限制比平常要早。 [...]当谈到实际上 实现这个流程,我们可以使用两种风格的架构 跟随。通过编排,我们依靠中枢大脑来指导和 推动整个过程,就像管弦乐队中的指挥一样。和 编排,我们告知系统的每个部分其工作并让它 弄清楚细节,就像舞者都找到自己的方式一样 在芭蕾舞中对周围的人做出反应。

然后本书继续解释这两种风格。编排风格更符合SOA理念编排/任务服务 http://serviceorientation.com/soamethodology/task_services,而编舞风格对应于哑管道和智能端点 http://martinfowler.com/articles/microservices.html#SmartEndpointsAndDumbPipesMartin Fowler 的文章中提到过。

编曲风格

在这种风格下,上面的书提到:

让我们考虑一下编排解决方案是什么样的 这个流量。在这里,最简单的事情可能就是 我们的客户服务是我们的中枢。论创造,它会说话 忠诚度积分银行、电子邮件服务和邮政服务 [...], 通过一系列请求/响应调用。这 然后,客户服务本身可以跟踪客户在其中的位置 过程。它可以检查客户的帐户是否已设置 上,或发送的电子邮件,或传递的帖子。我们要采取 流程图 [...] 并将其直接建模为代码。我们甚至可以使用 为我们实现这一点的工具,也许使用适当的 规则引擎。为此目的而存在的商业工具的形式如下: 业务流程建模软件。假设我们使用同步 请求/响应,我们甚至可以知道每个阶段是否有效[...] 这种编排方法的缺点是客户 服务可能会成为一个过多的中央管理机构。它可以 成为网络中间的枢纽和逻辑的中心点 开始生活。我已经看到这种方法的结果是少数 智能“上帝”服务告诉缺乏活力的基于 CRUD 的服务该做什么。

注意:我想当作者提到工具时,他指的是类似的东西BPM http://en.wikipedia.org/wiki/Business_process_modeling (e.g. Activity http://activiti.org/, 阿帕奇常微分方程 http://ode.apache.org, Camunda http://camunda.com)。事实上,工作流程模式网站 http://workflowpatterns.com有一组很棒的模式来进行这种编排,它还提供了不同供应商工具的评估详细信息,有助于以这种方式实现它。我不认为作者暗示需要使用这些工具之一来实现这种集成方式,但可以使用其他轻量级编排框架,例如弹簧集成 https://projects.spring.io/spring-integration/, 阿帕奇骆驼 http://camel.apache.org or Mule ESB https://www.mulesoft.com/platform/soa/mule-esb-open-source-esb

然而,其他书籍 http://www.oreilly.com/programming/free/software-architecture-patterns.csp我读过有关微服务的主题,一般来说,我在网上找到的大多数文章似乎都是不赞成这种做法 https://www.thoughtworks.com/insights/blog/scaling-microservices-event-stream编排,并建议使用下一个。

编舞风格

在编舞风格下,作者说:

通过精心设计的方法,我们可以只让客户 服务以异步方式发出一个事件,表示 Customer 创建的。电子邮件服务、邮政服务和忠诚度积分银行 然后只需订阅这些事件并做出相应的反应 [...] 这种方法明显更加解耦。如果有一些 创建客户所需的其他服务,它只是 需要订阅事件并在需要时完成其工作。这 缺点是我们看到的业务流程的明确视图 [工作流程]现在仅隐式反映在我们的系统中[...] 这意味着需要额外的工作来确保您可以监控 并跟踪正确的事情已经发生。例如,你会 知道忠诚度积分银行是否有错误,但由于某种原因没有错误 设置正确的帐户?我喜欢处理这个问题的一种方法 是建立一个明确匹配视图的监控系统 [工作流程]中的业务流程,然后跟踪每个流程的内容 这些服务作为独立的实体,让你看到奇怪的东西 异常映射到更明确的流程。 [流程图] [...]不是驱动力,而只是一个镜头 我们可以看到系统的行为方式。一般来说,我发现 更倾向于精心设计的方法的系统更 松散耦合,并且更加灵活且易于更改。你做 需要做额外的工作来监控和跟踪整个系统的流程 然而,边界。我发现最精心策划的 实施极其脆弱,变更成本更高。 考虑到这一点,我强烈倾向于以精心设计的方式为目标 系统,其中每个服务都足够智能,可以理解其在 整个舞蹈。

注:直到今天我仍然不确定编舞是否只是舞蹈的另一个名称事件驱动架构 http://radar.oreilly.com/2015/02/variations-in-event-driven-architecture.html(EDA),但如果 EDA 只是一种方法,那么其他方法是什么? (另请参阅“事件驱动”是什么意思? https://martinfowler.com/articles/201701-event-driven.html and 事件驱动架构的含义 https://www.youtube.com/watch?v=STKCRSUsyP0)。另外,像 CQRS 和 EventSourcing 这样的东西似乎与这种架构风格产生了很大的共鸣,对吗?

现在,这之后就是乐趣了。 《微服务》一书并不假设微服务将通过 REST 来实现。事实上,在本书的下一部分中,他们将继续考虑基于 RPC 和 SOA 的解决方案,最后考虑 REST。这里重要的一点是微服务并不意味着 REST。

那么,HATEOAS 怎么样? (超媒体作为应用程序状态的引擎)

现在,如果我们想遵循 RESTful 方法,我们就不能忽视 HATEOAS,否则 Roy Fielding 会非常高兴地在他的博客中说,我们的解决方案并不是真正的 REST。请参阅他的博客文章REST API 必须是超文本驱动的 http://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven:

我对调用任何基于 HTTP 的服务的人数感到沮丧 接口 REST API。需要做什么才能进行 REST 架构风格清楚地表明超文本是一种 约束?换句话说,如果应用程序状态引擎(并且 因此API)不是由超文本驱动的,那么它不能 RESTful 并且不能是 REST API。时期。有没有破损的说明书 有什么地方需要修复吗?

因此,正如您所看到的,Fielding 认为如果没有 HATEOAS,您就无法真正构建 RESTful 应用程序。对于 Fielding 来说,HATEOAS 是编排服务的最佳选择。我刚刚了解这一切,但对我来说,HATEOAS 并没有明确定义实际跟踪链接背后的驱动力是谁或什么。在可能是用户的 UI 中,但在计算机到计算机的交互中,我认为这需要由更高级别的服务来完成。

根据 HATEOAS 的说法,API 使用者真正需要知道的唯一链接是发起与服务器通信的链接(例如 POST /order)。从此时起,REST 将执行流程,因为在该端点的响应中,返回的资源将包含指向下一个可能状态的链接。然后,API 使用者决定遵循哪个链接并将应用程序移至下一个状态。

尽管听起来很酷,但客户端仍然需要知道链接是否必须进行 POST、PUT、GET、PATCH 等操作。并且客户端仍然需要决定要传递哪些有效负载。客户端仍然需要知道如果失败该怎么办(重试、补偿、取消等)。

我对这一切还很陌生,但对我来说,从 HATEOA 的角度来看,这个客户端或 API 消费者是一个高阶服务。如果我们从人类的角度思考,您可以想象网页上的最终用户决定要遵循哪些链接,但是网页的程序员仍然必须决定使用什么方法来调用链接,以及要传递的有效负载。因此,就我而言,在计算机到计算机的交互中,计算机扮演最终用户的角色。这又是我们所说的编排服务。

我想我们可以将 HATEOAS 与编排或编排一起使用。

API网关模式

克里斯·理查森 (Chris Richardson) 提出了另一种有趣的模式,他也提出了他所谓的“API网关模式 http://www.infoq.com/articles/microservices-intro.

在整体架构中,应用程序的客户端(例如 Web 浏览器和本机应用程序,通过负载发出 HTTP 请求 平衡器到应用程序的 N 个相同实例之一。但在一个 微服务架构,单体已被替换 服务的集合。因此,我们需要回答一个关键问题 客户与什么互动?

应用程序客户端(例如本机移动应用程序)可以使 对各个服务的 RESTful HTTP 请求 [...] 表面上 这可能看起来很有吸引力。然而,很可能有一个 各个 API 之间的粒度存在显着不匹配 客户所需的服务和数据。例如,显示一个 网页可能需要调用大量服务。 以亚马逊网站为例,描述 http://highscalability.com/amazon-architecture多少 页面需要调用 100 多个服务。提出那么多要求,甚至 通过高速互联网连接,更不用说较低的带宽, 较高延迟的移动网络,效率会非常低,并导致 用户体验不佳。

更好的方法是让客户制作少量的 每页的请求,也许只有一个,通过互联网发送到 称为 API 网关的前端服务器。

API网关位于应用程序的客户端和 微服务。它提供为客户量身定制的 API。这 API网关为移动客户端提供粗粒度的API 为使用高性能的桌面客户端提供更细粒度的 API 网络。在此示例中,桌面客户端发出多个请求 检索有关产品的信息,而移动客户端 发出单个请求。

API网关通过向某些设备发出请求来处理传入请求 高性能 LAN 上的微服务数量。 Netflix,为 例子,描述 http://techblog.netflix.com/2013/01/optimizing-netflix-api.html每个请求如何平均分发到六个后端服务。在这个 例如,来自桌面客户端的细粒度请求很简单 代理到相应的服务,而每个粗粒度 来自移动客户端的请求通过聚合结果来处理 调用多个服务。

API网关不仅优化了客户端之间的通信 和应用程序,但它也封装了细节 微服务。这使得微服务能够在无需 影响客户。例如,两个微服务可能是 合并了。另一个微服务可能被划分为两个或多个 服务。只需更新 API 网关即可反映这些 变化。客户不受影响。

现在我们已经了解了 API 网关如何在 应用程序及其客户端,现在让我们看看如何实现 微服务之间的通信。

这听起来与上面提到的编排风格非常相似,只是意图略有不同,在这种情况下,它似乎都是关于性能和交互的简化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编排微服务 的相关文章

随机推荐

  • SVG 1.1:什么是“用户单位”以及如何将用户单位转换为绝对单位(例如:毫米)?

    我正在实现 SVG Tiny 1 1 但我无法理解 用户单元 的概念 SVG 1 1 规范将每个没有指定单位 例如 mm cm pt 等 的 定义为 用户单位 在实现 SVGLength 接口时 我遇到了4个与长度值相关的属性 value
  • 使用 GeoPandas 将点几何图形转换为线串

    我有一个地理数据框gdf看起来像这样 longitude latitude geometry 8628 4 890683 52 372383 POINT 4 89068 52 37238 8629 4 890500 52 371433 PO
  • 包从flutter智能手表接收心率数据

    我正在寻找一款可以让我轻松地在三星手表或苹果手表等智能手表之间同步的包 我想从他们那里获取心率数据 有人知道这样一个与手表通信的包或想法吗 目前 所有的wear tizen和watch操作系统都有不同的机制来本地获取这些数据 所有这些都需要
  • .NET 会话不工作

    这是一个奇怪的问题 但希望有人能给我一个想法 我将一些值放入会话中Session Start of the Global asax在我的应用程序中 紧接着Session Start我的基本页OnInit接到电话并尝试使用其中之一Sessio
  • jQuery Datepicker BeforeShowDay 第二个参数

    jQuery datepicker 允许您使用 BeforeShowDay 回调突出显示日期 是否可以向该方法传递第二个参数 selector datepicker beforeShowDay selectedDay function se
  • Rails 3:如何根据Controller的方法创建命名范围?

    In my ApplicationController我有demo mode 方法 返回true当当前登录的用户类型为 demo 时 Post模型有publisher id字段 它指的是Users table User有user type字
  • 对象 # 没有方法“done”

    我试图实现简单的ajax GET 请求 在回调部分我想调用一些函数 代码如下 ajax url ajax pages ajx getcard php id obj value context document body done funct
  • 启动 Rails 服务器 Sidekiq 时出错

    当我尝试启动我的服务器时 rails s 给我以下错误 管理员 rvm gems ruby 1 9 3 p392 gems bundler 1 11 2 lib bundler runtime rb 81 in rescue in bloc
  • java中私有变量的序列化

    我有一个关于序列化的问题 如果我的类有私有变量并且没有 getter 和 setter 那么序列化 API 将如何读取这些变量的值 首先 访问权限是编译时功能 访问在运行时不受控制 这可能会让您感到困惑 但请尝试执行以下操作 创建 A 类的
  • 制作等长向量的列表

    在一个关于SO的问题中 LINK https stackoverflow com questions 10661295 apply a function over groups of columns 一个海报问了一个问题 我给出了一个有效的
  • jQuery .toggle() 显示和隐藏子菜单

    我正在使用这个问题的代码来进行显示 隐藏切换 jQuery toggle 显示和隐藏子菜单 https stackoverflow com questions 9469807 jquery toggle to show and hide a
  • OSX 惯性滚动导致 mousewheel.js 通过最轻微的滚动运动注册多个鼠标滚轮事件

    我正在开发一个非常标准的 Flexslider 实例 柔性滑块 http flexslider woothemes com 与jquery mousewheel js https github com brandonaaron jquery
  • 使用 subversion 将更改提交到与当前签出分支不同的分支

    我一直在处理从开发线检出的代码 发现所做的更改可能是破坏性更改 需要在提交到主开发树之前移动到实验分支 但是 我没有签出实验分支 并且我不想丢失已经进行的更改 有没有办法将工作文件夹中的更改提交到与最初签出的分支不同的分支 您应该从已知的分
  • Three.js中是否有一个容器类型对象来转换一组孩子?

    Three js 中是否有一个容器或节点对象 可以将多个网格添加为子对象 以便它们可以一起转换 一个不可见的容器 允许对组中的所有子对象执行转换 thanks Example http mrdoob github com three js
  • 在单个查询中将行插入到多个表中,从涉及的表中进行选择

    我有两个以下形式的表 即 每个 foo 都链接到一个栏 CREATE TABLE foo id INTEGER PRIMARY KEY x INTEGER NOT NULL y INTEGER NOT NULL bar id INTEGER
  • 如何用下划线模板显示JS对象?

    我想使用下划线模板显示 JS 数据对象 我似乎无法弄清楚如何钻取对象以获取国家 地区名称或其他日期 例如 tarrifType 并使用我的模板显示它 该物体看起来像这样 var items country China tarrifType
  • 如何在 AngularJS 中使用 Web Worker?

    我在用着AngularJS 种子 https github com angular angular seed我想看看 Web Worker 的有效实现 我想让一个简单的 Web Worker 工作以便理解它 但我遇到了功能问题 我的 Web
  • 如何以编程方式从后台恢复 Android Activity

    情况 假设我当前正在启动应用程序 Activity A 一段时间后 我按下 主页 按钮 应用程序 A 进入后台 此时 我开始使用另一个应用程序 B 例如 youtube 等 当前最小化到后台的应用程序 A 中发生了一些事情 在这种情况下发生
  • 如何在 Google 搜索 iframe 上设置自定义宽度?

    我正在尝试使用谷歌搜索我的网站 http www houseofhawkins com search php http www houseofhawkins com search php 它在某些屏幕分辨率下表现不佳 这是谷歌给出的代码 d
  • 编排微服务

    编排微服务的标准模式是什么 如果一个微服务只知道自己的领域 但有一个数据流需要多个服务以某种方式交互 那么该怎么做呢 假设我们有这样的东西 开具发票 Shipment 为了便于论证 我们假设订单发货后 就应该创建发票 在某个地方 有人按下了