转载

springboot整合RabbitMQ

什么是RabbitMQ

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

rabbitmq核心概念

publisher

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

message

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

exchange

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

binding

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

queue

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

consumer

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

rabbitmq大概结构图如下:

springboot整合RabbitMQ
rabbitmq_jiegoutu.png

为什么需要使用rabbitmq

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

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

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

springboot整合RabbitMQ
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
       username: guest
       password: guest
    复制代码
  3. 环境准备

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

  • 交换机exchange

    springboot整合RabbitMQ
    rabbitmq_exchanges.png
  • 队列queue

    springboot整合RabbitMQ
    rabbitmq_queues.png
  • 绑定规则

    springboot整合RabbitMQ
    rabbitmq_demo_direct_binding.png
    springboot整合RabbitMQ
    rabbitmq_demo_fanout_binding.png
    springboot整合RabbitMQ
    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,如果有问题可以参考下。 前往

原文  https://juejin.im/post/5e0351d4e51d45584162c500
正文到此结束
Loading...