RabbitMQ消息中间件
RabbitMQ介绍与安装
1.RabbitMQ的介绍
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(也称为消息的中间件)。AMQP(Advanced Message Queuing Protocol)高级消息队列协议:客户端向MQ发送的消息协议是AMQP协议。JMS(Java Message Server)一样,都是一种消息规范,相比而言可定是AMQP高级一些。
2.MQ的功能
1)异步处理:把用户的请求发送给消息中间件后,消息中间件会先进行局部响应,不需要用户等待。
2)应用解耦:模块和模块之间没有强耦合,都是通过某个中间件进行连接的
3)流量消峰:在某一段时间内,突然发生了高并发,如果某个服务器承受不住,那么添加中间件就会将当前的请求存储到队列中,一个一个处理,不会全部直接请求服务器保证了服务器的安全性。
没有添加消息中间件:
添加消息中间件
AMQP和JMS区别:
JMS是定义一套java接口,对消息处理进行了统一操作,但是AMQP是通过规定协议的方式统一数据交互的。JMS必须使用java语言操作,AMQP只是协议,不是实现代码,跨语言的。
JMS中只定义了两种消息模式,但是AMPQ消息模式很多,很丰富。
使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、ZeroMQ、kafka、MetaMQ、RocketMQ
ActiveMQ:apache公司的
Kafka:一般大数据领域应用多,吞吐量达,不用考虑数据安全性
RecketMQ:是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。支持多种客户端,安全性能好。(推荐使用RabbitMQ,RabbitMQ用的是AMQP协议)。
创建虚拟节点
RabbitMQ管理平台默认地址:http://localhost:15672
默认用户名和密码是:guest和guest,最好不要用整个用户操作。
1、使用guest登陆后,选择admin,创建一个新用户xxx。
2、创建虚拟节点/hello
3、添加成功
4、设置虚拟节点的权限(给哪个用户用)
RabbitMQ五种消息模式
RabbitMQ提供了五种消息模型(其实一共7种,第六种RPC远程服务调用,第七种发布确认)以下只解释了五种,基本消息模式,工作队列模式,Fanout订阅模式,Direct订阅模式,Topic订阅模式。
编写客户端连接RabbitMQ服务器
生产者与消费者模式(一对一)
1.创建工程
2.导入RabbitMQ依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
3.编写连接工具类
public class RabbitMQUtil {
/**
* 就是封装以下我们获取连接的步骤:
* @throws IOException
* @throws TimeoutException
*/
public static Connection getConnection() throws IOException, TimeoutException {
//1.创建连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
//2.设置连接地址 我使用的windows 所以是localhost
connectionFactory.setHost("localhost");
//3.端口号 ,因为是java客户端,所以用amqp协议
connectionFactory.setPort(5672);
//4.设置用户名,密码 , 虚拟节点名
connectionFactory.setVirtualHost("/hello");
connectionFactory.setUsername("Gyz");
connectionFactory.setPassword("123123");
Connection connection = connectionFactory.newConnection();
return connection;
}
}
4.端口号解释
Protocol | Boundto | Port |
---|---|---|
ampq(高级消息队列协议) | :: | 5672(java客户端连接) |
clustering | :: | 25672(集群) |
http | :: | 15672(浏览器访问) |
5.编写案例:Hello World
工作队列模式
1.如果先运行消息的提供方,在运行消息的消费方,谁优先启动,谁就直接获取了所有的消息
2.如果我们先把两个消费者方启动后,监听消息的提供方,提供数据的时候,那么我们两个消费方就会均匀的拿取数据,因为RabbitMQ属于轮询方式发送消息,所以RabbitMQ会自动把数据分配好
3.如果我们先把两个消费者方启动后,在提供数据,有一个消费者出现了阻塞状态,可以设置成能者多劳的模式,要出现这个模式的前提要关闭ack自动确认机制,在使用channel.basicQos(1),设置每次拿一个消息,消费一个后再去拿第二个,当出现阻塞的时候就不会出现第二种情况
能者多劳模式的运行结果
消费者1 接收的信息为: 第1条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第3条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第5条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第6条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第8条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第9条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第11条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第12条: 地瓜地瓜 我是土豆
消费者1 接收的信息为: 第