微服务 传递参数_通过消息传递可扩展的微服务

微服务 传递参数

如今,微服务无处不在,使用服务编排(而不是服务编排)进行微服务交互的想法也是如此。 在本文中,我描述了如何使用ActiveMQ虚拟主题来设置服务编排,它还支持基于事件的可伸缩服务交互。

服务交互样式

服务交互主要有两种类型: 同步异步

通过同步交互,服务使用者发出请求并阻塞,直到操作完成并接收到响应为止。 HTTP协议是同步交互的一个很好的例子。 这种类型的交互通常与请求/响应交互样式和HTTP协议相关联。 (当然,也可以通过为结果注册回调来对异步请求或事件消息进行请求/响应,但这是一种不太常见的用例)。

使用异步交互样式,服务使用者发出请求,但不等待操作完成。 一旦确认收到请求,服务使用者便会继续前进。 这种类型的交互允许发布/订阅服务通信的样式-例如,生产者引发事件并期望感兴趣的消费者做出React,而不是服务消费者从另一服务中调用操作。

除了这些技术考虑因素之外,服务交互还需要考虑另一个方面:耦合和责任。

如果服务A必须与服务B交互,则服务A负责调用服务B( 编排 )还是服务B负责订阅正确事件( 编排 )的责任?

通过服务编排,存在一个中心实体(在我们的案例中为服务A本身),该实体具有要调用的其他服务的知识。 通过编排方法,此职责被委派给各个服务,并且它们负责订阅“有趣的”事件。

要了解有关此主题的更多信息,请阅读出色的Building Microservices 书籍中的第4章。 在本文的其余部分,我们将重点介绍使用消息传递进行服务编排。

通过消息进行服务编排

消息传递中的服务编排是通过队列实现的。 队列使用竞争的使用者模式实现负载均衡器语义,并确保消息只有一个使用者。

假设有一个“客户服务”必须与“电子邮件服务”交互。 实现此目的最简单的方法是使用队列,然后让“客户服务”将消息发送到“电子邮件队列”。 如果“客户服务”必须与“忠诚度积分服务”进行交互,则“客户服务”必须再次发送一条消息-这次是“忠诚度积分队列”。 通过这种方法,“客户服务”有责任了解“忠诚度积分服务”和“电子邮件服务”,然后将正确的消息发送到相应的队列。 简而言之,整个互动是由“客户服务”精心安排的。

使用队列的优点之一是,它可以轻松扩展使用者。 我们可以启动“忠诚度积分服务”和“电子邮件服务”的多个实例,并且队列将在使用者之间进行负载平衡。

点对点

通过消息传递服务编排

使用服务编排方法,“客户服务”对“忠诚度积分服务”或“电子邮件服务”一无所知。 “客户服务”只是向“客户主题”发出一个事件,“忠诚度积分服务”和“电子邮件服务”的责任是了解客户事件合同并订阅正确的主题-的发布/订阅语义这些主题将确保每个事件都分发给两个订户。

发布订阅

扩展服务编排

由于主题实现发布/订阅语义而不是竞争消费者,因此扩展消费者变得更加困难。 如果我们(水平)扩展“忠诚度积分服务”并启动两个实例,则该服务的两个实例都将收到相同的事件,并且在扩展方面不会有任何好处(除非服务是幂等的)。

缩放发布订阅

ActiveMQ救援虚拟主题

因此,我们需要在主题和队列语义之间进行某种混合。 我们希望“客户服务”使用发布/预订语义来发布事件,以便所有服务都可以接收该事件,但是我们也希望有竞争的使用者,以便各个服务实例可以平衡事件并进行扩展。

VirtualTopics扩展
我们可以通过多种方式使用Camel和ActiveMQ实现:

  • (我)想到的一个非常明显的方法是,有一条简单的骆驼路线,该路线使用来自“客户主题”的事件,并将它们发送到“忠诚度积分队列”和“电子邮件队列”。 这很容易实现,但是每当“客户服务”事件中有一项新服务感兴趣时,我们都必须更新骆驼路线。 同样,如果您在与代理程序不同的进程上运行骆驼路由,则仅将消息从主题移到同一消息代理程序中的设置队列中时,将没有不必要的网络开销。
  • 对上述方法的一种改进是使用ActiveMQ Camel插件在ActiveMQ代理进程中运行Camel路由。 在这种情况下,每次订阅者发生更改时,您仍然必须更新Camel路由,但是路由将在代理进程本身中发生,因此不会产生网络开销。
  • 甚至更好的解决方案是让队列订阅主题而不进行任何编码,但是使用使用ActiveMQ 虚拟主题的声明性方法(因此,撰写本文的全部原因)。

虚拟主题是声明队列的一种声明式订阅方式,只需遵循命名约定即可,您所要做的就是为主题和队列定义或使用默认命名约定。

例如,如果我们创建一个名称与VirtualTopic。>表达式匹配的主题,例如: VirtualTopic.CustomerTopic ,然后从Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic队列中使用“忠诚度积分服务”,则消息代理将转发每个事件从VirtualTopic.CustomerTopic主题到Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic队列。

然后,我们可以通过启动多个服务实例来扩展忠诚度点服务,所有这些服务实例都从Consumer.LoyaltyPoint.VirtualTopic.CustomerTopic队列中使用。

同样,稍后我们可以通过遵循相同的命名约定为电子邮件服务创建队列:

Consumer.Email.VirtualTopic.CustomerTopic 。 此功能使我们可以简单地以特定方式命名主题和队列,并无需任何编码即可订阅它们。

最后的想法

这只是我最近出版的《最终思想骆驼设计模式》一书中描述的众多模式之一。 骆驼经常与ActiveMQ一起使用,因此,您也可以在本书中找到一些ActiveMQ模式。

通过编排事件可以实现使用编排扩展微服务的另一种方法。 您可以找到描述它的不错的博客文章
在这里

翻译自: https://www.javacodegeeks.com/2016/05/scalable-microservices-messaging.html

微服务 传递参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值