携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情
简介
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全
特性
- 可靠性:提供持久化、消息确认、事务等保证了消息的可靠性;
- 伸缩性:提供集群服务,可以很方便的添加服务器来提高系统的负载;
- 高可用:集群状态下部分节点出现问题依然可以运行;
- 多语言支持:RabbitMQ支持Java、.Net、Nodejs、Golang等多门语言;
- 方便管理:RabbitMQ提供了易用了网页版的管理监控系统,可以很方便的完成RabbitMQ的控制和查看;
- 插件机制:RabbitMQ提供了许多插件,可以丰富和扩展Rabbit的功能,用户也可编写自己的插件;
原理
RabbitMQ原理图如下:
名称说明:
- 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。
系统集成
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的其他高级功能,将在后续的文章中进行详细讲解,如有疑问,请随时反馈。