返回顶部
首页 > 资讯 > 后端开发 > JAVA >【快速掌握RabbitMQ到实战】
  • 602
分享到

【快速掌握RabbitMQ到实战】

java-rabbitmqrabbitmqjava分布式中间件 2023-08-23 14:08:35 602人浏览 独家记忆
摘要

1.什么是消息队列 ● 消息队列(Message Queue)是一种用于在应用程序之间传递消息的通信方式,消息队列允许应用程序异步地发送和接收消息,并且不需要直接连接到对方。 ● 消息(Message)是指在应用间传送的数据。消息可以非常简

1.什么是消息队列

● 消息队列(Message Queue)是一种用于在应用程序之间传递消息的通信方式,消息队列允许应用程序异步地发送和接收消息,并且不需要直接连接到对方。
● 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象
● 队列(Queue)可以说是一个数据结构,可以存储数据。先进先出

2.消息队列有哪些作用和应用场景

2.1应用解耦
在这里插入图片描述
1. 传统模式下,如果库存系统异常无法访问,会导致下单失败;或者随着公司业务拓展,物流系统也需要接入下单信息,此时订单系统还需要增加调用物流系统的接口
2. 引入消息队列,用户下单后,将消息写入消息队列,返回下单成功;库存和物流系统通过订阅下单消息,获取下单信息,库存系统根据下单信息进行库存扣减操作,物流系统根据下单信息生成物流单;即使此时库存系统无法访问,但是不会影响下单流程。当库存系统恢复后可以正常消费消息

2.2异步提速


1. 传统模式下,用户从注册到响应成功,需要先保存注册信息,再发送邮件通知,邮件发送成功后再发送短息通知,短息发送成功后才响应给用户,用户体验不好
2. 引入MQ后,保存用户信息后,短信通知和邮件通知消息写入MQ(此过程耗时比较短)。极大的缩短了响应时间。增强用户体验

2.3流量削峰

在这里插入图片描述
3.认识一下RabbitMQ 加粗文本
一款基于AMQP(高级消息队列协议)用于软件之间通信的中间件,由Rabbit科技有限公司开发服务器端用Erlang语言编写,支持多种客户端,如:python、Ruby、.net、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
RabbitMQ四大核心:
● 生产者
● 消费者
● 队列
● 交换机
AMQP协议是一种二进制协议,它定义了一组规则和标准,以确保消息可以在不同的应用程序和平台之间传递和解释,AMQP协议包含四个核心组件:
● 消息
● 交换机
● 队列
● 绑定

4.RabbitMQ的安

六级标题4.1文件下载

RabbitMQ:https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/
erlang:Https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm?distro_version_id=140

4.2安装文件:

4.2.1 安装命令

// An highlighted blockvar foo = 'bar';

生成一个适合你的列表

rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm
yum install socat -y
rpm -ivh rabbitmq-server-3.8.16-1.el7.noarch.rpm
开机启动:chkconfig rabbitmq-server on
启动服务:/sbin/service rabbitmq-server start
查看服务状态:/sbin/service rabbitmq-server status
停止服务(选择执行):/sbin/service rabbitmq-server stop
开启WEB管理插件(先将服务关闭掉):rabbitmq-plugins enable rabbitmq_management
访问地址:http://192.168.16.128:15672/(默认端口号:15672),如果遇到访问不了,看看是否防火墙开着

关闭防火墙:systemctl stop firewalld
开机关闭防火墙:systemctl disable firewalld
查看防火墙状态:systemctl status firewalld

5.RabbitMQ的工作原理

在这里插入图片描述
**Broker:**接收和分发消息的应用,RabbitMQ Server 就是 Message Broker
Virtual host:Virtual host是一个虚拟主机的概念,一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange和Queue,同一个Virtual host中的Exchange和Queue不能重名,不同的Virtual host中的Exchange和Queue名字可以一样。这样,不同的用户在访问同一个RabbitMQ Broker时,可以创建自己单独的Virtual host,然后在自己的Virtual host中创建Exchange和Queue,很好地做到了不同用户之间相互隔离的效果。

Connection:publisher/consumer和borker之间的tcp连接

**Channel:**发送消息的通道,如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程 序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客 户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销

Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发 消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)

Queue:Queue是一个用来存放消息的队列,生产者发送的消息会被放到Queue中,消费者消费消息时也是从Queue中取走消息。

Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保 存到 exchange 中的查询表中,用于 message 的分发依据

6.如何实现生产者和消费者

6.1引入包依赖

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

6.2生产者代码

