用于微服务通信的 HTTP 与消息传递

微服务架构最近作为一种创建复杂且可扩展的软件系统的技术而广受欢迎。微服务是可扩展、可独立部署的服务,可通过网络相互通信。

使这些服务更容易相互通信是微服务设计的主要问题之一。HTTP 和消息传递是微服务通信的两种常用方法。

用于Web服务器和客户端之间通信的通用协议称为HTTP(超文本传输协议)。HTTP 经常用作微服务体系结构中服务之间的通信方式。

另一方面,消息传递涉及使用消息传递系统(如RabbitMQ,Apache Kafka或Amazon SQS)的服务之间的消息交换。

HTTP 和消息传递之间的决策取决于许多变量,包括特定用例、可伸缩性要求和系统复杂性。两种协议都有优点和缺点。在这种情况下,了解每种策略的优缺点对于选择最佳行动方案至关重要。

对于微服务通信,本文将研究 HTTP 和消息传递之间的区别,并概述每种策略所涉及的权衡。

使用 HTTP 进行通信

HTTP是万维网的基础,广泛用于Web浏览器和服务器之间的通信。近年来,它也被用作微服务之间的通信手段。在此技术中,RESTful API 用于跨微服务交换数据。

让我们看一些代码,观察微服务中基于 HTTP 的通信与基于消息传递的通信有何不同:

public class OrderService {

   

    private RestTemplate restTemplate;

   

    public OrderService(RestTemplate restTemplate) {

        this.restTemplate = restTemplate;

    }

   

    public void processOrder(Order order) {

        Customer customer = restTemplate.getForObject("http://customer-service/customers/" + order.getCustomerId(), Customer.class);

        // process order logic...

    }

}

1

在此示例中,订单微服务向客户微服务发出 HTTP 请求,以使用 .使用该函数检索客户数据,并将响应反序列化为 Customer 对象。RestTemplategetForObject

我们有两个微服务,一个客户微服务和一个订单微服务。订单微服务可能会通过客户微服务的 RESTful API 获取客户端信息。

基于 HTTP 的通信的好处

  • 易于使用:HTTP是一种众所周知的简单协议。开发人员可以轻松创建 RESTful API 来公开微服务并启用它们之间的通信。
  • 无状态:由于其状态,HTTP自然是可扩展的。每个请求都是单独处理的,客户端和服务器之间不需要连接。
  • 缓存:HTTP允许缓存,这在处理大量数据时很重要。微服务可以通过缓存频繁请求的数据来减少系统负载并提高速度。

基于 HTTP 的通信的缺点

  • 延迟:交换大量数据时,基于 HTTP 的连接可能会产生延迟。这可能会导致反应时间变慢和性能降低。
  • 复杂性:随着端点和方法数量的增加,RESTful API 可能会变得复杂。这会使系统维护和更新变得困难。
  • 缺乏可靠性:基于 HTTP 的通信依赖于网络,可能会受到网络缓慢和错误的影响。

通过消息传递进行通信

消息代理用于在基于消息传递的通信中促进微服务之间的通信。消息在微服务之间的队列中路由,从而分离发件人和收件人。

在此示例中,我们有两个相同的微服务:

  1. 客户微服务
  2. 订购微服务

一旦客户微服务将此信息发布到消息代理,订单微服务就会订阅此信息。

客户微服务标识符

public class CustomerService {

   

    private MessageBroker messageBroker;

   

    public CustomerService(MessageBroker messageBroker) 

  {

        this.messageBroker = messageBroker;

        }

   

         public void createCustomer(Customer customer) {

        // create customer logic...

        messageBroker.publish("customer.created", customer);

      }

 }
 

订购微服务代码

public class OrderService {

   

    private MessageBroker messageBroker;

   

    public OrderService(MessageBroker messageBroker) {

        this.messageBroker = messageBroker;

        this.messageBroker.subscribe("customer.created", this::processOrder);

    }

   

    private void processOrder(Customer customer) {

        // process order logic...

    }

}

1

建立新客户后,客户微服务会将客户信息发布到消息代理。订单微服务使用 subscribe 方法订阅此信息,并在收到新的客户端信息时调用该方法。processOrder

基于消息传递的通信的好处

  • 可扩展性:基于消息传递的通信具有极强的可扩展性,能够处理大量数据,几乎没有延迟。这使其非常适合高通量应用。
  • 可靠性:由于使用了消息代理,基于消息传递的通信非常可靠。通信在正确处理之前会排队,从而减少数据丢失的可能性。
  • 适应性:基于消息传递的通信具有适应性,可以处理广泛的数据形式,包括二进制数据。因此,它适用于处理复杂数据结构的应用程序。

基于消息传递的通信的缺点

  • 复杂性:基于消息传递的通信可能难以设置和管理,尤其是在涉及大量消息代理时。
  • 协议支持有限:基于消息传递的通信通常仅限于少数协议,例如 AMQP 或 MQTT。这可能会使与使用其他协议的其他系统的集成成为问题。
  • 缺乏标准化:目前没有用于微服务通信的通用消息协议,这使得各种系统之间的互操作性存在问题。

与示例中一样,微服务中基于 HTTP 的通信和基于消息的通信之间存在很大差异。基于 HTTP 的通信简单易用,但随着端点和方法数量的增加,它可能会造成延迟和复杂性。

尽管基于消息传递的通信具有令人难以置信的可扩展性和可靠性,但设置和操作更加复杂。最终,这两种方法之间的选择取决于应用程序的特定要求。

结论

HTTP 和消息传递对于微服务通信有其优点和缺点。HTTP 是一种更直接、更完善的协议,使其更容易实现并与现有基础架构集成。它还提供了与负载均衡器和代理的更好兼容性,使其成为需要高可用性和可扩展性的系统的理想选择。

另一方面,消息传递为微服务提供了更强大、更灵活的通信机制。它允许异步和解耦通信,这对于需要松散耦合和事件驱动架构的系统是有益的。

消息传递还支持不同的模式,例如发布/订阅,这有助于降低复杂性并提高可伸缩性。

最终,HTTP 和消息传递之间的选择将取决于微服务体系结构的特定要求。团队在决定通信协议时应仔细考虑可伸缩性、灵活性和兼容性等因素。

在许多情况下,结合 HTTP 和消息传递优势的混合方法可能是最有效的解决方案。

你可能感兴趣的:(java,微服务,开发语言)