目录
3.发布/订阅模式(Publish/Subscribe Mode)
一、安装RabbitMQ
1.yum安装
Ⅰ.安装或更新yum插件
sudo yum update
我这个是安装过的样子
Ⅱ.安装 Erlang
RabbitMQ基于Erlang语法,高效但是需要Erlang支持
我们之后要下载的是rabbitMQ 3.10 需要
首先安装存储库
sudo yum install epel-release
中间会询问是否安装,输入y就行了
创建yum的erlang数据库(直接下载版本太低了)
cd /etc/yum.repos.d
sudo touch /etc/yum.repos.d/erlang.repo
vi erlang.repo
编写文件为
[erlang-solutions]
name=CentOS $releasever - $basearch - Erlang Solutions
baseurl=https://packages.erlang-solutions.com/rpm/centos/$releasever/$basearch
gpgcheck=1
gpgkey=https://packages.erlang-solutions.com/rpm/erlang_solutions.asc
enabled=1
如果之前安过低版本要先删除
后面改成你的版本
sudo yum remove erlang-erts-R16B-03.18.el7.x86_64
然后就可以安装
sudo yum install erlang
我们没有添加公钥,会警告一下
然后输入y就行了
Ⅲ、创建yum的RabbitMQ官方存储库
添加 RabbitMQ 的官方存储库密钥到系统
sudo rpm --import https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc
添加 RabbitMQ 的官方存储库到 yum:
sudo touch /etc/yum.repos.d/rabbitmq.repo
然后修改这个文件
cd /etc/yum.repos.d
vi rabbitmq.repo
[rabbitmq]
name=rabbitmq
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/7/$basearch
enabled=1
gpgcheck=0
repo_gpgcheck=0
Ⅳ、安装RabbitMQ
查看可用版本
sudo yum --disablerepo="*" --enablerepo="rabbitmq" list available
可安装版本是3.10.0-1 官网最新版本是3.12.2 如果想要安装最新版本可以先使用其他方法
我们选择安装
sudo yum install rabbitmq-server
如果提示版本不足,请记住版本号之后,回到上面安装Erlang的步骤删除旧版本,重新安装erlang到正确版本
这样就安装好了
安装之后的路径在
/usr/lib/rabbitmq
Ⅴ、启动RabbitMQ
和其他的软件一样,如果需要外部服务器访问,需要更改防火墙
检查防火墙状态
sudo systemctl status firewalld
如果防火墙未启用(启用了可以跳过,虚拟机也可以不开防火墙,但养成习惯服务器不会忘记)
便输入下面指令开启防火墙
sudo systemctl start firewalld
开启5672和15672 (后者是控制台)
firewall-cmd --add-port=5672/tcp --permanent
firewall-cmd --add-port=15672/tcp --permanent
提示success就对了(我这个是重复添加)
重新加载防火墙
firewall-cmd --reload
提示success
验证端口是否打开(这样出现了连接不上可以排除这里)
firewall-cmd --query-port=15672/tcp
firewall-cmd --query-port=5672/tcp
出现yes就是对的了
启动管理工具
rabbitmq-plugins enable rabbitmq_management
如果报下面的错就是15672被占用,可能是重复开启(如果提前改了配置文件再重启服务也能达到上面那个指令效果)
我们可以查看下端口占用
sudo ss -tlnp | grep 15672
选一个允许 如果不是centos 7 还有其他的指令
sudo netstat -tlnp | grep 15672
占用端口15672的进程是beam.smp
,它是RabbitMQ服务器的核心进程。这意味着RabbitMQ管理插件已经在监听15672端口,并且正常工作。
如果不是beam.smp我们可以杀死之后,再启动管理工具
sudo kill <PID> -- 实例代码 <PID> 换成想杀死的队列
sudo kill 15672
Ⅵ 、登录RabbitMQ的后台
我们新建一个用户,并赋予管理员权限,来远程访问我们控制台
rabbitmqctl add_user admin admin
前面是用户名,后面是密码 密码还是改复杂点
新建了一个简单用户怕不安全,可以用下面指令改密码
sudo rabbitmqctl change_password admin <新密码>
赋予管理员权限
rabbitmqctl set_user_tags admin administrator
然后我们可以去主机访问下虚拟机或者服务器(这次没有用虚拟机,没有安装图形化和浏览器就只演示主机连接虚拟机,平时在本地访问对应端口是确保真的启动了软件)
你的虚拟机ip或者服务器公网ip:15672
然后输入刚才新建的用户就登录上去了
Ⅶ、让guest可以远程登录
guest拥有最高的权限但是不能在非本机登录(比如服务器就得登服务器,我用主机连接服务器的rabbit并登录guest,就会被拒绝)
可是需要guest的权限来做事情,服务器又没有图形化,直接敲命令又不熟练差点把人急死
我们需要改配置
/etc/rabbitmq
如果有rabbitmq.config就修改,没有就新建
touch rabbitmq.config
vi rabbitmq.config
确保里面有
[{rabbit, [{loopback_users, []}]}].
这个时候重启就行了
sudo systemctl restart rabbitmq-server
重启访问
http://rabbitmq的主机地址:15672/
就能用guest登录了
登录之后去改密码
一些需要高权限的事情,就用guest做,平时还是用admin
二、java代码实战RabbitMQ的五种消息模型
前置准备
Ⅰ.新建host
首先在后台新建host并创建响应的队列
可以只输入一个名字
然后 Add virtual host
这里就有我们配置好的,点击这个加减可以选择显示的属性
Ⅱ.新建队列
然后我们还要创建队列
点击add a newqueue之后
这里就有我们刚新建的host了
我们看见了队列的三种类型,分别是下面三种,我们只要经典队列就行了
经典队列(Classic Queue): 经典队列(也称为普通队列)是 RabbitMQ 最常见和默认的队列类型。它支持多个消费者并且提供了传统的消息传递模式。
Quorum 队列(Quorum Queue): Quorum 队列是 RabbitMQ 3.8 版本引入的一种新的队列类型。它基于 Raft 一致性协议,提供更高的可靠性和良好的扩展性。Quorum 队列适用于高吞吐量和高可靠性的应用场景。
流队列(Stream Queue): 流队列是 RabbitMQ 3.9 版本中引入的新队列类型。它是为了解决大规模事件流处理而设计的。流队列支持发布/订阅模式,具备持久化和分区等特性,能够处理大量的事件流数据。
这里我们就建好了
Ⅲ、新建项目
新建一个maven项目(基于IDEA 2023.2 演示 如果版本相同,缺很多东西一般是教育免费版)
在pom.xml中添加依赖
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
再编写一下工具来进行RabbitMQ的连接
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
public class MQUtils {
public static final String QUEUE_NAME = "myqueue01"; //队列1 我们刚才新建了
public static final String QUEUE_NAME2 = "myqueue02"; //队列2 我们没有新建 (也可以在使用的时候直接写名字)
public static final String EXCHANGE_NAME = "myexchange01"; //路由名字 后面要定义
public static final String EXCHANGE_NAME2 = "myexchange02";
public static final String EXCHANGE_NAME3 = "myexchange03";
/**
* 获得MQ的连接
* @return
* @throws IOException
*/
public static Connection getConnection() throws IOException {
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost"); // 服务器的主机名
connectionFactory.setPort(5672); // 服务器的主机名
connectionFactory.setVirtualHost("myhost"); //我们虚拟出来的主机名(刚才新建的主机名)
connectionFactory.setUsername("admin"); //我们新建的用户
connectionFactory.setPassword("123456"); //以及我们新建用户的密码
return connectionFactory.newConnection(); // 返回Connection用于后续操作
}
}
1.简单模式(Simple Mode) / 一对一模式
首先来熟悉一下简单模式的流程
发布者(Producer) --> 队列(Queue) --> 消费者(Consumer)
①.生产者将消息直接发送到一个队列。
②.消费者从队列中接收消息并进行处理。
明确了需要的东西之后我们开始建包(不理解生产者消费者的,可以去我的主页的堵塞队列里面看一下,讲的 比较俗 易懂)
首先是生产者
import com.cece.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
import com.cece.utils.MQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import java.io.IOException;
/*
* 简单模式的生成者 将消息直接发送到一个队列
*/
public class SimpleProducer {
public static void main(String[] args) throws IOException {
// 获取与 RabbitMQ 的连接
Connection connection = MQUtils.getConnection();
// 创建通道
Channel channel = connection.createChannel();
// 定义队列
// 参数说明:
// - MQUtils.QUEUE_NAME: 队列名称
// - false: 指定队列是否持久化,false 表示不持久化
// - false: 指定当所有消费者客户端连接断开时,是否删除队列。false 表示不删除
// - false: 指定是否独占队列。false 表示队列可以被多个消费者监听
// - null: 其他属性,比如队列的消息过期时间等。这里为 null
channel.queueDeclare(MQUtils.QUEUE_NAME, false, false, false, null);
// 要发送的消息内容
String msg = "Hello World!";
// 发布消息到队列
// 参数说明:
// - "": 交换机名称。空字符串表示直接发送到队列,不经过交换机
// - MQUtils.QUEUE_NAME: 队列名称