微服务07-认识MQ+RabbitMQ入门

news2024/12/23 12:59:16

1.前言

了解同步调用和异步调用

在这里插入图片描述

1.1.同步调用

比如这里的支付服务,需要等待订单服务、短信服务…执行完毕才能执行,这样支付整个流程完毕需要500ms

然后如果订单、仓储等其中一个服务挂掉了,那么支付服务请求请求不了,挂掉的服务越来越多,级联失败;——>服务提供者出现问题,那么整个微服务都会出现故障;

资源浪费:消费者需要等待服务提供者响应,不能干其他事情只能干等;

耦合度较高:每次加入新的需求,还需要动原来的代码——>比如:订单加了一个用户积分,那么Feign模块中还要加相关代码,以便订单模块调用,订单模块还需要+调用用户积分的代码:需要改动订单代码;

再来一个场景:比如说,我们要删除某个业务,需要将支付服务中的调用某个业务的相关代码删除;

缺点

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

1.2.异步调用

利用了一个Broker进行事件通知

优点

级联失败问题得到解决:比如订单服务挂了,它并不会影响支付服务,自己重启就行了
耦合度低:因为支付服务不需要调用其他服务了,而是通过发布事件,Broker对其他事务进行通知,你支付服务该干嘛干嘛,发布完消息返回用户支付成功——>支付服务发布支付成功消息给到Broker,然后Broker进行通知——>对其他服务,然后其他服务执行即可;

吞吐量提升:因为不存在服务之间的调用,所以时间较少(发布信息),能发送的数据就能够越多——>牺牲:消息的延迟,从发送到接收

流量削峰:Broker作为缓冲,将并发请求保存起来,然后通过微服务里面的实现的功能,对请求进行放行——>从而达到流量削峰的效果

缺点

异步调用只是通知你干一件事情,并不知道你干没干完(通过Broker发送请求让你干事情,从而达到解耦的效果)

在这里插入图片描述
流量削峰

Broker作为缓冲区对请求进行缓存;
在这里插入图片描述
在这里插入图片描述

2.认识MQ

在这里插入图片描述
RabbitMQ:一般用于业务之间的通信,安全稳定。

KafKa:一般用于海量数据处理,单机吞吐量高:每秒钟能发送的数据大小来分析

3.RabbitMQ入门

3.1 安装使用

1.导入虚拟机并解压
在这里插入图片描述

2.运行镜像产生MQ容器
在这里插入图片描述

3.运行成功
在这里插入图片描述

4.访问RabbitMQ
在这里插入图片描述

5.RabbitMQ各属性解读
发布者Publisher会把消息->给到交换机(Exchange),交换机路由给到指定的消息队列(Queue),queue把消息保存起来,然后消费者consumer会从queue将消息拿出来

VirtualHost:各个虚拟主机是不一样的,相当于对操作进行分组——>不同用户访问是不同的虚拟主机,体现隔离性;

在这里插入图片描述

3.2 常见消息模型

在这里插入图片描述

3.3 简单队列案例

在这里插入图片描述

3.3.1 发送

1.建立消息队列连接

IDEA中写好配置

package cn.itcast.mq.helloworld;
 
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.junit.Test;
 
import java.io.IOException;
import java.util.concurrent.TimeoutException;
 
public class PublisherTest {
    @Test
    public void testSendMessage() throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、消息通信端口号、vhost、用户名、密码
        factory.setHost("192.168.88.130");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
 
        // 2.创建通道Channel
        Channel channel = connection.createChannel();
 
        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
 
        // 4.发送消息
        String message = "hello, rabbitmq!";
        channel.basicPublish("", queueName, null, message.getBytes());
        System.out.println("发送消息成功:【" + message + "】");
 
        // 5.关闭通道和连接
        channel.close();
        connection.close();
 
    }
}

运行代码后

进入RabbitMQ发现连接成功
在这里插入图片描述

2.创建一个通道,以此发送消息到队列
在这里插入图片描述

3.利用通道来声明队列
在这里插入图片描述

4.发送消息
在这里插入图片描述

