微服务扩展新途径:Messaging

【编者按】服务编排是微服务设置的一个重要方面。本文在利用 ActiveMQ 虚拟话题来实现这一目标的同时,还会提供实用性指导。文章系国内 ITOM 管理平台 OneAPM 编译呈现。

目前,微服务使用已十分普遍,利用服务编排(而不是服务编制)来进行微服务互动的想法也很常见。本文将讲述如何通过 ActiveMQ 虚拟话题来设置服务编排和基于服务互动的可扩展事件。

服务互动类型

服务互动类型主要有两种:同步和异步。

在同步互动中,服务使用者会发出请求,然后在操作完成、收取回复前阻止其他活动运行,HTTP 协议就是一个很好的同步互动例子。通常情况下,这种互动与请求-回复互动类型、 HTTP 协议都是相关的(当然,也可以利用异步请求或消息传递来登记、请求回调函数的结果,不过这种做法不太常见)。

在异步互动中,服务使用者发出的请求不用在操作完成后才可以运行。一旦请求确认被收到,服务使用者就可以接着做其他的活动。这种类型支持互动沟通采用发布-订阅模式,例如:不需要服务使用者调用其他服务操作,只需要生产者提出事件,等待感兴趣的使用者做出反应即可。

除了这些技术层面的考虑,还应该注意考量服务互动的其他层面:耦合和责任。

如果服务 A 要和服务 B 互动,是要服务 A 来调用服务 B(编制),还是让服务 B 去订阅正确的时间(编排)呢?

在服务编制中需要有一个中心实体(即例子中的服务 A),去了解被调用的其他服务。利用编排方法,可以将这个责任分配给个体服务,由它们来负责订阅“有意思的”事件。

如果想要了解更多关于本话题的内容,请查阅 Building Microservices。接下来,本文将集中讨论如何使用消息传递实现服务编排。

通过消息传递进行服务编制

服务编制是通过队列实现消息传递的。队列能够在竞争使用者模式下实现负载均衡,并且确保消息和使用者一一对应。

假设存在一个与“邮件服务”互动的“客服服务”,最简单的实现方法就是使用一个允许“客户服务”给“邮件队列”发送消息的队列。如果“客户服务”需要跟“忠诚值服务”互动,“客户服务”就要给“忠诚值服务”再发一条消息。这种办法下,“客户服务”需要了解“邮件服务”和“忠诚值服务”这两者,并且把正确的消息发给对应的队列。简而言之,整个互动过程都是由“客户服务”编制的。

使用队列的一个好处就是它可以轻松扩展使用者,并开启多个“忠诚值服务”和“邮件服务”,从而将负载均衡地分布于不同的使用者间。

通过消息传递进行服务编排

使用服务编排方式时,“客户服务”却不需要了解“忠诚值服务”和“邮件服务”。因为“客户服务”只要对“客户话题”发出一个事件,“忠诚值服务”和“邮件服务”就会去了解客户事件协议,并订阅正确的话题——话题的发布-订阅语意会确保每个事件同时被分发给两个订阅者。

扩展服务编排

话题执行发布-订阅,而不是竞争使用,这使得使用者的扩展变得更加困难。如果(横向)扩展“忠诚值服务”并在两个实例中进行试验,可以发现它们会收到同样的事件,这样扩展的话并没有什么益处(除非服务是等幂的)。

ActiveMQ 虚拟话题解决方案

因此需要一种融合了话题和队列的综合形式,充分发挥这两个功能:既能够利用“客户服务”的发布-订阅来发布事件,确保所有服务都能收到该事件;也可以通过竞争的使用者,使个体服务实例实现负载均衡并进行扩展。

