认识RabbitMQ
RabbitMQ是一个开源的消息代理和消息队列系统,采用AMQP(Advanced Message Queuing Protocol)协议。它被设计用于在分布式系统中进行高效,可靠和可扩展的消息传递。
RabbitMQ基本概念:
- Producer(生产者):生产者负责发布消息到消息队列中。
- Consumer(消费者):消费者从消息队列中订阅(消费)消息并进行处理。
- Message Queue(消息队列):消息队列是一个缓冲区,用于存储待处理的消息。
- Exchange(交换机):交换机负责接收生产者发布的消息,并将其路由到一个或多个消息队列。
- Binding(绑定):绑定是交换机和消息队列之间的关联关系,它定义了消息如何从交换机路由到消息队列。
- Routing Key(路由键):路由键是用于路由消息的属性,它与绑定关系一起决定了消息的路由路径。
RabbitMQ使用场景:
- 异步任务处理:将耗时较长的任务放入消息队列中,让消费者异步处理。这可以提高系统的可伸缩性和可靠性。
- 解耦系统组件:通过将系统不同组件之间的通信转变为消息队列的方式,可以降低系统的耦合度,使得系统更加灵活和可扩展。
- 消息分发:通过交换机和路由键的路由规则,将消息分发给不同的队列。不同的消费者可以根据自己的需要选择订阅感兴趣的消息。
- 日志记录:将日志消息发送到消息队列中,可以实现集中式的日志记录和处理。
- 实时数据处理:通过使用消息队列来传输实时数据,可以实现实时数据的处理和分析。
RabbitMQ角色分类和权限
Docker安装RabbitMQ
1、下载镜像
docker pull rabbitmq:3.8-management
2、创建并启动容器
docker run -di --name myRabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 -p 25672:25672 -p 61613:61613 -p 1883:1883 rabbitmq:3.8-management
3、启动容器
docker start 5d7108ebc294
4、测试访问Rabbitmq的可视化界面
浏览器输入服务器http://120.53.9.55:15672,输入我们上面设置好的账号和密码就能成功访问
AMQP
一、什么是AMQP
高级消息队列协议。是应用层协议的一个开发标准,为面向消息的中间件而设计
二、了解AMQP生产者流转过程
Broker就相当于一个Rabbitmq服务节点
三、了解AMQP消费者流转过程
RabbitMQ组件和架构
一、RabbitMQ核心组成部分
核心概念
二、RabbitMQ的运转流程
第一个RabbitMQ程序
实现步骤:
1、新建一个maven
2、导入依赖
<!--RabbitMQ原生依赖-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
3、编写消息生产者(步骤很重要!)
package com.guohui.rabbitmq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//消息生产者
public class Producer {
public static void main(String[] args) {
//1、创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("120.53.9.55");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
//2、创建连接Connection
Connection connection = null;
Channel channel = null;
try {
//创建连接Connection
connection = connectionFactory.newConnection("生产者");
//3、通过连接获取通道Channel
channel = connection.createChannel();
//4、通过通道创建交换机,声明队列,绑定关系,路由key,实现发送消息和接收消息
String queueName = "queue1";
//声明队列的方法
/*参数解释
* @Params1 队列的名称
* @Params2 是否要持久化数据,true为开启持久化
* @Params3 排他性,是否独占队列
* @Params4 是否自动删除,随着最后一个消费者消费完毕消息后,是否把队列自动删除
* @Params5 携带的附属参数*/
channel.queueDeclare(queueName,false,false,false,null);
//5、准备消息内容
String message = "HelloWorld";
//6、发送消息给队列queue
注意:第一个空的地方是交换机,现在初学就默认空了!虽然我们没有指定交换机,但是存在默认的交换机!所有的消息都是通过交换机进入到队列中的
channel.basicPublish("",queueName,null,message.getBytes());
System.out.println("消息发送成功!");
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
//7、关闭通道
if (channel != null && channel.isOpen()){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
//8、关闭连接
if (connection != null && connection.isOpen()){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4、编写消息消费者(步骤很重要!)
package com.guohui.rabbitmq.simple;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
//消息消费者
public class Consumer {
public static void main(String[] args) {
//1、创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("120.53.9.55");
connectionFactory.setPort(5672);
connectionFactory.setUsername("admin");
connectionFactory.setPassword("admin");
connectionFactory.setVirtualHost("/");
//2、创建连接Connection
Connection connection = null;
Channel channel = null;
try {
//创建连接Connection
connection = connectionFactory.newConnection("消费者");
//3、通过连接获取通道Channel
channel = connection.createChannel();
//4、通过通道创建交换机,声明队列,绑定关系,路由key,实现发送消息和接收消息
String queueName = "queue1";
//声明队列的方法
/*参数解释
* @Params1 队列的名称
* @Params2 是否要持久化数据,true为开启持久化
* @Params3 排他性,是否独占队列
* @Params4 是否自动删除,随着最后一个消费者消费完毕消息后,是否把队列自动删除
* @Params5 携带的附属参数*/
channel.queueDeclare(queueName,false,false,false,null);
//5、准备消息内容
final String message = "HelloWorld";
//6、从队列queue1中接收消息
channel.basicConsume("queue1", true, new DeliverCallback() {
public void handle(String s, Delivery delivery) throws IOException {
System.out.println("收到消息是" + new String(delivery.getBody(), "UTF-8"));
}
}, new CancelCallback() {
public void handle(String s) throws IOException {
System.out.println("消息接收失败了...");
}
});
System.out.println("开始接收消息");
System.in.read();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
//7、关闭通道
if (channel != null && channel.isOpen()){
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
//8、关闭连接
if (connection != null && connection.isOpen()){
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5、访问服务器120.53.9.55:15672,观察消息的生产和消费
(1)首先先执行生产者的代码,发现在通道中有一条消息等待消费
(2)运行消费者代码
发现接收到了生产的消息
并且通道中中待消费的数据变成了0
至此,你已经掌握了RabbitMQ的基础知识,后面的支持的消息模式以及如何解决分布式架构中出现的问题都是相当重要的部分,希望大家能够继续关注!