【编者按】服务编排是微服务设置的一个重要方面。本文在利用 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 工程师编译整理。OneAPM 能为您提供端到端的 Java 应用性能解决方案,我们支持所有常见的 Java 框架及应用服务器,助您快速发现系统瓶颈,定位异常根本原因。分钟级部署,即刻体验,Java 监控从来没有如此简单。想阅读更多技术文章,请访问 OneAPM 官方技术博客

本文转自 OneAPM 官方博客

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

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

  1. 微服务应用新趋势:Service Mesh、AIOps和中台化

    微服务技术由于天生支持快速迭代.弹性扩展的特点,使企业能够在不确定性下提升发展速度及抗风险能力,受到了越来越多的关注.当前,云服务商纷纷试水微服务产品,最为典型的,当属推出轻舟微服务平台.剑指整个微服 ...

  2. Chris Richardson微服务翻译:微服务介绍

    作者简介:Chris Richardson,世界著名的软件架构师,经典著作<POJOS IN ACTION>的作者,cloudfoundry.com 的创始人 微服务目前正受到大量的关注, ...

  3. 基于 Docker 的微服务架构实践

    本文来自作者 未闻 在 GitChat 分享的{基于 Docker 的微服务架构实践} 前言 基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 D ...

  4. 微服务、SOA 和 API:是敌是友?

    为一个正在不断发展的企业对比关键的集成与应用程序架构概念 对比微服务架构和面向服务的架构(SOA)是一个敏感的话题,常常引起激烈的争论.本文将介绍这些争论的起源,并分析如何以最佳方式解决它们.然后进一 ...

  5. 【转】「Chris Richardson 微服务系列」微服务架构的优势与不足

    Posted on 2016年5月4日 编者的话|本文来自 Nginx 官方博客,是微服务系列文章的第一篇,主要探讨了传统的单体式应用的不足,以及微服务架构的优势与挑战. 作者介绍:Chris Ric ...

  6. 微服务网关哪家强?一文看懂Zuul, Nginx, Spring Cloud, Linkerd性能差异

      导语:API Gateway是实现微服务重要的组件之一.面对诸多的开源API Gateway,如何进行选择也是架构师需要关注的焦点.本文作者对几个较大的开源API Gateway进行了压力测试,对 ...

  7. Apache ServiceComb 开源两周年,聊聊其与微服务的前世今生

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  8. 微服务架构 技能图谱skill-map

    # 微服务架构 技能图谱 ## 理论基础### 概念#### 多微合适 - 非代码函数 - 非重写时间 - 适合团队最重要 - 独立业务属性 - 全功能团队 #### 进程隔离 - 服务运行在独立的进 ...

  9. 与IBM的Lin Sun关于Istio 1.0和微服务的问答

    北京时间 7 月 31 日,Istio 正式发布了 1.0 版本,并表示已经可用于生产环境.该版本的主要新特性包括跨集群 mesh 支持.细粒度流量控制以及在一个 mesh 中增量推出 mutual ...

随机推荐

  1. Kubernetes 服务入口管理与 Nginx Ingress Controller

    Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...

  2. jvm详情——2、Java对象在jvm中的大小

    Java对象的大小 基本数据的类型的大小是固定的,这里就不多说了.对于非基本类型的Java对象,其大小就值得商榷.在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任 ...

  3. kubelet集群网络配置flannel(覆盖网络)

    kubernetes本身并不会对跨主机容器的网络进行设置,这需要额外的工具来实现.一些常用的开源工具主要包括flanne.OpenvSwitch.Weave.Calico等,这里面最常用的是flann ...

  4. 你可能没听过的11个Python库

    目前,网上已有成千上万个Python包,但几乎没有人能够全部知道它们.单单 PyPi上就有超过47000个包列表. 现在,越来越多的数据科学家开始使用Python,虽然他们从 pandas, scik ...

  5. 痞子衡嵌入式:SEGGER J-Link仿真器硬件版本变迁

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link仿真器版本变迁. 硬件版本 主控芯片 固件升级工具 V7 ARM7TDMI, 55MHz Atmel AT91SAM7S64 ...

  6. linux的文档和目录结构

    在Linux底下,所有的文件与目录都是由根目录开始,是目录与文件的源头,然后一个个的分支下来,如同树枝状,因此称为这种目录配置为:目录树. 目录树的特点是什么呢? 目录树的起始点是根目录(/,root ...

  7. .NET使用ServerManager获取网站物理路径

    最近因为工作需要,用wpf做了一个辅助小工具,如下图 为了获取网站的物理路径,我分析了通过ServerManager获取到的变量,也通过百度搜索了很多,但仍然没有找到方法. 后来使用必应,在国外网站找 ...

  8. Thread类(线程)

    操作系统通过线程对程序的执行进行管理,当操作系统运行一个程序的时候,首先,操作系统将为这个准备运行的程序分配一个进程,以管理这个程序所需要的各种资源.在这些资源之中,会包含一个称为主线程的线程数据结构 ...

  9. sql-索引的作用(超详细)

    (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonc ...

  10. springMVC_05结果跳转方式

    一.总结 总共有四个, 1.设置ModelAndView的值,根据view和视图解析器跳转到指定的页面 2.通过servletapi对象来实现,不需要视图解析器 3.通过springmvc来实现转发和 ...