实现该形式的方法有很多,可以利用 Camel 和 ActiveMQ :

  • 第一个方法就是用一个简单的 Camel 路由来吸收“客户话题”事件,并把它们同时发送给“忠诚值队列”和“邮件队列”。这是很容易实现的,不过每当有新服务对“客户服务”事件感兴趣时都需要重新更新 Camel 路由。而且,如果在代理之外单独运行 Camel 路由,把消息从某一话题转入到其事先设定好的队列中去,就会带来不必要的网络开销。
  • 上述方法的一个改进方案,就是在 ActiveMQ 代理流程中使用 ActiveMQ Camel plugin 来运行 Camel 路由。这样的话,虽然仍需要在订阅者发生变更时更新 Camel 路由,但是路由是在代理过程中发生的,因此不会产生网络开销。
  • 不过还有更好的方案,就是将订阅该话题的队列 W/O 全部进行编码,但是要借用 ActiveMQ 虚拟话题的声明法(这也是撰写本文的主要原因)。

ActiveMQ 虚拟话题是将订阅队列发布到话题中的方法,通过一个简单的命名惯例——所要做的就是确定话题或队列的命名惯例,无论是自定义的还是默认的都可以。

举个例子:

  • 可以先创建一个与 VirtualTopic.> 表达式相匹配的话题名,如 VirtualTopic.CustomerTopic,
  • 然后让“忠诚度服务”调用 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列,
  • 那么消息代理就会将 VirtualTopic.CustomerTopic 话题中的所有事件都转发给
    Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列。
  • 然后可以通过开启多个服务实例来扩展忠诚度服务,所有实例都从 Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic 队列中调用。
  • 同样的,之后再用同样的命名惯例为邮件服务创建队列:Consumer.Email.VirtualTopic.CustomerTopic,这个功能允许用户以特定方式来简单命名话题和队列,并且无需编码就能订阅。

结论

以上所述只是最近出版的著作 Camel Design Patterns 里介绍的多种模式之一。正因为经常将Camel 与 ActiveMQ 一起使用,书中也就收录了一些 ActiveMQ 模式内容。

另外,用编排扩展微服务还可以通过事件驱动来实现,这里就是一篇介绍这种方法的推荐文章。

本文转自 OneAPM 官方博客

原文地址:https://dzone.com/articles/scalable-microservices-through-messaging

时间: 2024-11-01 23:17:30

微服务扩展新途径:Messaging的相关文章

深度剖析微服务架构的九大特征

微服务架构这个术语在过去几年渐成热门,它把一种特定的软件应用的设计方法描述为能够独立部署的服务的套件.尽管缺乏对这一架构类型的准确定义,但是在业务能力.自动化部署.智能端点.语言和数据的去中心化控制等方面,已经形成了某些普遍特征. 微服务,另一个在软件架构领域津津乐道的新词.尽管我们本能上倾向于对它不屑一顾,然而这一专业术语描述了一种目前越来越吸引人的软件系统的风格.我们已经看到近年来有许多项目使用了此类型,结果很鼓舞人心;因而对于我的诸多同事来说,这也就成为他们构建企业级应用时候的首选.然而,

云计算中几个强大的微服务用例

随着开发团队转向采用微服务,最佳使用案例有助于提供参考,因此可以了解一些主要厂商的微服务用例. 大多数企业开发团队将不再使用云托管的微服务.因为大多数可能会出现问题,而早期的使用者会放弃甚至拒绝使用微服务.最好的微服务用例分为四类,每个企业都应该联系一个或多个早期微服务采用者,让他们提出一些建议. 微服务用例 第一个用例是使用微服务来促进云采用.大多数开发团队认识到,最佳的使用公共云和混合云的应用程序架构是不同的.很少有人准备说明这些差异,以及如何实现有序的部署,安全和合规的运作以及全面的托管效

使用Istio服务网格管理微服务

[编者的话]今天的帖子由Istio团队展示如何为Kubernetes的微服务提供可视化,弹性,安全和控制功能. 本文讲的是使用Istio服务网格管理微服务服务化是现代软件架构的核心.部署一系列模块化的小型服务而非庞大的单体应用,可以给开发者更大的灵活性.开发者对不同模块可以使用不同的技术,不同的语言采用不同的版本,以实现更高的效率和速度,这一点对大型开发尤为重要. 采用微服务,新问题也随之而来.因为大型系统中会包含大量微服务.独立应用需要面对的问题,例如安全,负载均衡,监控,请求频率限定等在每个

