【编者按】服务编排是微服务设置的一个重要方面。本文在利用 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. stack源码

    stack概述 stack是一种先进后出的数据结构,它只有一个出口,允许新增元素.移除元素.取得最顶端元素,但每次只能处理顶端元素,也就是说,stack不允许遍历行为. stack定义 以某种既有容器 ...

  2. CentOS7.0小随笔——指令基本操作(Part.A)

    与其说是CentOS7.0的小随笔,说老实话,基本指令在每个发行版本的Linux中都基本上是一致的. Part.A部分我们讲述以下四个方面:命令行界面与图形界面.Linux系统的关闭与重启.命令行帮助 ...

  3. 2012-2014 三年浙江 acm 省赛 题目 分类

    The 9th Zhejiang Provincial Collegiate Programming Contest A    Taxi Fare    25.57% (166/649)     (水 ...

  4. 项目ITP(七) javaWeb 整合 Quartz 实现动态调度 并且 持久化

    原创地址:http://www.cnblogs.com/Alandre/(泥沙砖瓦浆木匠),需要转载的,保留下! 弟子规 圣人训 首孝弟 次谨信 泛爱众 而亲仁 有余力 则学文 Written In ...

  5. 第9条:try-with-resources优于try-finally

    try-finally例子 打开文件读取第一行 static String firstLineOffFile(String path) throws IOException { BufferedRea ...

  6. IDEA的几个常用配置,日常开发必备。

    用了IDEA有很长时间了,身边的同事朋友也都慢慢的开始都从Eclipse切换到IDEA了,其实无论是Eclipse还是IntelliJ IDEA都是开发工具而已,各自都有优点.但是刚从Eclipse切 ...

  7. [CF960G] Bandit Blues

    题意 给你三个正整数 \(n,a,b\),定义 \(A\) 为一个排列中是前缀最大值的数的个数,定义 \(B\) 为一个排列中是后缀最大值的数的个数,求长度为 \(n\) 的排列中满足 \(A = a ...

  8. Linux录制、回放和共享终端操作

    另一篇终端会话共享的文章:Linux终端会话实时共享(kibitz) 使用script命令录制,使用scriptreplay播放录制的操作.共享终端的操作,则需要使用命名管道来实现. 1.1 录制 [ ...

  9. c#中的特性Attribute

    一:特性是什么?特性怎么创建怎么使用? 这一章节,我想谈谈c#的特性方面的知识,特性大家在工作开发中都很熟悉,比如我们经常见到的 1:key Display --EF 2:Import 3:HttpG ...

  10. Idea 常用功能汇总,工作中常用技巧,移出请说明原因,笔记花了好长时间汇总的

    1.隐藏没用到的文件 比如 IDEA 的项目配置文件(.iml 和.idea),打开 Settings-File Types, 加入要隐藏的文件后缀.  2.常用技巧 2.1 通过Alt+F8查看变量 ...