5.消息成功发送到队列中,消息断开,不管你后面的接收

3.3.2 接收

老样子 IDEA中写好配置,运行即能接收

package cn.itcast.mq.helloworld;
 
import com.rabbitmq.client.*;
 
import java.io.IOException;
import java.util.concurrent.TimeoutException;
 
public class ConsumerTest {
 
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.建立连接
        ConnectionFactory factory = new ConnectionFactory();
        // 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
        factory.setHost("192.168.88.130");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("itcast");
        factory.setPassword("123321");
        // 1.2.建立连接
        Connection connection = factory.newConnection();
 
        // 2.创建通道Channel
        Channel channel = connection.createChannel();
 
        // 3.创建队列
        String queueName = "simple.queue";
        channel.queueDeclare(queueName, false, false, false, null);
 
        // 4.订阅消息
        channel.basicConsume(queueName, true, new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope,
                                       AMQP.BasicProperties properties, byte[] body) throws IOException {
                // 5.处理消息
                String message = new String(body);
                System.out.println("接收到消息:【" + message + "】");
            }
        });
        System.out.println("等待接收消息。。。。");
    }
}

跟消息队列的消息发送流程差不多,注意点就是也声明了队列:避免队列不存在

还有一点:定义了consume消费行为handleDelivery()消费行为和队列名字绑定了,只要一有消息就会传递到队列当中被消费行为执行;——>一个异步操作,消费者与消息提供者互相不等待

