RabbitMQ入门学习笔记

Posted dxj1016

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RabbitMQ入门学习笔记相关的知识,希望对你有一定的参考价值。

狂神视频–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、概述

RabbitMQ官网

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.2、安装RabbitMQ

RabbitMQ是采用Erlang语言开发的,所以系统环境必须提供Erlang环境,第一步就是安装Erlang

Windows安装参考这里:

服务器上安装步骤Erlang和RabbitMq步骤:

  1. 安装Erlang
    Erlang下载地址
    在这里插入图片描述
    ==安装完Erlang后记得安装socat插件
  2. 安装RabbitMQ
    RabbitMQ下载地址
    在这里插入图片描述
  3. RabbitMQWeb管理界面及授权操作
    在这里插入图片描述
    这里访问端口是15672,如果不可以访问,那么看看服务器的安全组该端口号是否开放了
    在这里插入图片描述
    如果端口号开放了,但是还是无法访问:
    在这里插入图片描述
    如果出现以下界面,说明不能访问和登录,那么需要收钱账号和密码
  4. 授权账号和密码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  5. 小结
    在这里插入图片描述

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简单模式

简单模式理解请看视频老师讲解

  1. 实现步骤
    在这里插入图片描述

  2. 构建一个maven项目
    在这里插入图片描述

  3. 导入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>
  1. 生产者
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.
消息发送成功
 */
  1. 启动生产者类,查看RabbitMQ界面可以看到有生产者出现:http://localhost:15672/#/queues
    在这里插入图片描述

  2. 消费者类

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发布订阅模式

发布订阅模式理解请看视频老师讲解
在这里插入图片描述

  1. 生产者类
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入门学习笔记

RabbitMQ学习笔记(持续更新ing)

我说这是新手入门最好的RabbitMQ学习笔记,谁赞成谁反对?

我说这是新手入门最好的RabbitMQ学习笔记,谁赞成谁反对?

RabbitMQ学习笔记-p1(初识MQ&快速入门)

AngularJS入门学习笔记一