RabbitMq学习

官网 https://www.rabbitmq.com

一、安装需要的环境

1、Erlang语言环境安装

yum install erlang -y

安装语言并查看版本

erl -v

查找对应合适的rabbitmq

https://www.rabbitmq.com/which-erlang.html

2、安装插件

 yum -y install socat

安装socat插件

3、服务器开放端口

RabbitMQ默认监听5672,可视化界面15672

二、安装RabbitMQ

1、下载

在官网找到合适的版本的安装包

https://github.com/rabbitmq/rabbitmq-server/releases

目前服务器上安装的是 ErlangOpt22,安装rabbitmq版本为3.8.3

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3-1.el7.noarch.rpm

2、安装

yum install -y rabbitmq-server-3.8.3-1.el7.noarch.rpm

3、常用命令

#启动
service rabbitmq-server   start
#停止
service rabbitmq-server   stop
#重启
service rabbitmq-server   restart
#开启管理界面
rabbitmq-plugins enable rabbitmq_management
用户设置
#设置用户名密码 rabbitmqctl add_user 【账号】 【密码】
rabbitmqctl add_user admin admin
#给用户设置标签
rabbitmqctl set_user_tags admin administrator
#授权命令
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
标签

administrator 总管理员 所有权限

monitoring 监控者 登录控制台 查看所有信息

policymaker 策略定制者 登录控制台 制定策略

management 管理员 登录控制台

三、RabbitMQ的简单应用

1、创建连接

//1、创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
//rabbitmq主机
connectionFactory.setHost("43.139.20.236");
//端口号
connectionFactory.setPort(5672);
//用户名
connectionFactory.setUsername("admin");
//密码
connectionFactory.setPassword("admin");
//虚拟机地址
connectionFactory.setVirtualHost("/");

2、获取连接与通道

 //2、创建连接connection
Connection connection = connectionFactory.newConnection("生产者");
//3、通过连接获取通道channel
Channel channel = connection.createChannel();

3、发送消息(生产者)

消息为二进制的数据

//队列名称
String queueName = "queue1";
/*
    方法参数
* String var1 - 队列名称
* boolean var2 - 是否持久化 非持久化重启后丢失
* boolean var3 - 是否排他性
* boolean var4 -  是否自动删除  最后一个消费者消费完是否删除队列
* Map<String, Object> var5 - 携带附带参数,给消费者使用
*/
channel.queueDeclare(queueName, false, false, false, null);
//5、准备消息给队列
String msg = "Hello,I'm RabbitMQ.";
//6、发送消息给队列
/*
    方法参数
* String var1
* String var2 - 队列名称
* BasicProperties var3 - 消息计划
* byte[] var4 -  消息内容二进制数组
*/
channel.basicPublish("", queueName, MessageProperties.PERSISTENT_TEXT_PLAIN, msg.getBytes(StandardCharsets.UTF_8));

4、接受消息(消费者)

String queueName = "queue1";
//参数1:队列名称
//参数2:
//参数3:成功回调
//参数4:失败回调
channel.basicConsume(queueName, true, (s, delivery) -> {
    //正常返回回调
    //字节流
    byte[] body = delivery.getBody();
    String msg = new String(body);
    log.info("接受到的消息为:{}", msg);
}, s -> {
    //异常返回回调
    log.error("接受消息失败...");
    log.error("收到参数为:{}",s);
});

四、常用的工作模式

1、简单模式

img

指定某个队列进行消息推送,消费中从某个队列中取出

2、工作模式

img

发送消息到某个对列中,消费者存在竞争关系,只能消费一次

3、发布/订阅模式

img

type = fanout

通过设置交换机,交换机绑定多个对列表,后续发布消息则只需要通过交换机,交换机会发送到所有的队列中,便于不同消费者的使用

4、指定订阅模式

img

type = direct

在发布订阅的基础上,增加路由key的过滤,交换机根据不同的路由key绑定队列,根据消息中的路由key来指定需要发送消息到哪些路由中。

5、主题模式

img

type = topic

主题模式在指定订阅模式上优化了路由key的过滤,增加了对key值的模糊匹配,消息发送至满足条件的队列

*:为有1个

#:为任意个数,可为0

1、 *.com.*  匹配条件为前后数量各1个,例如: xxx.com.order格式可匹配
2、 #.com.#  匹配条件为前后数量不限  例如 com , xxx.com , com.order , xxx.com.order都可匹配
3、 #.com.*  匹配条件为前不限制,后为1个

6、位置与遥控模式

img