一、简介
中间件:中间件(Middleware)是处于平台(硬件和操作系统)和应用程序之间的通用服务。也就是说,中间件是提供普遍独立功能需求的模块。中间件屏蔽了底层操作系统的复杂性,使开发人员得以基于一个简单而统一的开发环境,集中进行业务开发,而不必考虑程序在不同系统上的兼容性问题,从而提升开发效率,且减少系统维护的工作量。
消息中间件:也称消息队列,利用可靠的消息传递机制进行系统之间通信,具有接受数据、接受请求、存储数据、发送数据等功能。消息代理(message broker)和目的地(destination)是消息服务中两个重要的概念。当一个消息被发送后,会被交给消息代理,消息代理可以确保消息被发送到指定目的地,同时解放发送者,使其能够继续进行其它业务。消息代理通常有ActiveMQ、RabbitMQ...,目的地通常有队列和主题。
- 队列(queue):点对点消息通信(point-to-point)
- 主题(topic):发布(publish)和订阅(subscribe)消息通信
点对点式:
- 发送者发送消息,消息代理将其放入队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
- 消息只有唯一的发送者和接受者,但是可以有多个接收者(因为一个消息只能被读取一次)
发布订阅式:
发送者(发布者)发送消息到主题,由于多个接收者(订阅者)监听(订阅)这个主题,所以在消息到达主题的同时收到消息
二、JMS与AMQP
常见的两个消息规范分别是JMS(Java Message Service)和AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)。JMS是一个基于JVM的消息代理规范,常见实现有ActiveMQ和HornetMQ;AMQP是一个基于应用层标准的统一消息队列协议,是应用层协议的一个开放标准。基于此协议的客户端与消息中间件的消息传递,并不受客户端、中间件和不同开发语言等限制。AMQP兼容JMS,常见实现有RabbitMQ。下表列举了JMS与AMQP的区别:
- JMS基于Java,不能跨语言、跨平台,提供点对点和发布订阅式消息模型,支持多种消息类型(TextMessage、MapMessage、ByteMessage、
StreamMessage、ObjectMessage及Message(只有消息头和属性)) - AMQP是应用层级别的协议,支持跨语言、跨平台,提供了五种消息模型(direct exchange\fanout exchange\topic exchange\headers exchange\system exchange,后四种与JMS中的发布订阅模式本质上没有太大区别,仅在路由机制上做了更详细的划分),支持消息类型为byte[](复杂的消息会序列化之后发送)
简而言之,JMS定义了Java API层面的标准,在Java体系中,多个client可以通过JMS进行交互,应用无需修改代码,但对跨平台的支持较差;AMQP定义了wire-level层的协议标准;天然具有跨平台、跨语言特性。
三、Spring与Spring Boot支持
- spring-jms提供了对JMS的支持
- spring-rabbit提供了对AMQP的支持
- 需要ConnectionFactory的实现来连接消息代理
- 提供JmsTemplate、RabbitTemplate来发送消息
- @JmsListener(JMS)、@RabbitListener(AMQP)注解在方法上监听消息代理发布的消息
- @EnableJms、@EnableRabbit开启支持
Spring Boot自动配置
– JmsAutoConfiguration
– RabbitAutoConfiguration
网友评论