从先执行后面的打印信息,再执行前面的接收到消息可以看出是一个异步操作:接没接受到不管 (两个线程一个回调,一个往后面继续走

在这里插入图片描述

消费者收到消息后,RabbitMQ中的消息队列的消息就没有了

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006371.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python实现进制转换

1 问题 如何将一个数从十进制转换成二进制,这个数从键盘输入。 2 方法 (1)输入一个十进制的数; (2)将这个数除以2求商和余数 (3)再用2去除商,又会得到一个商和余数,如此进…

企业用设备管理系统有什么好处?的修大数据管理平台的功能强大吗?

在现代工业运营中,设备的高效管理与维护对于维持生产稳定及提升企业竞争力具有重大意义。而设备管理系统作为一项重要工具,可以极大地提高企业的生产效率与设备维护的准确性。 企业使用设备管理系统的原因如下:   提高设备利用率&#xff1…

小白自助发卡销售系统|支持自助选号批量购买Thinkphp6.0+Layui

小白自助发卡销售系统 本系统由小白独立开发thinkphp+layui 功能特色: 1.前台下单支持自助选号。 2.前台库存显示方案增加3种。 3.自定义商品图片。 4.支持邮件通知功能具体可到后台自行体验。 5.支持批量下单购买。 6.支持易支付接口(目前用的比较多) 7.支持批量导入卡密 8.P…

从0到1理解ChatGPT原理

目录 写在前面 1.Tansformer架构模型 2.ChatGPT原理 3.提示学习与大模型能力的涌现 3.1提示学习 3.2上下文学习 3.3思维链 4.行业参考建议 4.1拥抱变化 4.2定位清晰 4.3合规可控 4.4经验沉淀 机械工业出版社京东自购链接 写在前面 2022年11月30日,ChatG…

【数据结构】二叉树链式结构的实现(三)

目录 一,二叉树的链式结构 二,二叉链的接口实现 1,二叉链的创建 2,接口函数 3,动态创立新结点 4,创建二叉树 5,前序遍历 6,中序遍历 7,后序遍历 三,结点个…

嵌入式学习笔记(25)串口通信的基本原理

三根通信线:Tx Rx GND (1)任何通信都要有信息作为传输载体,或者有线的或则无线的。 (2)串口通信时有线通信,是通过串口线来通信的。 (3)串口通信最少需要2根&#xff…

“熊猫杯” | 赛宁网安获网络安全优秀创新成果大赛优胜奖

9月11日,四川省2023年国家网络安全宣传周正式启动。由四川省委网信办指导,中国网络安全产业联盟(CCIA)主办,成都信息工程大学、四川省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛—成都分站赛(暨四川省‘…

Linux HTTP协议

目录 1.浏览器与服务器通信过程2.HTTP请求报头(1)HTTP的请求报头结构(2)HTTP的请求方法 3.HTTP应答报头(1)HTTP的应答报头结构(2) HTTP的应答状态 1.浏览器与服务器通信过程 浏览器…

小程序源码:多功能口袋工具箱微信小程序源码-带流量主|云开发(更新)

这里主要分享多功能口袋工具箱微信小程序源码,有带流量主,而且超多功能工具箱组合的微信小程序源码。无需服务器即可搭建,可以设置流量主赚取收益。 源码链接: 网盘源码 密码:hma8 工具箱的应用一览: 1…

部署kibana可视化平台

部署kibana可视化平台 案例版本:kibana 8.6.2 1、下载 去官网中查找与安装的ES版本一致的安装包:官网kibana下载。 可以选择自行下载好后放入服务器中进行安装,也可以使用wget下载: # 下载 cd /home/elasticsearch/kibana wge…

LeetCode 1132.申请的报告2

数据准备 Create table If Not Exists Actions (user_id int, post_id int, action_date date, action ENUM(view, like, reaction, comment, report, share), extra varchar(10)); create table if not exists Removals (post_id int, remove_date date); Truncate table Act…

【ccf-csp题解】第2次csp认证-第四题-最优配餐-多源BFS

题目描述 思路讲解 这道题的数据量是10^6,直接用floyd算法,肯定是不行的 此处介绍新的思路:多源BFS 我们的核心目的是,对于每一个终点(即此处的顾客)能够找到离它最近的源点(即此处的餐馆&am…

GFS分布式存储

一,gfs简介 GlusterFS 是一个开源的分布式文件系统,由存储服务器、客户端以及NFS/Samba 存储网关(可选,根据需要选择使用)组成。没有元数据服务器组件,这有助于提升整个系统的性能、可靠性和稳定性。 传统的…

第七章 系统管理和维护

第七章 系统管理和维护 ​ 当我们要登录系统或访问系统的某个资源时,通常都要求输入用户名和密码,从系统的角度看,用户就是一种进行认证或授权的标识。只有通过认证的用户才能访问相应的资源,而对于同一个资源,不同的…

再获新突破!移远通信RedCap模组拿下首张端网协同测评证书

为进一步推动5G技术的商用和普及,今年8月初,移远通信与广东联通联合建立了5G端网能力研究联合实验室(以下简称“联合实验室”),双方将在5G及RedCap各项性能的研究方面展开深入合作。广东联通网络产品创新中心总经理潘桂…

恒运资本:股市几点开盘和收盘?

股票商场在股票生意日打开,每个国家的股票商场都有自己的开盘和收盘时间。在本文中,我们将分析股市开盘和收盘时间的重要性,以及股市如安在纷歧起区的运作。我们还将讨论股市开盘和收盘时间的改动,以及这些改动对股票商场的影响。…

JVM核心参数图解-整理

一、VM核心参数 在JVM里有几个比较核心的参数,今天就主要来讲这几个: -Xms:JVM初始堆内存大小-Xmx:JVM堆内存的最大值-Xmn:JVM中新生代大小-XX:PermSize:永久代大小-XX:MaxPermSize:永久代最大…

拓世科技集团到访考察吉安青原区:共谋AIGC数字经济产业园发展大计

千帆竞发立潮头,奋勇争先谋发展,在中国这片广袤的大地上,先行者的每一次拓进都是历史的华章,远谋者的每一次交汇都是未来的预言。当红色江西大地与现代科技脉搏共振,当青原区的绿意拥抱拓世科技的AIGC科技,…

Mysql高级——索引

索引 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上…

视频接口冷知识

常用视频接口的分辨率和带宽 VGA接口:VGA接口是一种传输模拟信号的视频接口,它只能支持视频传输,不支持音频传输。VGA接口的最大支持分辨率是2048x1536px。HDMI接口:HDMI接口是一种传输数字信号的视频接口,它可以同时…