import com.rabbitmq.client.BuiltinExchangeType;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Producer {    //队列名    private static final String QUEUE_NAME = "hello-queue";    //交换机    private static final String EXCHANGE_NAME = "hello-exchange";    public static void main(String[] args) throws Exception {        //创建一个连接工厂        ConnectionFactory factory = new ConnectionFactory();        //服务地址        factory.setHost("192.168.16.128");        //账号        factory.setUsername("admin");        //密码        factory.setPassWord("123456");        //端口号        factory.setPort(5672);        //创建连接        Connection connection = factory.newConnection();        //创建信道        Channel channel = connection.createChannel();                channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, false, true, null);                channel.queueDeclare(QUEUE_NAME, false, false, false, null);                channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, QUEUE_NAME);                String message = "hello world";        channel.basicPublish(EXCHANGE_NAME, QUEUE_NAME, null, message.getBytes());        System.out.println("消息发送成功");    }}

6.2生产者代码

import com.rabbitmq.client.BuiltinExchangeType;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Producer {    //队列名    private static final String QUEUE_NAME = "hello-queue";    //交换机    private static final String EXCHANGE_NAME = "hello-exchange";    public static void main(String[] args) throws Exception {        //创建一个连接工厂        ConnectionFactory factory = new ConnectionFactory();        //服务地址        factory.setHost("192.168.16.128");        //账号        factory.setUsername("admin");        //密码        factory.setPassword("123456");        //端口号        factory.setPort(5672);        //创建连接        Connection connection = factory.newConnection();        //创建信道        Channel channel = connection.createChannel();                channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, false, true, null);                channel.queueDeclare(QUEUE_NAME, false, false, false, null);                channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, QUEUE_NAME);                String message = "hello world";        channel.basicPublish(EXCHANGE_NAME, QUEUE_NAME, null, message.getBytes());        System.out.println("消息发送成功");    }}

6.3消费者代码

import com.rabbitmq.client.CancelCallback;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.DeliverCallback;public class Consumer {    //队列名    private static final String QUEUE_NAME = "hello-queue";    public static void main(String[] args) throws Exception {        //创建一个连接工厂        ConnectionFactory factory = new ConnectionFactory();        //服务地址        factory.setHost("192.168.16.128");        //账号        factory.setUsername("admin");        //密码        factory.setPassword("123456");        //端口号        factory.setPort(5672);        //创建连接        Connection connection = factory.newConnection();        //创建信道        Channel channel = connection.createChannel();        //接受消息回调        DeliverCallback deliverCallback = (consumerTag, message)-> {            System.out.println(new String(message.getBody()));        };        //取消消息回调        CancelCallback cancelCallback = consumerTag ->{            System.out.println("消费消息被中断");        };                channel.basicConsume(QUEUE_NAME, true, deliverCallback, cancelCallback);    }}
由于篇幅太长就不一一写出来的,同时这个配有对应完整视频教程,从开始安装到文件下载,RabbitMQ底层原理,交换机类型剖析RabbitMQ集群搭建,配置镜像队列,RabbitMQ负载均衡等等非常全面,需要完整笔记和全套视频教程看文章末尾领取方式。

码字不易,如果大家觉得文章不错有帮助的记得点赞支持哦,谢谢大家!

来源地址:https://blog.csdn.net/weixin_51702416/article/details/129846285

--结束END--

本文标题: 【快速掌握RabbitMQ到实战】

本文链接: https://lsjlt.com/news/378614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【快速掌握RabbitMQ到实战】
    1.什么是消息队列 ● 消息队列(Message Queue)是一种用于在应用程序之间传递消息的通信方式,消息队列允许应用程序异步地发送和接收消息,并且不需要直接连接到对方。 ● 消息(Message)是指在应用间传送的数据。消息可以非常简...
    99+
    2023-08-23
    java-rabbitmq rabbitmq java 分布式 中间件
  • Pythonsubprocess库六个实例快速掌握
    目录subprocess例1-快速使用subprocess例2-subprocess.run()的返回值例3-全面的返回值介绍例4-代码有bug的情况例5-捕获stdout和stde...
    99+
    2024-04-02
  • 从零到英雄:掌握 DDL 的快速指南
    什么是 DDL 数据定义语言(DDL)是一种 SQL 语言,用于定义和修改数据库结构。它允许您创建、修改和删除数据库对象,如表、视图和索引。 DDL 命令 DDL 命令分为三类: 创建命令:用于创建新数据库对象,如 CREATE TA...
    99+
    2024-02-19
    DDL 数据定义语言 SQL MySQL PostgreSQL Oracle
  • 如何快速掌握Fink SQL
    这篇文章主要讲解了“如何快速掌握Fink SQL”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何快速掌握Fink SQL”吧!1、导入所需要的的依赖包&l...
    99+
    2024-04-02
  • 如何快速掌握Github Actions
    这篇文章主要介绍“如何快速掌握Github Actions”,在日常操作中,相信很多人在如何快速掌握Github Actions问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • Tree-Shaking 机制快速掌握
    目录写在前面直奔主题最后写在前面 最近在读霍老师的《Vue.js设计与实现》,感觉收获很多,由于霍老师是官方Vue维护成员,会从很通俗易懂的角度去讲Vue的实现细节。而不是按照源码...
    99+
    2023-02-16
    Tree-Shaking 机制 Tree Shaking
  • 快速掌握PyCharm的运行快捷键
    PyCharm是一款功能强大的Python集成开发环境,通过灵活的快捷键可以提高开发效率。本文将向您介绍PyCharm中常用的运行快捷键,并提供具体的代码示例,帮助您快速入门PyCha...
    99+
    2024-02-26
    运行 pycharm 快捷键 python程序
  • Java快速掌握Vector类方法
    目录Vector的基本介绍Vector类支持4种构造方法一些常用的方法1.add方法2.remove方法3.set方法4.size、capacity、get方法代码Vector的基本...
    99+
    2024-04-02
  • 如何快速掌握Python协程
    这篇文章主要讲解了“如何快速掌握Python协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何快速掌握Python协程”吧! 1. 协程相关的概念1.1 进程和线程进程(Pro...
    99+
    2023-06-15
  • 快速掌握VueRouter使用方法
    目录一、编程式路由导航二、缓存路由组件三、两个新的声明周期钩子四、路由守卫五、路由器的两种工作模式本篇博客会介绍Vue中的VueRouter的基本使用,编程式路由导航增加了我们进行路...
    99+
    2023-01-09
    Vue Router用法 Vue Router原理
  • 一文快速掌握Spring Cloud Stream
    目录一、概述简介1.1. cloud Stream是什么1.2. 设计思想1.4. 注解二、基于注解代码练习2.1. 消息驱动之生产者2.3. 目前存在的问题2.4. 分组解决重复消...
    99+
    2024-04-02
  • 快速掌握java排序算法-快速排序(图文)
    概念快速排序属于交换排序,主要步骤是使用基准元素进行比较,把小于基准元素的移动到一边,大于基准元素的移动到另一边。从而把数组分成两部分,然后再从这两部分中选取出基准元素,重复上面的步骤。过程如下:(推荐视频:java视频教程) 紫色:基准...
    99+
    2017-05-20
    java教程 快速排序 算法
  • 怎么快速掌握Redis数据库
    本篇内容主要讲解“怎么快速掌握Redis数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么快速掌握Redis数据库”吧!Redis基本数据类型 ...
    99+
    2024-04-02
  • JS快速掌握ES6的class用法
    1.如何构造? 先复习一下es5常用的构建类的方法:首先es5的写法使用原型进行对象的方法的,为什么不在构造函数里添加方法呢?因为实例化对象的时候,会重复的建立好多相同的方法,浪费资...
    99+
    2024-04-02
  • 快速掌握CSS框架的方法
    简明易懂:CSS框架如何快速上手,需要具体代码示例 简介:CSS框架是前端开发中常用的工具,它可以帮助我们快速构建美观且响应式的网页。然而,对于初学者来说,学习并使用CSS框架可能会有一定的困难。本篇文章将简要介绍CSS框架的基...
    99+
    2024-01-16
    快速上手 CSS框架
  • VUE懒加载实战教程:让你快速掌握图片懒加载技术
    VUE懒加载原理 VUE懒加载的原理是:在页面加载时,只加载当前视窗内的图片,其他图片等到滚动到视窗内时再加载。这样可以有效减少页面加载的资源开销,提高网站的加载速度。 VUE懒加载实现方法 VUE懒加载可以使用以下两种方法实现: 1....
    99+
    2024-02-13
    VUE 懒加载 图片加载 图片优化
  • 快速掌握Node.js事件驱动模型
    一、传统线程网络模型 在了解Node.js事件驱动模型之前,我们先了解一下传统的线程网络模型,请求进入web服务器(IIS、Apache)之后,会在线程池中分配一个线程来线性同步完成请求处理,直到请求处理完...
    99+
    2022-06-04
    模型 快速 事件
  • 快速掌握Android屏幕的知识点
    一、首先来介绍下关于PX、PT、PPI、DPI、DP的知识 术语 说明 PX (pixel...
    99+
    2022-06-06
    Android
  • 快速掌握MySQL基础教程方法
    本文主要给大家介绍快速掌握MySQL基础教程方法,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下快速掌握MySQL基础教程方法吧。1分钟安装Part1...
    99+
    2024-04-02
  • 怎么快速掌握数据库原理
    这篇文章主要介绍“怎么快速掌握数据库原理”,在日常操作中,相信很多人在怎么快速掌握数据库原理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么快速掌握数据库原理”的疑惑有所帮...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作