RabbitMQ 进阶 -- SpringBoot 集成 RabbitMQ实现生产者与消费者模式

蜂信物联FastBee平台https://gitee.com/beecue/fastbee

阿里资料开源项目https://gitee.com/vip204888

百度低代码前端框架https://gitee.com/baidu/amis

OpenHarmony开源项目https://gitcode.com/openharmony

仓颉编程语言开放项目https://gitcode.com/Cangjie

  • 如果保证可靠性,需要自己去写

  • 如果服务器承载不了,需要自己去写高可用

⚡异步消息队列


在这里插入图片描述

使用MQ异步消息队列的好处

  • 完全解耦,用MQ建立桥接

  • 有独立的线程池和运行模型

  • 出现了消息丢失,MQ有持久化功能

  • 如何保证消息的可靠性,死信队列和消息转移的等

  • 如果服务器承载不了,你需要自己去写高可用,HA镜像模型高可用。

按照以上约定,用户的响应时间相当于是订单信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍

因此MQ消息队列适用于

  • 分布式事务的可靠消费和可靠生产

  • 索引、缓存、静态化处理的数据同步

  • 流量监控

  • 日志监控(ELK)

  • 下单、订单分发、抢票

MQ消息队列可达到 高内聚、低耦合

六、SpringBoot 整合RabbitMQ实现消息的生产与消费

====================================================================================================

RabbitMQ是Spring家族开发的产品,Spring 天然支持RabbitMQ,快速方便引入RabbitMQ!

这里我们介绍 SpringBoot 整合RabbitMQ 实现消息的生产与消费(广播模式/发布订阅模式)

✅创建Maven聚合工程


File —> New —> Project —> Maven —> 直接Next 进入下一步创建普通的Maven工程即可

在这里插入图片描述

创建一个默认的Maven聚合工程,将src文件夹删除,该工程就是一个Maven聚合工程

😃引入共有依赖


引入依赖如下:


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>



    <groupId>com.wanshi</groupId>

    <artifactId>springboot-rabbitmq</artifactId>

    <packaging>pom</packaging>

    <version>1.0-SNAPSHOT</version>

    <modules>

        <module>rabbitmq-order-producer</module>

        <module>rabbitmq-order-consumer</module>

    </modules>

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.5.5</version>

        <relativePath /> <!-- lookup parent from repository -->

    </parent>



    <dependencyManagement>

        <dependencies>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-web</artifactId>

            </dependency>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-test</artifactId>

                <scope>test</scope>

            </dependency>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-amqp</artifactId>

            </dependency>

            <dependency>

                <groupId>org.springframework.boot</groupId>

                <artifactId>spring-boot-starter-web</artifactId>

            </dependency>

        </dependencies>

    </dependencyManagement>



</project>



⏳创建生产者


在项目内,新建一个Moudle,rabbitmq-order-producer 默认Maven工程,下一步即可

引入依赖


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.5.5</version>

        <relativePath /> <!-- lookup parent from repository -->

    </parent>

    <modelVersion>4.0.0</modelVersion>



    <artifactId>rabbitmq-order-producer</artifactId>



    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-amqp</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>junit</groupId>

            <artifactId>junit</artifactId>

            <scope>test</scope>

        </dependency>

    </dependencies>



</project>



⌛创建消费者


在项目内,新建一个Moudle,rabbitmq-order-cousumer 默认Maven工程,下一步即可

引入依赖


<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <parent>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-starter-parent</artifactId>

        <version>2.5.5</version>

        <relativePath /> <!-- lookup parent from repository -->

    </parent>

    <modelVersion>4.0.0</modelVersion>



    <artifactId>rabbitmq-order-producer</artifactId>



    <dependencies>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-test</artifactId>

            <scope>test</scope>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-amqp</artifactId>

        </dependency>

        <dependency>

            <groupId>org.springframework.boot</groupId>

            <artifactId>spring-boot-starter-web</artifactId>

        </dependency>

    </dependencies>



</project>



Maven聚合工程创建完成图

在这里插入图片描述

Maven依赖图

在这里插入图片描述

自行手写MainApplication即可

创建完成!

♨️核心源码


application.yml


# 服务端口

server:

  port: 8080

# 配置rabbitmq服务

spring:

  rabbitmq:

    username: admin

    password: admin

    virtual-host: /

    host: 8.130.28.198

    port: 5672





生产者

OrderService


package com.wanshi.service;



import org.springframework.amqp.rabbit.core.RabbitTemplate;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;



import java.util.UUID;



/**

 * @author whc

 * @date 2022/5/23 18:50

 */



@Service

public class OrderService {



    @Autowired

    private RabbitTemplate rabbitTemplate;



    public void makeOrder() {

        String orderId = UUID.randomUUID().toString();

        System.out.println("订单生成成功:" + orderId);

        String exchange_name = "fanout_order_exchange";

        String routeingKey = "";

        rabbitTemplate.convertAndSend(exchange_name, routeingKey, orderId);

    }

}





消费者

交换机的声明与队列我们放在消费者端,因为消费者是先开启的,如果没有交换机和队列,则会报错!

RabbitMQConfiguration


package com.wanshi.config;



import org.springframework.amqp.core.Binding;

import org.springframework.amqp.core.BindingBuilder;

import org.springframework.amqp.core.FanoutExchange;

import org.springframework.amqp.core.Queue;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;



/**

 * @author whc

 * @date 2022/5/23 10:18

 */

@Configuration

public class RabbitMQConfiguration {



    //1.声明注册fanout模式的交换机

    @Bean

    public FanoutExchange fanoutExchange() {

        return new FanoutExchange("fanout_order_exchange", true, false);

    }



