RabbitMQ后台管理界面
访问 http://127.0.0.1:15672/
默认用户密码都是 :guest
界面介绍
overView 概述
Connection 连接
channels 频道
Exchanges 交换机
Queues 队列
Admin 用户管理等等
amqp 通信协议 (发消息,收消息)
clustering 集群端口
http 后台端口
用户管理
- 添加
virtual hosts
问: virtual hosts 是什么?
virtual hosts 相当于 mysql 的 db
- 添加virtual hosts
一般以 /
开头
给用户授权
把刚刚创建的 vhost_m 授权给 user_m
- 点击 用户 user_m
- 选择要授权的vhost,点击 set permission
我们便可以看到授权成功
AMQP高级消息队列协议
具有现代特性的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP协议模型
核心概念
Server: 又称Broker,接受客户端的连接,实现AMQP实体服务
Connection: 连接,应用程序与Broker的网络连接
Channel: 网络信道,几乎所有的操作都在 Channel中进行,是进行消息读写的通道。客户端可以建立多个Channel,每个Channel代表一个会话任务
Message:消息,服务器和应用程序之间传送的数据,有 Properties 和 Body 组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body则就是消息题内容。
Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host 里面不能有相同名称的Exchange或Queue
Exchange:交换机,接受消息,根据路由键转发消息到绑定的队列
Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
Routing key:一个路由规则,虚拟交换机可用它来确定如何路由一个特定消息
Queue:也成为 Message Queue,消息队列,保存消息并将他们转发给消费者
RabbitMQ的整体架构是什么样子的?
生产者 把消息投递到 指定交换机
交换机 和 队列 绑定
消费者 监听 指定队列
RabbitMQ消息是如何流转的?
生产者生产出来一个消息,然后投递到 Exchange上, Exchange把消息发送到 绑定(Routing Key)好的 Queue上
最后监听队列消费
RabbitMQ 的 Helloworld
-
新建Spring Boot项目
-
在pom中加入 Rabbitmq依赖
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.6.5</version> </dependency>
-
生产者
package com.my.rabbitmqstudy.quickstart; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class producter { public static void main(String[] args) throws Exception { //1 创建一个 ConnectionFactory ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); //2 通过工厂创建连接 Connection connection = connectionFactory.newConnection(); //3 通过 Connection创建一个Channel Channel channel = connection.createChannel(); //4 通过Channel 发送数据 String msg = "hello RabbitMQ"; for (int i = 0; i < 5; i++) { channel.basicPublish("","test001",null,msg.getBytes()); } channel.close(); connection.close(); } }
-
消费者
package com.my.rabbitmqstudy.quickstart; import com.rabbitmq.client.*; public class Consumer { public static void main(String[] args) throws Exception{ //1 创建一个 ConnectionFactory ConnectionFactory connectionFactory = new ConnectionFactory(); connectionFactory.setHost("127.0.0.1"); connectionFactory.setPort(5672); connectionFactory.setVirtualHost("/"); //2 通过工厂创建连接 Connection connection = connectionFactory.newConnection(); //3 通过 Connection创建一个Channel Channel channel = connection.createChannel(); //4 声明(创建)一个队列 String queueName = "test001"; channel.queueDeclare(queueName,true,false,false,null); //5 创建消费者 QueueingConsumer queueingConsumer = new QueueingConsumer(channel); //6 设置 Channel channel.basicConsume(queueName,true,queueName,queueingConsumer); //7 获取消息 while (true){ QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(); String msg = new String(delivery.getBody()); System.out.println("消费端:" + msg); //Envelope envelope = delivery.getEnvelope(); } } }
-
先运行消费者,接着运行生产者
消费端:hello RabbitMQ 消费端:hello RabbitMQ 消费端:hello RabbitMQ 消费端:hello RabbitMQ 消费端:hello RabbitMQ