Spring Boot集成RabbitMq

713 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

简介

RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全

特性

  • 可靠性:提供持久化、消息确认、事务等保证了消息的可靠性;
  • 伸缩性:提供集群服务,可以很方便的添加服务器来提高系统的负载;
  • 高可用:集群状态下部分节点出现问题依然可以运行;
  • 多语言支持:RabbitMQ支持Java、.Net、Nodejs、Golang等多门语言;
  • 方便管理:RabbitMQ提供了易用了网页版的管理监控系统,可以很方便的完成RabbitMQ的控制和查看;
  • 插件机制:RabbitMQ提供了许多插件,可以丰富和扩展Rabbit的功能,用户也可编写自己的插件;

原理

RabbitMQ原理图如下:

图片.png

名称说明:

  • Broker:消息队列服务器实体。
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
  • Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
  • Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来,Exchange 和Queue的绑定可以是多对多的关系。
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
  • Channel:通道,Channel是在Connection的基础上建立的虚拟连接,RabbitMQ中大部分的操作都是使用Channel完成的,比如:声明Queue、声明Exchange、发布消息、消费消息等。
  • Virtual host:虚拟主机,Virtual host是一个虚拟主机,一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样.

工作原理

Broker表示RabbitMQ服务,每个Broker里面至少有一个Virtual host虚拟主机,每个虚拟主机中有自己的Exchange交换机、Queue队列以及Exchange交换机与Queue队列之间的绑定关系Binding。producer(生产者)和consumer(消费者)通过与Broker建立Connection来保持连接,然后在Connection的基础上建立若干Channel信道,用来发送与接收消息。

RabbitMq的安装

本文采用的是windown版本的Rabttmq的安装,由于RabbitMQ是建立在Erlang OTP平台上的,所以我们需要安装Erlang和RabbitMQ。

安装Erlang

从官网下载Erlang,安装即可 64位:erlang.org/download/ot…

安装RabbitMQ

从官网下载RabbitMQ即可 www.rabbitmq.com/install-win…

启动RabbitMq

进入Rabbitmq安装目录执行如下命令即可

D:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.7\sbin>

 rabbitmq-plugins enable rabbitmq_management
 
 //启动命令
 rabbitmq-server
 

访问RabbitMQ后台管理

输入http://localhost:15672 访问 RabbitMQ 的后台管理页面,初始化用户名和密码都是 guest。

图片.png

系统集成

jar包引入

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

application.yml添加RabbitMq配置

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: test
    password: test

核心配置类

@Configuration
public class RabbitMqConfig 
{
    private final static String QUEUE_NAME = "testQueue"; //队列名称
    private final static String EXCHANGE_NAME = "testDirect"; //交换器名称
    private final static String ROUTING_KEY="testDirectRouting"; //绑定key
    @Bean
    public Queue testQueue() {
        return new Queue(QUEUE_NAME,true);
    }

    @Bean
    public DirectExchange testDirect() {
        return new DirectExchange(EXCHANGE_NAME, true, false);
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(testQueue())
                .to(testDirect())
                .with(ROUTING_KEY);
    }
}

发送消息

@Component
public class MqProduce
{
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendMessage(String message)
    {
        rabbitTemplate.convertAndSend("testDirect","testDirectRouting",message);
        
    }
}

说明:convertAndSend方法第一个参数交换器的名称,第二参数为绑定Routekey的名称。

接收消息

@Component
@RabbitListener(queues = "testQueue")
public class MqConsumer
{
    private static final Logger logger = LoggerFactory.getLogger(MqConsumer.class);
    
    @RabbitHandler
    public void receive(String message) 
    {
        logger.info("receive message content:{}",message);
    }
}

注意:queues队列的名称需要与RabbitMqConfig保持一致。

相关测试

@RestController
public class TestController
{
    @Autowired
    private MqProduce produce;

    @RequestMapping("/sendMessage")
    public String sendMessage()
    {
        produce.sendMessage("this is test message");
        return "success";
    }
}

启动服务,运行其测试代码,即可输出消息的内容。

c.s.fw.rabbitmq.consumer.MqConsumer - receive message content:this is test message

总结

本文对Spring Boot集成RabbitMQ进行了入门讲解,关于RabbitMQ的其他高级功能,将在后续的文章中进行详细讲解,如有疑问,请随时反馈。