微服务通信设计模式

2022-01-16  本文已影响0人  DeepNoMind

微服务之间的通信,需要根据业务需求和架构的实际情况选择合适的方案,基于HTTP的REST API是最常见的选择,但并不是唯一的选择,需要考虑复杂性、性能、可扩展性等方面的权衡。原文:My Favorite Interservice Communication Patterns for Microservices[1]

微服务很有意思,可以帮助我们创建可伸缩的、高效的架构,因此当前几乎所有主流平台都基于微服务架构系统。如果没有微服务,就不可能有现在的Netflix、Facebook或Instagram。

然而,将业务逻辑分解为更小的单元并以分布式方式部署它们只是第一步。我们还必须理解怎样才能让服务之间更好的通信。没错,微服务不仅仅是面向外部的——或者换句话说,为外部客户服务——很多时候它们也是同一系统中其他服务的客户。

那么,如何使两个服务相互通信呢?简单的方案是继续使用呈现给外部客户的API。例如,如果我们面向外部客户的API是REST HTTP API,那么内部服务也可以通过这些API进行交互。

这是一个很合理的设计,但让我们看看有没有其他改进方案。

注:通信是基于商定的协议,微服务之间以及服务和客户之间的通信都是如此,始终确保协议一致的一种方法是在这些解耦的代码库之间共享描述这些协议的代码,可以是类、类型、模拟数据对象等,Bit[2]就是有助于实现这一目标的工具。

Bit从源头独立的控制TS/JS模块,即使它们被部署到独立的远程主机上,也能维护它们之间的依赖关系,从而使得对某一模块的更新能够触发其所有依赖模块的持续集成。


HTTP API

HTTP API毕竟是非常有效的设计,就让我们从这儿开始。HTTP API本质上意味着让服务就像响应浏览器或者Postman[3]这样的桌面客户端那样发送信息。

HTTP API基于CS模式,意味着通信只能由客户端发起。这也是一种同步通信,意味着一旦通信由客户端发起,要一直等到服务端返回响应才会结束。

经典的CS微服务通信

因为这和我们访问互联网的方式一致,因此这种方法非常流行。HTTP是互联网的支柱,因此所有编程语言都通过某种方式支持HTTP功能,从而使其成为一种非常流行的方法。

但这种方式并不完美,我们来分析一下。

优点

缺点

因此,如果我们的业务逻辑快速可靠,并且需要被许多不同的客户端访问,HTTP API是一个很好的解决方案。多个团队在不同的客户端上工作时,可以基于一个标准、一致的接口通信,这会非常有用。

如果多个服务需要互相交互,或者其中一些服务中的业务逻辑需要大量时间才能完成,那么就不要使用HTTP API。


异步消息(Asynchronous Messaging)

这种模式还包括了一个在消息生产者和接收端之间的消息代理。

这绝对是我最喜欢的多服务之间通信的方式之一,尤其是当我们需要横向扩展平台的处理能力时。

微服务之间的异步通信

这种模式通常需要引入消息代理,因此会增加额外的复杂性。然而,这样做的好处远不止于抽象。

优点

缺点

这绝对是一个有趣的模式,并且提供了很大的灵活性。如果生产者端需要产生大量消息,那么在生产者和消费者之间有一个类似缓冲区的结构将增加系统的稳定性。

虽然处理过程可能会很慢,但有了缓冲区后,扩展将变得容易得多。


Socket链接(Direct socket connection)

有时候我们不必依赖古老的HTTP来发送和接收消息,而是可以采用一些完全不同的路径,使用一些更快的技术,比方说socket。

为微服务通信打开socket通道

乍一看,基于socket的通信很像在HTTP中实现的客户端-服务器模式,然而,如果仔细看,还是有一些区别:

话虽如此,还是来看看这种方法的利弊:

缺点

优点

基于socket的通信是让服务彼此通信的非常有效的方式。例如,当部署为集群时,Redis使用这个方法来自动检测失败的节点,并将它们从集群中移除。由于通信速度快且成本低(意味着几乎没有额外的延迟,并且只需要很少的网络资源),才可以做到这一点。

如果能够控制服务之间交换的信息量,并且不介意定义自己的标准协议,那么就可以使用这种方法。


轻量级事件(Lightweight events)

此模式混合了前两种模式。一方面,它提供了一种让多个服务通过消息总线相互通信的方式,从而允许异步通信。另一方面,由于它只通过该通道发送非常轻量级的载荷,并要求调用相应服务的REST API将额外信息与载荷结合起来。

微服务通信中的轻量级事件和API的混合作用

当我们希望尽可能控制网络流量,或者当消息队列有包大小限制时,这种通信模式非常方便。在这种情况下,最好让事情尽可能简单,然后只在需要的时候要求额外的信息。

优点

缺点

这是一种非常有趣的混合模式,考虑到需要将两种方法混合在一起,需要花费一些精力编写代码。

这可以是一种非常好的网络优化技术,确保对于对应用例的载荷混合请求只发生大约10 - 20%的比例,否则带来的好处将不值得为其编写额外的代码。


微服务之间通信的最佳方式是提供了我们想要的东西的方式,可以是性能、可靠性或者安全性,我们必须知道想要什么,然后基于这些信息来选择最佳模式。

没有通信模式的银弹,即使像我一样更喜欢其中一种模式,现实的说,还是必须找到适应当前用例的模式。

References:
[1] My Favorite Interservice Communication Patterns for Microservices: https://blog.bitsrc.io/my-favorite-interservice-communication-patterns-for-microservices-d746a6e1d7de
[2] bit: https://github.com/teambit/bit
[3] Postman: https://www.postman.com/
[4] Socket.io: https://socket.io/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

上一篇 下一篇

猜你喜欢

热点阅读