摘要:沟通是一个一直存在的概念。每件事都需要通过交换某种信息来交流,是的,你读对了,我的意思是一切。如果你仔细想想,即使是你在公共汽车或杂货店里找到的广告也在试图告诉你一些东西,对吧?在计算机世界中,设备(鼠标、显示器、键盘等)通过交换信息相互通信。如果我们考虑应用程序,那么我们讨论的是组件、函数、类等等,它们需要相互通信,或者公开一些可以通过通信实现的功能。我们通常称之为消息传递.
一:消息传送
本节将介绍一些稍后详细描述的主要概念,从消息传递以及它如何适应日常的开发周期。看一看图1-1
图1-1显示了一个简单的消息传递过程,通过任何可能的媒介,它从A点到B点进行通信。在这种情况下,图1-1使用一个通道,它可以是一个简单的函数调用、套接字连接或一个HTTP请求。主要的想法是将消息发送给消费者/接收者。
二:消息用例
本节将介绍一些最常见的消息传递用例。这些用例是理解为什么消息传递如此重要的关键:
.有保证的交付
开发人员需要确保他们发送的消息到达目的地。如果你使用的是一个代理(一个处理连接、消息和消息传递、同步或不同步的系统),然后,生产者需要知道代理是否接收到消息,通过某种形式的确认。消费者也必须这样做,通过向经纪人确认消息已经收到。所以当关键信息被传递时,这个特殊的用例通常被使用,比如支付,股票,或者任何其他重要信息.
. 解耦
在处理软件架构时,开发人员寻找解耦的组件,以方便集成、可扩展性和简单的操作和维护。但如何才能实现脱钩呢?消息传递是解决方案的一部分,因为它允许您在自己的业务领域中思考,这是一个有界的上下文。您所生产/发送的信息是您的主要关注点,无论用户/接收者如何实现自己的业务逻辑。
.可伸缩性和高可用性
每当一个系统经历高请求的需求时,它都需要具有可伸缩性,而不是单点故障。对于这些特定的场景,消息传递是解决方案,因为多个消费者/接收方可以与负载保持同步,您可以跨多个系统实例或经纪人复制消息。这样的话,如果你的一个实例/经纪人倒下了,你仍然处于控制之中。
.异步的
应用程序必须非常快,并且能够尽快响应请求。在这种情况下,时间是关键因素。当您知道处理请求需要花费大量的时间并且您有多个客户端时,您如何才能达到这种速度呢?您可以通过使用前面的用例解决方案(可伸缩性和/或高可用性)来解决这个问题,但是它将到达一个阻止请求的点。解决方案是异步消息传递,忘记了您的生产者/发送者发送消息并获取他们自己的业务逻辑,让消费者/接收者在他们自己的时间内处理消息。
.互操作性
创建消息传递系统的一个重要因素是能够在消费/接收(可能是一个普通/文本JSON或XML格式或序列化的对象)时生成/发送消息并能够理解该消息。在过去的几十年里,有许多尝试创建可互操作系统。现在,与实现AMQP协议的新代理,甚至使用简单的RESTful api或WebSockets,都可以实现互操作性,不管实现如何,都使生产者和消费者能够无缝地互操作。
这些用例已经发展成为非常有名的消息传递模型和设计模式,下一节将讨论。
三:消息传递模型和消息传递模式
当消息成为所有系统的一部分时,就建立了一些消息传递模型。在我看来,这些模型演变为消息传递设计模式的创建。
Point-to-Point(点对点)
点对点模型是将消息发送到队列的一种方式(首先是在第一个)一个接收器接收到信息。见图1 - 2。
点对点模型也被用作消息通道模式,而不是队列,而是有一个通道(这是传输消息的一种方式)。它仍然保证只有一个接收器按照发送的顺序接收消息。
你们会在接下来看到一些关于这些模型和模式的例子.
Publish-Subscribe(发布/订阅)
发布-订阅模型描述了一个发布者,它向该主题的多个订阅者发送一条消息(一个主题)。每个订阅者只会收到一条消息的副本。见图1 - 3。
发布-订阅模型也被用作消息通道模式,而不是主题,您有一个通道,它将消息的副本传递给它的订阅者。
这些模型与JMS(Java消息传递系统)更相关,并且非常重要,因为它们构成了所有企业系统的基础。
四:Messaging Patterns(消息传递模式)
设计模式是解决软件设计中常见问题的一种解决方案。出于同样的原因,消息传递模式尝试解决消息传递设计中的问题。
在这本书的过程中,您将了解以下模式的实现,因此我想在这里列出它们,并使用简单的定义来介绍它们
1.消息类型模式:描述不同形式的消息传递,例如字符串(可能是纯文本、JSON和/或XML)、字节数组、对象等等。
2.消息通道模式:确定将使用哪种传输(通道)来发送消息,以及它将拥有什么样的属性。这里的想法是,生产者和消费者知道如何连接到传输(通道),并且可以发送和接收消息。这种传输的可能属性包括请求-应答特性和单向通道,您将很快了解到这一点。这种模式的一个例子是点对点通道。
3.路由模式:描述一种在集成解决方案中提供路由机制(过滤依赖于一组条件)的路由机制,从而在生产者和消费者之间发送消息。这可以通过编程实现,或者在某些情况下,消息传递系统(经纪人)可以拥有这些功能(就像RabbitMQ一样)。
4.服务消费者模式:描述当消息到达时,消费者将如何表现,例如在处理消息时添加事务处理方法。有一些框架允许您发起这种行为(比如Spring框架,您可以通过添加@Transactional,基于交易的抽象来实现)。
5.契约模式:生产者和消费者之间的契约,以拥有简单的通信,例如当您进行一些REST调用时,您可以在某些字段中调用JSON或XML消息。
6.消息构建模式:描述如何创建一条消息,以便它可以在消息传递系统中传递。例如,您可以创建一个信封,它可以有一个主体(实际的消息)和一些头文件(带有相关ID或序列或应答地址)。通过一个简单的web请求,您可以添加参数或头信息,而实际的消息将成为请求的主体,从而使整个请求成为构建模式的一部分。HTTP协议允许这种通信(消息传递)。
7.转换模式:描述如何在消息传递系统中更改消息的内容。考虑一个需要进行一些处理的消息,需要在动态中增强,比如内容更丰富。
正如您所看到的,这些模式不仅描述了消息传递过程,而且其中一些描述了如何处理您前面看到的一些常见用例。当然,还有更多的消息传递模式,这些只是我们在下面将要探讨的一些内容。
如果您想要更多的信息,我建议您访问企业集成模式网站http://www.enterprise seintegrationpatterns.com/。还要看看这个必读的图书企业集成模式:由来自Addison-Wesley的Gregor Hohpe和Bobby Woolf设计、构建和部署消息解决方案。在书中,我使用Spring Integration module和各种消息传递系统(经纪人)来介绍其中的一些模式
五:消息传递与Spring框架
Spring框架是Java社区最常用的框架之一。Spring框架通过实现一个可以与任何消息传递系统一起使用的模板设计模式,从而实现了一种简单而简单的消息传递方式。它支持JmsTemplate的JMS API,AMQP与RabbitTemplate、STOMP,以及与事件和侦听器的内部消息传递。别担心,我们以后会在书中讲到所有这些。值得一提的是,Spring Integration项目已经被社区所接受,Spring Integration的核心(消息、通道和其他接口)自0版本以来一直是Spring核心的一部分。市面上有许多好的消息传递框架。其中一些使用纯Java,而另一些则依赖于Spring框架。Spring团队一直在努力工作,使开发人员更容易使用所有的特性,包括并发性、事务、重试等。使用其他库,您必须使用相同的逻辑来实现它们。
您可以从github库中克隆它:https://github.com/felipeg48/spring消息。
六:总结
本章介绍了消息传递和消息传递系统。您了解了消息传递的基本概念,即开发人员需要将信息从一个点发送到另一个点。本章回顾了一些用例、模型和消息传递模式。这本书将更详细地介绍它们,并通过一些最好的实现来使用它们,包括Spring框架和它们的一些模块,包括Spring Integration、Spring AMQP和Spring Cloud流。下一章包括了Spring Boot的访问,这是下一代创建企业级Spring应用程序的过程。Spring Boot是您在本书中使用的所有模块的基础。