文章目录
- 1.引入
- 2.安装教程
- 3.rabbitMQ工作流程
- 4.核心概念介绍
-
- 4.1信道和连接
- [4.2virtual host](#4.2virtual host)
- 4.3quene队列
- 5.Web界面操作
- 6.快速入门
1.引入
废话不多说,这个rabbitMQ就是我们的消息队列,其中这个单词的前面的部分翻译之后就是兔子的意思,后面的这个mq就是我们的message quene简称;
我们之前学习这个生产者消费者模型的时候,是学习过这个消息队列的,其实就是对于我们的一个系统发往另外一个系统的这个数据消息进行存储;
1.1同步和异步
下面的这个直接调用接口的话就是我们的同步的方式;
如果是借助这个消息队列实现的话就是我们的异步;
1.2消息队列的作用
下面的这个作用其实就是详细介绍罢了,我们之前介绍的这个就是削峰填谷,想想三峡大坝的例子就可以明白这个消息队列的作用了,两个的这个作用就是很相似的;
1.3rabbitMQ介绍
这个其实也没有什么好介绍的,这个就是我们的消息队列的一种,因为这个兔子的繁殖速度快嘛,所以使用这个rabbit进行表示,没有其他的意思;
这个rabbitMQ也仅仅是我们的这个众多的产品里面的一种罢了,我们主要学习这个消息队列;
2.安装教程
我们的这个rabbitmq是基于这个erlang语言的,因此想要安装这个rabbit需要首先安装这个erlang
2.1更新软件包
#下面的这个就是更新安装包
sudo apt-get undate
这个的速度很快,一会就好了;
2.2安装erlang
sudo apt-get install erlang
这个过程需要等待较长的时间,中途需要输入这个y/n,我们输入这个y即可
2.3查看这个erlang版本
erl
显示上面的这个即为安装成功,我们使用这个ctrl+c/v退出这个即可;
2.4安装rabbitMQ
下面的就是更新我们的软件包,安装服务,检查状态;
sudo apt-get update
sudo apt-get install rabbitmq-server
systemctl status rabbitmq-server
2.5安装管理页面
rabbitmq-plugins enable rabbitmq_management
2.6浏览器测试
2.7添加管理员用户
下面的这个第一行就是设置我们的这个用户名和密码,第一个***表示的就是我们自己设置的这个用户名,第二就是我们自己设置的这个密码;
第二行就是设置我们的这个用户权限,这个名字需要和我们的这个第一行里面使用的这个名字是一样的,然后设置之后就可以使用IP+15672进行访问,这个云服务器需要开放这个15672端口才可以的偶;
rabbitmqctl add_user *** ***
rabbitmqctl set_user_tags 用户名 administrator
3.rabbitMQ工作流程
这个队列的工作流程如下图所示,其中这个里面的这个channel就是负责接受这个生产者发来的这个消息,然后把这个消息给我们的交换机,我们的交换机把这个消息匹配到这个对应的队列上面去;
我们的这个channel也和我们的这个消费者进行交互,其中我们的这个queue上面的这个消息不知直接给这个消费者,也是通过我们的这个channel进行传输的;
4.核心概念介绍
4.1信道和连接
这个工作流程图里面的这个connection表示的就是我们的这个链接,这个channel就是一个抽象地表示,表示的就是我们的通道,也可称之为信道;
4.2virtual host
这个表示的就是我们的虚拟主机,上面的这个流程图里面是我们的这个信道和我们的链接的都是在这个虚拟主机上面的,这个虚拟主机和我们日常说的这个虚拟机不是一个概念,这个需要加以区分;
4.3quene队列
我们的这个队列和我们的消费者之间是一对多的关系,就是我们的这个一个队列可以发送给我们的多个消费者,我们的这一个消费者可以索要多个队列消息;
5.Web界面操作
我们可以添加这个用户,也可以对于这个已经存在的这个用户的相关的信息进行修改,这些都是允许的,添加的话就是点击这个add user选项即可;
5.1新建用户
我们点击这个用户admit,点击下面的这个set选项,就可以为这个用户添加这个虚拟机使用的权限;
5.2新建虚拟机
上面的核心工作流程已经说明了,这个虚拟主机就是存放我们的这个交换机和我们的这个队列的;
需要自己新建一个虚拟主机,而不是使用这个上面已经存在的;
5.3现身说法
我自己这个虚拟主机就是mq名字,下面的这个形容description和这个tag标签都是可以随便写的,这个是无所谓的,然后点击这个添加就可以了;
我们上面创建了这个新的用户,我们需要进行这个二次确认,我自己的话就是我的这个mq主机可以让这个我自己创建的这个zzy用户访问到,这个需要额外的配置,否则我们下面进行这个后端的代码编写的时候就会出错,这个就是我的亲生经历,因为我当时听到这个地方的时候感觉这个新建用户和云主机没啥,没想到后端进行链接的时候就会使用到这个地方我们自己新建的这个虚拟主机和我们的这个个人的用户
5.4多此一举
我自己也是在这个地方犯了错误,所以为了截图,特意新建一个账户,就是下面的这个可以看到的这个zzy2,可以看到这个默认是没有访问权限的,就是这个黄色的部分;
这个时候我们的做法就是把这个下拉框里面找到我们的这个mq虚拟主机,这个就是建立连接;
再次返回的时候我们就可以看到我们的设置的效果是生效的;
这个时候我们使用这个虚拟主机进行查看,发现这个是也同步上的,就是说,我们可以在这个用户端操作,也可以在这个虚拟主机上面操作,只要在这个一方上面进行操作,另外一方都是可以看到这个变化的,我们在一个上面进行操作就可以了;
6.快速入门
6.1引入依赖
首先需要到这个中央仓库去找:
然后导入到我们的这个pom.xml文件里面去:(这个时候可能会遇到这个加载不出来的情况,可以考虑使用我们的国内源,我自己遇到了这个情况,使用国内源就是可以解决的);
6.2生产者消费者代码
java
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 Producter {
public static void main(String[] args) throws IOException, TimeoutException {
//1.下面的这个就是建立连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("*****");//这个就是我们自己的这个IP号
connectionFactory.setPort(5672);//这个就是我们使用的端口,需要提前开放
connectionFactory.setUsername("***");
//这个就是我们的用户名字,需要我们在web页面的时候设置好
connectionFactory.setPassword("******");
//这个就是我们的新增用户的时候设置的密码
connectionFactory.setVirtualHost("**");
//上面的这个就是我们的虚拟主机的名字,也是需要我们自己去建立起来的
Connection connection = connectionFactory.newConnection();
//2.下面的这个就是开放信道
Channel channel = connection.createChannel();
//3.声明交换机---内置的交换机
//4.声明队列---
/**
* (String queue, boolean durable, boolean exclusive, boolean autoDelete,
Map<String, Object> arguments
* quene:队列的名称
* durable;是否可以持久化
* exclusive:是否可以独占
* autoDelete:是否可以自动删除
* arguments:这个标识的就是参数
*/
channel.queueDeclare("hello", true, false, false, null);
//5.内置交换机都绑定了这个对应的队列
/**
* String exchange, String routingKey, BasicProperties props, byte[] body
* exchange表示的就是我们的这个交换机的名字
* routingKey是那个队列的名字,这个就会发送给那一个队列
* props属性配置
* body就是我们传递的消息
*/
String msg="hello RabbitMQ!!";
channel.basicPublish("", "hello", null, msg.getBytes());
//下面的这个就是我们不去定义这个meg这个字符串,直接去调用这个getbytes方法也是可以成功的
//channel.basicPublish("", "hello", null, ("Hello World").getBytes());
System.out.println("消息发送成功");
//6.资源释放
channel.close();
connection.close();
}
}
6.3查看效果
我们可以看到这个消息已经被我们的这个消费者接收到了,证明这个交互的过程是没有问题的;