RabbitMQ
它是消息中间件,是在消息的传输过程中保存消息的容器,实现应用程序和应用程序之间通信的中间产品。目前主流消息队列通讯协议是AMQP(二进制传输,支持多种语言)、JMS(HTTP传输,只支持Java)。
特点:每秒十万左右级别、消息延迟在微秒级、完整的消息确认机制、并发能力强、性能好。
常见MQ
- ActiveMQ基于JMS,每秒数万级别
- RabbitMQ基于AMQP,每秒十万级别
- RocketMQ是阿里的产品,基于JMS,每秒十万级别,经历过双十一
- Kafka自定义协议,每秒百万级别
体系结构
分为:服务器、交换器、队列;
服务器:负责管理所有的交换器和队列,一个RabbitMQ内有多个服务器,(为了避免每次发送消息都建立TCP连接,有了很多的服务器,每个线程建立单独的服务器进行通讯)每个服务器负责一部分交换器和队列,之间通过 HTTP 协议通信;
交换机:负责接收、路由、传递消息,支持多种交换器类型,每个类型有不同的消息传递方式和使用场景;
队列:负责存储消息,支持多种队列,都有不同的存储方式;
安装:
使用docker方式
# 拉取镜像
docker pull rabbitmq:3.8.12-management
# 注意:在拉取镜像,遇到missing signature key问题,需要提升docker的版本
# 运行容器
# -d 参数:后台运行 Docker 容器
# -e 参数:设置容器内的环境变量,这里我们设置了登录RabbitMQ管理后台的默认用户和密码
docker run --name rabbitmq -d -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=guest -e RABBITMQ_DEFAULT_PASS=123456 rabbitmq:3.8.12-management
# 启动成功,MQ的客户端页面,输入所设置的用户名和密码
# 访问:http://xxx:15672
# 如果访问不通,需要开放端口
firewall-cmd --zone=plublic -add-pord=5672/tcp --add-pord=15672/tcp --permanent
success
firewall-cmd --reload
success
发送消息
需要引包
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
生产者
// 生产者 - 产生消息
public static void main(String[] args) throws Exception {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("IP地址");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("123456");
// 创建连接
Connection connection = connectionFactory.newConnection();
// 创建频道
Channel channel = connection.createChannel();
// 创建队列,参数:队列名称、是否定义持久化队列、是否独占本次连接、是否在不使用的时候自动删除队列、其他参数
channel.queueDeclare("new_queue", true, false, false, null);
String message = "发送的消息的内容:123";
// 参数:交换机名称,默认Default Exchange、队列名称、配置信息、消息内容
channel.basicPublish("", "new_queue", null, message.getBytes());
// 关闭资源
channel.close();
connection.close();
}
创建一个队列,并有消息待查看,点击该队列的名称,在Get messages处,可以查看该消息的信息;
查看队列:
消费者
// 消费者 - 要消费消息
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("IP地址");
factory.setPort(5672);
factory.setVirtualHost("/");
factory.setUsername("guest");
factory.setPassword("123456");
// 创建连接 Connection
Connection connection