RabbitMQ入门学习笔记
Posted dxj1016
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ入门学习笔记相关的知识,希望对你有一定的参考价值。
1、中间件
1.1、什么是中间件
1.2、为什么需要使用消息中间件
1.3、中间件特点
1.4、在项目中什么时候使用中间件技术
1.5、课程的规划和安排
学习目标
学习中间件的方式和技巧
2、中间件技术及架构的概述
2.1、什么是消息中间件
2.2、单体架构
2.3、分布式架构
存在问题:
好处:
3、基于消息中间件的分布式系统的架构
3.1、基于消息中间件的分布式系统的架构
3.2、消息中间件应用的场景
3.3、常见的消息中间件
- ActiveMQ
- RabbitMQ
- Kafka
- RocketMQ
- 等等
3.4、消息中间件的本质及设计
3.5、消息中间件的核心组成部分
- 消息的协议
- 消息的持久化机制
- 消息的分发策略
- 消息的高可用,高可靠
- 消息的容错机制
3.6、小结
4、消息队列协议
4.1、什么是协议
4.2、网络协议的三要素
面试题
4.3、AMQP协议
4.4、MQTT协议
4.5、OpenMessage协议
4.6、Kafka协议
4.7、小结
5、消息队列持久化
5.1、持久化
5.2、常见的持久化方式
6、消息的分发策略
6.1、消息的分发策略
6.2、场景分析一
6.3、场景分析二
6.4、消息分发策略的机制和对比
7、消息队列高可用和高可靠
7.1、什么是高可用机制
7.2、集群模式1–Master-salve主从共享数据的部署方式
7.3、集群模式2–Master-salve主从同步部署方式
7.4、集群模式3–多主集群同步部署模式
7.5、集群模式4–多主集群转发部署模式
7.6、集群模式5–Master-salve与Breoker-cluster组合的方案
7.7、什么是高可靠机制
8、RabbitMQ入门及安装
8.1、概述
8.2、安装RabbitMQ
RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,第一步就是安装Erlang
服务器上安装步骤Erlang和RabbitMq步骤:
- 安装Erlang
Erlang下载地址
==安装完Erlang后记得安装socat插件 - 安装RabbitMQ
RabbitMQ下载地址
- RabbitMQWeb管理界面及授权操作
这里访问端口是15672,如果不可以访问,那么看看服务器的安全组该端口号是否开放了
如果端口号开放了,但是还是无法访问:
如果出现以下界面,说明不能访问和登录,那么需要收钱账号和密码 - 授权账号和密码
- 小结
8.3、Docker安装RabbitMQ
虚拟化容器技术–Docker的安装
Docker的相关命令
docker安装rabbitmq
8.4、RabbitMQ的角色分类
8.5、AMQP的介绍
8.6、RabbitMQ的核心组成部分
RabbitMQ整体框架是是什么样子的?
RabbitMQ的运行流程
9、RabbitMQ入门案例
9.1、RabbitMQ支持消息的模式
9.2、Simple简单模式
-
实现步骤
-
构建一个maven项目
-
导入RabbitMQ的maven依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.9.0</version>
</dependency>
- 生产者
package cn.dxj1016.rabbitmq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
public static void main(String[] args) {
// 所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitmq遵循的是amqp协议
// ip port
// 1:创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
Connection connection=null;
Channel channel = null;
// 2:创建连接Connection
try {
connection = connectionFactory.newConnection("生产者");
// 3:通过连接获取通道Channel
channel = connection.createChannel();
// 4:通过通道创建交换机,声明队列,绑定关系,路由key,发送消息,和接收消息
String queueName = "queue1";
/**
* @params1 队列的名称
* @params2 是否要持久化durable=false 所谓持久化消息就是是否存盘,如果false 非持久化 ,true是持久化,非持久会存盘吗?
* @params3 排他性,是否独占独立
* @params4 是否自动删除,随着最后一个消费者消息完毕消息以后把队列自动删除
* @params5 携带附属参数
*/
channel.queueDeclare(queueName, false, false, false, null);
// 5:准备消息内容
String message = "Hello dxj1016";
// 6:发送消息给队列queue
channel.basicPublish("",queueName,null,message.getBytes());
System.out.println("消息发送成功");
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7:关闭连接
if (channel != null && channel.isOpen()) {
try {
channel.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 8:关闭通道
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
执行结果:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
消息发送成功
*/
-
启动生产者类,查看RabbitMQ界面可以看到有生产者出现:http://localhost:15672/#/queues
-
消费者类
package cn.dxj1016.rabbitmq.simple;
import com.rabbitmq.client.*;
import java.io.IOException;
public class Consumer {
public static void main(String[] args) {
// 所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitmq遵循的是amqp协议
// ip port
// 1:创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
Connection connection=null;
Channel channel = null;
// 2:创建连接Connection
try {
connection = connectionFactory.newConnection("消产者");
// 3:通过连接获取通道Channel
channel = connection.createChannel();
// 4:通过通道创建交换机,声明队列,绑定关系,路由key,发送消息,和接收消息
channel.basicConsume("queue1", true, new DeliverCallback() {
public void handle(String consumerTag, Delivery message) throws IOException {
System.out.println("收到消息是:" + new String(message.getBody(), "UTF-8"));
}
},new CancelCallback(){
public void handle(String consumerTag) throws IOException{
System.out.println("接收失败了。。。");
}
});
System.out.println("开始接收信息");
System.in.read();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 7:关闭连接
if (channel != null && channel.isOpen()) {
try {
channel.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 8:关闭通道
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
执行结果:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
开始接收信息
收到消息是:Hello dxj1016
*/
9.3、fanout发布订阅模式
- 生产者类
package cn.dxj1016.rabbitmq.routing;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
public static void main(String[] args) {
// 所有的中间件技术都是基于tcp/ip协议基础之上构建新型的协议规范,只不过rabbitmq遵循的是amqp协议
// ip port
// 1:创建连接工程
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("localhost");
connectionFactory.setPort(5672);
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");
Connection connection=null;
Channel channel = null;
// 2:创建连接Connection
try {
connection = connectionFactory.newConnection("生产者");
// 3:通过连接获取通道Channel
channel = connection.createChannel();
// 4:准备消息内容
String message = "Hello dxj1016";
// 5:准备交换机(为什么,这里没有绑定队列关系,是因为已经用图形用户界面绑定了,所以不需要在代码里绑定了)
String exchangeName = "fanout-exchange";
// 6: 定义路由key
String routeKey = "";
// 7:指定交换机的类型
String type = "fanout";
// 8:发送消息给中间件rabbitmq-server
/**
* @params1 交换机exchange
* @params2 队列名称routeKey
* @params3 属性配置
* @params4 发送消息的内容
*/
channel.basicPublish(exchangeName, routeKey, null, message.getBytes());
System.out.println("消息发送成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("消息发送异常");
} finally {
// 7:关闭连接
if (channel != null && channel.isOpen()) {
try {
channel.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 8:关闭通道
if (connection != null && connection.isOpen()) {
try {
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
/*
执行结果:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
消息发送成功
*/
注意这里没有跟上面那个简单模式一样在代码中绑定队列,是因为已经在图形管理界面设置了绑定, 如下:
启动生产者类可以发现下列改变:
2. 消费者类
package cn.dxj1016.rabbitmq.routing;
import com.rabbitmq.client.*;
import java.io.IOException<以上是关于RabbitMQ入门学习笔记的主要内容,如果未能解决你的问题,请参考以下文章
我说这是新手入门最好的RabbitMQ学习笔记,谁赞成谁反对?