基本概念:

RabbitMQ是一种消息中间件,用来处理来自客服端的异步消息。服务端将要发送的消息放入到队列池中。接收端可以根据RabbMQ配置的转发机制接收服务端发来的消息。RabbitMQ依据指定的转发规则进行消息的转发、缓冲和持久化操作,主要用在多服务器间或单服务器的子系统间进行通信,是分布式系统标准的配置。

MQ典型应用场景:

  • 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
  • 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
  • 日志处理
  • 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。

    AMQP模型:

    RabbitMQ - Spring boot 整合-消息服务 - 图1
    正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。
    生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。
    接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟 ,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。
    最后还要关闭信道和连接。

常用交换器:direct、topic、fanout、headers

RabbitMQ - Spring boot 整合-消息服务 - 图2
RabbitMQ - Spring boot 整合-消息服务 - 图3
RabbitMQ - Spring boot 整合-消息服务 - 图4

快速开始:

RabbitMQ - Spring boot 整合-消息服务 - 图5

yml:

  1. spring:
  2. rabbitmq:
  3. host: 192.168.64.140
  4. username: admin
  5. password: admin

主程序

  1. @SpringBootApplication
  2. public class Main {
  3. public static void main(String[] args) {
  4. SpringApplication.run(Main.class, args);
  5. }
  6. @Bean
  7. public Queue task_queue() {
  8. /*
  9. * 可用以下形式:
  10. * new Queue("helloworld") - 持久,非排他,非自动删除
  11. * new Queue("helloworld",false,false,false,null)
  12. */
  13. return new Queue("helloworld",false); //新建一个helloword队列
  14. }
  15. }

生产者

AmqpTemplate是rabbitmq客户端API的一个封装工具,提供了简便的方法来执行消息操作.
AmqpTemplate由自动配置类自动创建

  1. @Component
  2. public class SimpleSender {
  3. @Autowired
  4. AmqpTemplate t;
  5. public void send() {
  6. // 这里向 helloworld 队列发送消息
  7. t.convertAndSend("helloworld", "Hello world!! "+System.currentTimeMillis());
  8. System.out.println("消息已发送");
  9. }
  10. }

消费者

通过@RabbitListener从指定的队列接收消息
使用@RebbitHandler注解的方法来处理消息

  1. @Component
  2. @RabbitListener(queues = "helloworld")
  3. public class SimpleReceiver {
  4. @RabbitHandler
  5. public void receive(String msg) {
  6. System.out.println("收到: "+msg);
  7. }
  8. }
这里还可以使用另一种形式:

@Component
public class SimpleReceiver {
    @RabbitListener(queues = "helloworld")
    public void receive(String msg) {
        System.out.println("收到: "+msg);
    }
}
另外,@RabbitListener 注解中也可以直接定义队列:
                                                                //durable---不持久化
    @RabbitListener(queuesToDeclare = @Queue(name = "helloworld",durable = "false"))

===========================

六种模式:

简单模式:

创建连接工厂—填写连接消息—通过工厂对象与mq获取连接
工具类
image.png
============
发送消息
image.png

工作模式:

一个提供者,两个接收者。两个接收者按不严格的“轮询”接收提供者发送的消息,如果某一个接受者处理时间过长,则另一个马上接收消息。

image.png

订阅模式:

一个提供者发送消息,多个接收者接收消息。提供者发送消息到指定的交换机,不指定队列,接受者就都能接收到消息。ex1—指定的交换机
image.png

路由模式:

一个提供者发送消息,多个接收者接收消息。判断同一个交换机下,以什么开头的消息发送到以指定绑定key值的队列。routing key
image.png
image.png

二、使用RabbMQ传递对象

  • 使用序列化对象 提供者和接收者类的对象的包名,类名,属性名须一致

image.png

  • 使用序列化字节数组

image.png

  • 使用json字符串传递

image.png
三、基于Java的交换机与队列的创建
image.png
springboot中创建:先是创建队列,然后创建交换机,然后绑定交换机和队列,声明一个路由键(routing key)
image.pngimage.png