微服务架构最近作为一种用于创建复杂且可扩展的软件系统的技术而受到欢迎。微服务是可扩展的、可独立部署的服务,它们通过网络相互通信。
让这些服务更容易相互通信是微服务设计的主要问题之一。HTTP 和消息传递是微服务通信的两种流行方法。
用于 Web 服务器和客户端之间通信的通用协议称为 HTTP(超文本传输协议)。HTTP 经常用作微服务架构中服务之间的通信方式。
另一方面,消息传递涉及使用 RabbitMQ、Apache Kafka 或 Amazon SQS 等消息传递系统在服务之间交换消息。
HTTP 和消息传递之间的决定取决于许多变量,包括特定用例、可伸缩性要求和系统复杂性。两种协议都有优点和缺点。在这种情况下,了解每种策略的优缺点对于选择最佳行动方案至关重要。
对于微服务通信,本文将研究HTTP和消息传递之间的区别,并概述每种策略所涉及的权衡。
使用 HTTP 进行通信
HTTP 是万维网的基础,广泛用于网络浏览器和服务器之间的通信。近年来,它也被用作微服务之间的通信手段。在此技术中,RESTful API 用于跨微服务交换数据。
让我们看一些代码来观察微服务中基于 HTTP 的通信与基于消息传递的通信有何不同:
在此示例中,订单微服务向客户微服务发出 HTTP 请求,以使用RestTemplate. 使用该函数检索客户数据getForObject,并将响应反序列化为 Customer 对象。
我们有两个微服务,一个客户微服务和一个订单微服务。由于客户微服务的 RESTful API,订单微服务可以获取客户信息。
基于 HTTP 的通信的好处
- 使用简单:HTTP 是众所周知的简单协议。开发人员可以轻松创建RESTful API来公开微服务并实现它们之间的通信。
- 无状态性:由于其无状态性,HTTP 具有天然的可扩展性。每个请求都是单独处理的,不需要客户端和服务器之间的连接。
- 缓存:HTTP 允许缓存,这在处理大量数据时很重要。微服务可以通过缓存频繁请求的数据来降低系统负载并提高速度。
基于 HTTP 的通信的缺点
- 延迟:交换大量数据时,基于 HTTP 的连接可能会造成延迟。这可能会导致反应时间变慢和性能下降。
- 复杂性:随着端点和方法数量的增加,RESTful API 可能会变得复杂。这会使系统维护和更新变得困难。
- 缺乏可靠性:基于 HTTP 的通信依赖于网络,可能会受到网络缓慢和错误的影响。
通过消息通信
消息代理用于在基于消息的通信中促进微服务之间的通信。消息在微服务之间的队列中路由,将发送者和接收者解耦。
在这个例子中我们有两个相同的微服务:
- 客户微服务
- 订单微服务
一旦客户微服务将其发布到消息代理,订单微服务就会订阅此信息。
客户微服务标识符
订购微服务代码
当建立新客户时,客户微服务将客户信息发布到消息代理。订单微服务使用 subscribe 方法订阅此信息,processOrder每当收到新的客户端信息时都会调用该方法。
基于消息的通信的好处
- 可扩展性:基于消息的通信具有极高的可扩展性,能够以极短的延迟处理大量数据。这使其非常适合高通量应用。
- 可靠性:由于使用消息代理,基于消息的通信非常可靠。通信在被正确处理之前会排队,从而减少数据丢失的机会。
- 适应性:基于消息的通信具有适应性,可以处理范围广泛的数据形式,包括二进制数据。因此,它适用于处理复杂数据结构的应用程序。
基于消息的通信的缺点
- 复杂性:基于消息的通信可能难以设置和管理,尤其是当涉及大量消息代理时。
- 协议支持有限:基于消息的通信通常仅限于少数协议,例如AMQP或 MQTT。这可能会导致与使用其他协议的其他系统的集成出现问题。
- 缺乏标准化:目前没有用于微服务通信的通用消息协议,使得各种系统之间的互操作性存在问题。
如示例中所示,微服务中基于 HTTP 和基于消息传递的通信之间存在很大差异。基于 HTTP 的通信简单易用,但随着端点和方法数量的增加,它会产生延迟和复杂性。
虽然基于消息的通信具有令人难以置信的可扩展性和可靠性,但设置和操作起来更加复杂。最终,这两种方法之间的选择取决于应用程序的特定要求。
结论
HTTP 和消息传递对于微服务通信各有优缺点。HTTP 是一种更直接和完善的协议,使其更易于实施和与现有基础设施集成。它还提供了与负载平衡器和代理更好的兼容性,使其成为需要高可用性和可扩展性的系统的不错选择。
另一方面,消息传递为微服务提供了更健壮和灵活的通信机制。它允许异步和解耦通信,这对于需要松散耦合和事件驱动架构的系统可能是有益的。
消息传递还支持不同的模式,例如发布/订阅,这有助于降低复杂性和提高可扩展性。
最终,HTTP 和消息传递之间的选择将取决于微服务架构的具体要求。在决定通信协议时,团队应仔细考虑可扩展性、灵活性和兼容性等因素。
在许多情况下,结合 HTTP 和消息传递优势的混合方法可能是最有效的解决方案。