springboot整合RabbitMQ

1,196 阅读4分钟

什么是RabbitMQ

RabbitMQ是实现了AMQP(advanced message queue protocol)[高级消息队列协议]的开源消息代理软件(亦称面向消息的中间件)。

rabbitmq核心概念

publisher

消息的生产者(发布者),发送消息的程序就是生产者。

message

消息,由消息头和消息体组成,消息头存放的是路由键(routing-key)还有一些其他的,消息体则是我们自己设置的需要发送的消息了。

exchange

交换机,用来接受生产者发送的信息并通过一定规则路由到指定的消息队列(queue)。

binding

绑定,用于消息队列和交换机之间的关联。

queue

消息队列,用来存放生产者发送的消息队列,简单来说就是一个容器,消费者可以从此接受到消息。

consumer

消息的消费者,接受消息的即是消费者。

rabbitmq大概结构图如下:

rabbitmq_jiegoutu.png
rabbitmq_jiegoutu.png

为什么需要使用rabbitmq

支持多种消息传递协议消息排队传递确认到队列的灵活路由多种交换类型;部署为集群以实现高可用性和吞吐量;跨多个可用区域和区域联合;插件众多,方便扩展;跨语言,可以使用任何常用的编程语言进行开发。。。。

上面都是摘抄的官网,太抽象,这里举个例子,rabbitmq可以理解为以前的邮局,以前发送邮件每个人都是直接将信件和收件人地址告诉邮局就行了,不用管具体怎么送到收件人的,可以知道,每个人既可以是发信人,也可以是收件人,同理,一个应用程序也可以既是生产者,也是消费者。我们不可能自己去寄信直接送到对方手里吧,那还用寄信干啥,或许你会觉得现在谁还会寄信,都直接发微信了,同样,我们发微信也不是直接发到对方手机上,也是先发送给微信服务器端那里,然后微信服务端那里再将信息给你想发给的那个用户,中间过程不用我们知道怎么做到的,例子或许不那么恰当,能理解就好了。

没有使用和使用之后的对比图:

rabbitmq_duibi.png
rabbitmq_duibi.png

springboot整合rabbitmq

安装就不再赘述了,可以百度看下。

  1. 添加依赖

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
  2. 配置rabbitmq

    spring:
     rabbitmq:
       addresses: 127.0.0.1
       port: 5672
       usernameguest
       passwordguest
  3. 环境准备

    为了下面我们方便测试,首先我这直接就在rabbitmq的ui界面上添加了几个交换机,几个队列,以及绑定规则,直接看图把。

  • 交换机exchange

    rabbitmq_exchanges.png
    rabbitmq_exchanges.png
  • 队列queue

    rabbitmq_queues.png
    rabbitmq_queues.png
  • 绑定规则

    rabbitmq_demo_direct_binding.png
    rabbitmq_demo_direct_binding.png
    rabbitmq_demo_fanout_binding.png
    rabbitmq_demo_fanout_binding.png
    rabbitmq_demo_topic_binding.png
    rabbitmq_demo_topic_binding.png
  1. 代码

    package com.lytw13.demo.controller;

    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

    @RestController
    @RequestMapping("user")
    public class PublicController {
       @Autowired
       RabbitTemplate rabbitTemplate;
       @GetMapping("test1")
       public String test1() {
           rabbitTemplate.convertAndSend("demo.fanout","","welcome to regist lytw13'blog!");
           return "success";
       }
       @GetMapping("test2")
       public String test2() {
           rabbitTemplate.convertAndSend("demo.direct","lytw13","welcome to regist lytw13'blog!");
           return "success";
       }
       @GetMapping("test3")
       public String test3() {
           rabbitTemplate.convertAndSend("demo.topic","lytw13.hello","welcome to regist lytw13'blog!");
           return "success";
       }
    }

测试:

  • 访问localhost:8080/user/test01,可以看到3个队列都可收到消息,fanout是不管rounting key,将信息发送给所有队列。
  • 访问localhost:8080/user/test02,可以看到只有1个队列可以收到消息,direct是rounting key必须完全符合才会将信息发送给对应队列。
  • 访问localhost:8080/user/test03,可以看到有2个队列可以收到消息,topic是rounting key必须匹配设置的规则,*代表一个匹配一个单词,#任意个,符合才会将信息发送给对应队列。

具体代码我已经上传到了github,如果有问题可以参考下。前往