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

2023-09-13 11:33:09

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中的消息队列的消息就没有了

在这里插入图片描述

更多推荐

强化学习从基础到进阶-案例与实践[4.2]:深度Q网络DQN-Cart pole游戏展示

【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现专栏详细介绍:【强化学习原理+项目专栏】必看系列:单智能体、多智能体算法原理+项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现对于深度强化学习这块规划为:基础单智能算法教学(g

Qt Quick Layouts Overview

Qt快速布局概述#【中秋征文】程序人生,中秋共享#Qt快速布局是用于在用户界面中排列项目的项目。由于Qt快速布局还可以调整其项目的大小,因此它们非常适合可调整大小的用户界面。开始可以使用文件中的以下导入语句将QML类型导入到应用程序中。.qmlimportQtQuick.Layouts1.11主要特点一些主要功能是:可

LeetCode 362 期周赛

8029.与车相交的点题目:给你一个下标从0开始的二维整数数组nums表示汽车停放在数轴上的坐标。对于任意下标i,nums[i]=[starti,endi],其中starti是第i辆车的起点,endi是第i辆车的终点。返回数轴上被车任意部分覆盖的整数点的数目。思路:模拟代码classSolution{public:in

大模型如何可信?字节跳动研究的最新《可信赖的大型语言模型》综述,提出评估 LLMs 可信度时需要考虑的七大维度

文章目录一、前言二、主要内容三、总结🍉CSDN叶庭云:https://yetingyun.blog.csdn.net/一、前言论文地址:TrustworthyLLMs:aSurveyandGuidelineforEvaluatingLargeLanguageModels’Alignment在将大型语言模型(LLMs)

中外人工智能专家共话大语言模型与 AI 创新

文章目录一、前言二、主要内容三、总结🍉CSDN叶庭云:https://yetingyun.blog.csdn.net/一、前言智源社区活动,中外人工智能专家共话大语言模型与AI创新。对谈书目:《大模型时代》,龙志勇、黄雯著,中译出版社2023年5月出版。《为什么伟大不能被计划》,[美]肯尼斯·斯坦利、[美]乔尔·雷曼

【CS324】LLM(大模型的能力、数据、架构、分布式训练、微调等)

note本文是斯坦福大学CS324课程的学习笔记,同时参考了一些LLM相关资料文章目录note一、引言二、大模型的能力1.从语言模型到任务模型2.任务评估三、大模型的有害性四、大模型的数据五、law问题六、模型架构篇1.tokenization2.模型架构(1)onlyencoder(2)onlydecoder(3)e

猫头虎博主第5️⃣期赠书活动:《Java官方编程手册(第12版·Java 17)套装上下册》

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

【Java 基础篇】自如应对文本数据:Java缓冲字符流详解

Java提供了许多用于读写文本文件的类,其中缓冲字符流(BufferedCharacterStream)是一种非常常用且高效的方式。本篇博客将详细介绍Java缓冲字符流的使用,包括什么是缓冲字符流、为什么需要它们、如何创建和使用缓冲字符流、以及一些常见的使用场景和注意事项。什么是缓冲字符流?在了解缓冲字符流之前,我们需

Java下部笔记

目录一.双列集合1.Map2.Map的遍历方式3.可变参数4.Collection中的默认方法5.不可变集合(map不会)二.Stream流1.获取stream流2.中间方法3.stream流的收集操作4.方法引用1.引用静态方法2.引用成员方法3.引用构造方法4.使用类名引用成员方法5.引用数组的构造方法三.异常四.

【Java 基础篇】优雅处理文本数据:Java字符流详解

当涉及字符流时,Java提供了一组类来处理字符数据的输入和输出。字符流比字节流更适合处理文本文件,因为它们可以正确处理字符编码,而不仅仅是字节。在本篇博客中,我们将详细介绍Java字符流的各个方面,包括基本的字符输入输出,字符编码,字符流的使用注意事项以及一些高级话题。1.什么是字符流?字符流是用于处理字符数据的Jav

Java中的异常基础知识

目录什么是异常?1.算术异常2.数组越界异常3.空指针异常4.输入不匹配异常Java异常体系异常的处理防御式编程:事后认错异常处理流程自定义异常什么是异常?在Java中,将程序执行过程中发生的不正常行为称为异常1.算术异常publicstaticvoidmain(String[]args){System.out.pri

热文推荐