【RabbitMQ】入门RabbitMQ一篇就够了!(图解架构,图解工作模式,快速入门Demo)

news/2024/6/16 2:39:59 标签: rabbitmq, java, 工作模式

产品简介

2007年,Rabbit技术公司基于AMQP(Advanced Message Queuing Protocol,高级消息队列协议)开发的 RabbitMQ1.0 发布。

RabbitMQ由 Erlang 语言开发。Erlang尤其以高性能、健壮以及可伸缩性出名,是专门用于高并发和分布式的一种语言。

另外,RabbitMQ是开源的。

 
 

架构图解

这张图解极其重要!!!

在这里插入图片描述

Broker

接收和分发消息的应用,其实Broker就是RabbitMQ Server。

Virtual Host

出于多用户和安全因素的设计,引入了Virtual Host的概念。这其实是一个虚拟分组(类似于namespace),多个用户使用同一个Broker的时候,会在各自的Virtual Host中创建自己的Exchange/Queue。

Connection

是Producer与Broker,Consumer与Broker之间的TCP连接。

Channel

如果每访问一次Broker就建立一个Connection,那么开销将是巨大的。Channel是在Connection内部建立的、相互独立的、一个线程一个的逻辑连接。你可以这么记忆:Channel就是小小Connection。

Exchange

交换机是消息到到达Broker的第一站。一个Exchange可以绑定(Blinding)若干个Queue,并且Exchange可以根据消息的不同将其路由(Routing)到不同的Queue中。

Queue

其实可以说Exchange和Queue组成了RabbitMQ的核心。Exchange不具备存储能力,只进行转发;消息被放到Queue中被暂存,并等待被取走。

 
 

工作模式

在这里插入图片描述

快速说明

java">前两种模式发送方本质相同([面向队列]不使用交换机;实际上用的是默认的;路由键与队列同名)
channel.basicPublish("", "hello_Queue", null, "我是一个消息".getBytes());
channel.basicPublish("", "workqueue_Queue", null, "我是一个消息".getBytes());

后三种模式发送方本质相同([面向交换机]使用交换机;交换机的类型不同)
channel.basicPublish("fanout_Exchange", "", null, "我是一个消息".getBytes());
channel.basicPublish("direct_Exchange", "apple", null, "我是一个消息".getBytes());
channel.basicPublish("topic_Exchange", "apple.com", null, "我是一个消息".getBytes());

而从接收方的角度看,都是面向队列的(看图很好理解)

 
 

快速入门

这里我们用一个HelloWorld来快速入门,使用的是Hello简单模式(即一个Producer,一个Consumer,不使用交换机)。

❶ 在虚拟机中安装并开启RabbitMQ服务

$ service rabbitmq-server start
$ service rabbitmq-server stop
$ service rabbitmq-server restart

❷ 新建两个模块

java">workspace
├── rabbitmq-producer
└── rabbitmq-consumer

❸ 在两个pom.xml中都添加依赖

<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.6.0</version>
</dependency>

❹ 编写生产者代码

java">public class ProducerHello {
    public static void main(String[] args) throws IOException, TimeoutException {

        // 1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2.设置参数
        factory.setHost("10.211.55.4");
        factory.setPort(5672);
        factory.setVirtualHost("/lolivm");
        factory.setUsername("admin");
        factory.setPassword("admin");

        // 3.创建连接(Connection)
        Connection connection = factory.newConnection();

        // 4.创建通道(Channel)
        Channel channel = connection.createChannel();

        // 5.创建队列(Queue)
        channel.queueDeclare("hello_Queue", true, false, false, null);

        // 6.发送消息
        channel.basicPublish("", "hello_Queue", null, "我是一个消息".getBytes());

        // 7.释放资源
        channel.close();
        connection.close();

    }
}

// 参数说明

// queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
        // 1.queue:队列名称
        // 2.durable:是否持久化
        // 3.exclusive:是否独占
        // 4.autoDelete:是否自动删除(失去最后一个消费者时)
        // 5.arguments:参数
        // 注意:如果存在同名队列,则不会发生创建

// basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body)
        // 1.exchange:交换机名称
        // 2.routingKey:路由名称
        // 3.props:配置信息
        // 4.body:发送的消息数据

❺ 编写消费者代码

java">public class ConsumerHello {
    public static void main(String[] args) throws IOException, TimeoutException {

        // 1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2.设置参数
        factory.setHost("10.211.55.4");
        factory.setPort(5672);
        factory.setVirtualHost("/lolivm");
        factory.setUsername("admin");
        factory.setPassword("admin");

        // 3.创建连接(Connection)
        Connection connection = factory.newConnection();

        // 4.创建通道(Channel)
        Channel channel = connection.createChannel();

        // 5.创建队列(Queue)
        channel.queueDeclare("hello_Queue", true, false, false, null);

        // 6.接收消息
        channel.basicConsume("hello_Queue", true, new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println(new String(body));
            }
        });

    }
}

// 参数说明

// basicConsume(String queue, boolean autoAck, Consumer callback)
        // 1.queue:队列名称
        // 2.autoAck:是否自动确认
        // 3.callback:回调对象

❻ 开启RabbitMQ图形化管理界面查看效果

java">// 端口号是固定的,具体IP地址要看你在哪里开的RabbitMQ服务
http://10.211.55.4:15672

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🐰 Rabbit~


http://www.niftyadmin.cn/n/1329966.html

相关文章

【RabbitMQ】Spring整合RabbitMQ

核心配置文件 生产者思路&#xff1a; 首先用加载进去的资源文件&#xff0c;创建一个connectionFactory连接工厂&#xff1b;创建队列Bean对象&#xff08;简单模式、工作队列模式直接创建Queue即可&#xff1b;广播模式、路由模式、通配符模式还要新建Exchange并绑定Queue&a…

mysql多表和事务

多表查询&#xff1a; * 查询语法&#xff1a; select 列名列表 from 表名列表 where.... * 准备sql # 创建部门表 CREATE TABLE dept( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) ); INSERT INTO dept (NAME) VALUES (开发部),(市场部),(财务部); # 创建员工表 CRE…

jdbc笔记

JDBC&#xff1a;1. 概念&#xff1a;Java DataBase Connectivity Java 数据库连接&#xff0c; Java语言操作数据库* JDBC本质&#xff1a;其实是官方&#xff08;sun公司&#xff09;定义的一套操作所有关系型数据库的规则&#xff0c;即接口。各个数据库厂商去实现这套接口…

【SpringBoot】整合SpringMVC

Web相关依赖 还记得在HelloSpringBoot中引入的web启动器吗&#xff1f;再来重新审视一下&#xff1a; 原来&#xff0c;它不仅整合了内置的tomcat服务器&#xff0c;还把spring-web/sping-webmvc的相关依赖都引入了。 通过SpringBoot的自动配置原理&#xff0c;有了依赖&…

【SpringBoot】整合JDBC、事务、连接池

整合JDBC jdbc是Spring极其重要的配置。而在SpringBoot中&#xff0c;只需要一个启动器即可&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId> </dependency>但…

jdbc连接池JdbcTemplate

数据库连接池1. 概念&#xff1a;其实就是一个容器(集合)&#xff0c;存放数据库连接的容器。当系统初始化好后&#xff0c;容器被创建&#xff0c;容器中会申请一些连接对象&#xff0c;当用户来访问数据库时&#xff0c;从容器中获取连接对象&#xff0c;用户访问完之后&…

【SpringBoot】整合MyBatis

整合MyBatis SpringBoot官方并没有提供MyBatis的启动器&#xff0c;不过由MyBatis官方自己实现了。有了启动器&#xff0c;MyBatis的配置也变得无比简单。只需要以下3步&#xff5e; ① 引入MyBatis启动器依赖 <dependency><groupId>org.mybatis.spring.boot<…

【LeetCode】Sama的个人记录_57

下面这种KMP写法比较优雅&#xff0c;而且好背。可配合题解食用&#xff1a;https://leetcode-cn.com/problems/implement-strstr/solution/dai-ma-sui-xiang-lu-kmpsuan-fa-xiang-jie-mfbs/class Solution {public int strStr(String haystack, String needle) {if (needle.le…