混合云/多云环境如何部署微服务

微服务能够为混合云或多云部署带来大量的好处,但是它们也能够带来与网络.安全性等相关的新挑战. 大多数IT企业已经开始认识到在开发和部署中实施软件组件化的好处.在云中,组件化带来了重要的优势,例如增加弹性和支持横向扩展. 微服务(即通常在应用程序中共享的小型功能组件)能够显著地放大这些优势.但是,首先用户必须正确地规划.开发和部署微服务. 了解如何让微服务起作用 如需开始规划微服务,IT团队需要了解微服务与以服务为导向架构中应用程序组件或元素的不同之处.微服务不是完整的应用组件:它们是在应用中作为

微服务的隐性红利:你不知道的8个好处

本文讲的是微服务的隐性红利:你不知道的8个好处[编者的话]微服务未必适用于所有公司,实施过程也并非易事.之前大家讨论是否采用微服务时的重点主要在于它的自主性.敏捷性.弹性和开发者的生产能力.但这并不是微服务的所有优点,本文中提到的这些额外的好处也是值得利用的. 微服务未必适用于所有公司,实施也并非易事. 作为构建分布式系统的一种方式,微服务可以做到只用hardened API提供服务.围绕特定.有界的上下文或责任范围,这些服务具有高内聚低耦合的特点.这些服务通常很简单,但却可以构成非常丰富和复杂

保护微服务架构的10个有效方式

微服务是一种创新的方式来加速和改进软件开发.该术语是指可以单独开发的应用程序子组件,并且通常专注于一个特定功能.例如,用于在线购物的电子商务应用需要具备订单收集.账户访问.库存管理和运输的几个微服务.很多知名的电子商务或社交媒体组织,如Twitter.PayPal.亚马逊.eBay和Netflix都依赖于微服务. 微服务与容器类似,但不完全相同.我们将微服务看做分子,容器看做原子:微服务可以在容器中运行,反之亦然.微服务经由应用程序编程接口(API)实现通信,作为应用程序的整个生态系统或架构的一

Hadoop生态系统中的容器和微服务 玩出哪些新花样?

最近大多数大数据应用都部署在裸设备上,这意味着Hadoop大多数部署在非虚拟化服务器上.随着容器和微服务对应用开发圈产生影响,这种情况在发生改变. 容器和微服务都把整个应用程序的代码细分成更小粒度的片段.这样不仅简化了开发,而且更容易测试,这也是设计更灵活应用程序部署方案和代码复用的关键. 早期的时候,这种技术就应用于大数据领域,但是现在看起来在数据流处理.微服务这类领域应用也很有前途.欧洲某顶级电子商务公司的一位技术经理认为,微服务方法简化了开发工作,增强了代码复用能力. Otto GmbH公

无服务器的微服务

在 2015年的LinuxCon/ContainerCon 上我呈现了一次演示驱动的演讲,标题叫做"没有服务器的微型服务". 其中,我创建了一个图片处理的微型服务,将其部署到了多个区域,构建了一个移动 app 并使用它(译者注:指的是这个微型服务)作为后台,添加了一个使用了 Amazon API 网关的基于 HTTP 的 API 和一个网站,并且对它进行了单元和负载测试,所有这些都没有用到任何服务器. 这篇博文对演讲的细节进行了重制,为你逐步完成所有必要的比周,并深入到了架构中去.而高

微服务与SOA架构

本文讲的是微服务与SOA架构[编者的话]本文是Mark Richards写的微服务与面向服务架构完整报告. 基于服务架构的世界 微服务和SOA都被认为是基于服务的架构,这意味着这两种架构模式都非常强调将"服务"作为其架构中的首要组件,用于实现各种功能(包括业务层面和非业务层面).微服务和SOA是两种差异很大的架构模式,但是他们仍有一些相同的特征. 所有基于服务的架构的一个共性是他们一般都是分布式架构,也就是服务组件都是通过远程访问协议来实现的,例如REST.SOAP.AMQP.JMS.