    //2.声明队列,sms.fanout.queue email.fanout.queue msg.fanout.queue

    @Bean

    public Queue smsQueue() {

        return new Queue("sms.fanout.queue", true);

    }



    @Bean

    public Queue emailQueue() {

        return new Queue("email.fanout.queue", true);

    }



    @Bean

    public Queue msgQueue() {

        return new Queue("msg.fanout.queue", true);

    }



    //3.完成绑定关系(队列与交换机完成绑定关系)

    @Bean

    public Binding smsBind() {

        return BindingBuilder.bind(smsQueue()).to(fanoutExchange());

    }



    @Bean

    public Binding emailBind() {

        return BindingBuilder.bind(emailQueue()).to(fanoutExchange());

    }



    @Bean

    public Binding msgBind() {

        return BindingBuilder.bind(msgQueue()).to(fanoutExchange());

    }

}





编写具体业务消费类

FanoutEmailConsumer


package com.wanshi.service;



import org.springframework.amqp.rabbit.annotation.RabbitHandler;

import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.stereotype.Component;



/**

 * @author whc

 * @date 2022/5/23 18:53

 */

@RabbitListener(queues = "email.fanout.queue")

@Component

public class FanoutEmailConsumer {



    @RabbitHandler

    public void messageService(String message) {

        System.out.println("fanout email ==>" + message);

    }

}



FanoutMsgConsumer


package com.wanshi.service;


## 最后

分享一套我整理的面试干货,这份文档结合了我多年的面试官经验,站在面试官的角度来告诉你,面试官提的那些问题他最想听到你给他的回答是什么,分享出来帮助那些对前途感到迷茫的朋友。

#### 面试经验技巧篇

* 经验技巧1 如何巧妙地回答面试官的问题
* 经验技巧2 如何回答技术性的问题
* 经验技巧3 如何回答非技术性问题
* 经验技巧4 如何回答快速估算类问题
* 经验技巧5 如何回答算法设计问题
* 经验技巧6 如何回答系统设计题
* 经验技巧7 如何解决求职中的时间冲突问题
* 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
* 经验技巧9 在被企业拒绝后是否可以再申请
* 经验技巧10 如何应对自己不会回答的问题
* 经验技巧11 如何应对面试官的“激将法”语言
* 经验技巧12 如何处理与面试官持不同观点这个问题
* 经验技巧13 什么是职场暗语

![](https://img-blog.csdnimg.cn/img_convert/333cc39c4bf0769fcf1bc465d5449b80.webp?x-oss-process=image/format,png)

#### 面试真题篇

* 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
* 真题详解2 某知名社交平台软件工程师笔试题
* 真题详解3 某知名安全软件服务提供商软件工程师笔试题
* 真题详解4 某知名互联网金融企业软件工程师笔试题
* 真题详解5 某知名搜索引擎提供商软件工程师笔试题
* 真题详解6 某初创公司软件工程师笔试题
* 真题详解7 某知名游戏软件开发公司软件工程师笔试题
* 真题详解8 某知名电子商务公司软件工程师笔试题
* 真题详解9 某顶级生活消费类网站软件工程师笔试题
* 真题详解10 某知名门户网站软件工程师笔试题
* 真题详解11 某知名互联网金融企业软件工程师笔试题
* 真题详解12 国内某知名网络设备提供商软件工程师笔试题
* 真题详解13 国内某顶级手机制造商软件工程师笔试题
* 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
* 真题详解15 某著名社交类上市公司软件工程师笔试题
* 真题详解16 某知名互联网公司软件工程师笔试题
* 真题详解17 某知名网络安全公司校园招聘技术类笔试题
* 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

![](https://img-blog.csdnimg.cn/img_convert/7a9cd0550781cf2e7099b86998eb3517.webp?x-oss-process=image/format,png)

资料整理不易,点个关注再走吧
 经验技巧8 如果面试问题曾经遇见过,是否要告知面试官
* 经验技巧9 在被企业拒绝后是否可以再申请
* 经验技巧10 如何应对自己不会回答的问题
* 经验技巧11 如何应对面试官的“激将法”语言
* 经验技巧12 如何处理与面试官持不同观点这个问题
* 经验技巧13 什么是职场暗语

[外链图片转存中...(img-ioRe4xOh-1725210383830)]

#### 面试真题篇

* 真题详解1 某知名互联网下载服务提供商软件工程师笔试题
* 真题详解2 某知名社交平台软件工程师笔试题
* 真题详解3 某知名安全软件服务提供商软件工程师笔试题
* 真题详解4 某知名互联网金融企业软件工程师笔试题
* 真题详解5 某知名搜索引擎提供商软件工程师笔试题
* 真题详解6 某初创公司软件工程师笔试题
* 真题详解7 某知名游戏软件开发公司软件工程师笔试题
* 真题详解8 某知名电子商务公司软件工程师笔试题
* 真题详解9 某顶级生活消费类网站软件工程师笔试题
* 真题详解10 某知名门户网站软件工程师笔试题
* 真题详解11 某知名互联网金融企业软件工程师笔试题
* 真题详解12 国内某知名网络设备提供商软件工程师笔试题
* 真题详解13 国内某顶级手机制造商软件工程师笔试题
* 真题详解14 某顶级大数据综合服务提供商软件工程师笔试题
* 真题详解15 某著名社交类上市公司软件工程师笔试题
* 真题详解16 某知名互联网公司软件工程师笔试题
* 真题详解17 某知名网络安全公司校园招聘技术类笔试题
* 真题详解18 某知名互联网游戏公司校园招聘运维开发岗笔试题

[外链图片转存中...(img-fbwkeXbn-1725210383831)]

资料整理不易,点个关注再走吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值