SpringBoot中整合RabbitMQ(测试+部署上线 最完整)
一、RabbitMQ安装
由于在测试环境中,我们现在虚拟机上基于docker安装mq
docker run \-e RABBITMQ_DEFAULT_USER=quick \-e RABBITMQ_DEFAULT_PASS=123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network your-net\-d \rabbitmq:3.8-management
在docker环境上运行改指令
前两个是登录的用户名密码
network是连接的网络,如果用默认网络的话就不需要写
最后一个是版本,这个是目前测试的版本
二、启动RabbitMQ
由于目前是测试阶段,这里我使用之前学习的时候的版本。
创建新用户后重新登陆,然后创建一个单独的 Virtual Hosts (虚拟主机)来进行隔离。
三、编写Java代码\
1、引入依赖
<!--rabbitmq--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
2、配置yml
spring:rabbitmq:host: ${quick.rabbitmq.host}port: ${quick.rabbitmq.port} # 端口virtual-host: ${quick.rabbitmq.virtual-host} # 虚拟主机username: ${quick.rabbitmq.username} # 用户名password: ${quick.rabbitmq.password} # 密码
quick:rabbitmq:host: 192.168.75.101 #服务器ip地址(此处为虚拟机地址)port: 5672 # 端口virtual-host: /xxx # 虚拟主机username: xxx # 用户名password: xxx # 密码
3、配置消息转换器
/*** 配置消息转换器*/
@Configuration
@ConditionalOnClass(RabbitTemplate.class) //有RabbitTemplate依赖才会生效,否则不生效
public class MqConfig {@Beanpublic MessageConverter messageConverter(){//使用json序列化发送消息return new Jackson2JsonMessageConverter();}
}
4、编写接收方接收消息
/*** 接收消息*/
@Component
@RequiredArgsConstructor
public class StoreListener {private final IStoreService storeService;@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "store.addFavorite.success.queue", durable = "true"), // 队列 起名规则(服务名+业务名+成功+队列),durable持久化exchange = @Exchange(name = "addFavorite.direct"), // 交换机名称,交换机默认类型就行direct,所以不用配置directkey = "addFavorite.success" // 绑定的key))public void listenAddFavoriteCountsSuccess(Long storeId){storeService.updateStoreFavoriteUsersCountAdd1(storeId);}}
虽然代码里面也已经解释了,但是下面也再解释一下:
value:是队列信息。起名规则(服务名+业务名+成功+队列),durable表示持久化exchange:是交换机名称。起名规则是(业务名+direct),和发送方一致key:绑定的key。起名规则是(业务名+success),表示成功的key,和发送方一致起名规则是个人而定
5、编写发送方发送消息
@Transactional@Overridepublic void add(Long storeId) {Favorite favorite = Favorite.builder().storeId(storeId).userId(BaseContext.getCurrentId()).build();Favorite one = Db.getOne(favorite);if (one!=null){throw new FavoriteException(MessageConstant.COLLECTION_BE_REPEAT);}// 更新收藏表favoriteMapper.insert(favorite);// 更新商品表,收藏数+1//storeService.updateStoreFavoriteUsersCountAdd1(storeId);// 发送消息 (交换机+绑定的key和发送的消息)try {rabbitTemplate.convertAndSend("addFavorite.direct","addFavorite.success",storeId);} catch (Exception e) {log.error("发送添加收藏消息失败,店铺id:{}",storeService,e);}}
虽然代码里面也已经解释了,但是下面也再解释一下:
"addFavorite.direct":是交换机名称,和接收方一致"addFavorite.success":是绑定的key,和接收方一致storeId:是发送的信息
6、小程序验证
点击收藏。
在RabbitMQ的界面中队列也有一条消息出现,说明mq实现异步通讯成功。
该案例是收藏商品后完成收藏表插入语句后,还要去商品表更新商品表,更新该商品的被收藏数加一,但是如果同步通讯的话,响应会有延迟,可能会对性能造成一定影响,但是通过异步通讯,不需要实时响应,就会对性能有一定的优化。
三、宝塔中安装RabbitMQ
1、下载erlang
RabbitMQ服务端是由并发式语言Erlang编写的,所以安装RabbitMQ的之前需要安装Erlang,保证所需要的环境。
安装之前注意版本兼容问题:Erlang Version Requirements | RabbitMQ
安装erlang地址:https://www.erlang-solutions.com/downloads/#
(1)查看rabbitmq的版本
先去宝塔查看rabbitmq的版本:
(2)查找erlang兼容版本
然后去找到版本兼容的erlang版本:Erlang Version Requirements | RabbitMQ
(3)安装RPM包
去下载:https://www.erlang-solutions.com/downloads/#
下载后拿到rpm文件:
注意:这里没有下载的版本,下载需要与自己的版本一致,如果发现启动不了RabbitMQ,请看后面的启动RabbitMQ。
注意!注意!注意!
2、前往宝塔面板
进入tmp目录,将之前的rpm包放进去。
3、安装RabbitMQ
在软件商店中安装RabbitMQ
出现问题:
看到报错日志,我又去下载报错日志里面的版本。
再次去:https://www.erlang-solutions.com/downloads/#
我是centos7,所以下载该版本。那边有点不人性化,我尝试了几次才下载到自己的版本。
将之前的哪个rmp文件删掉,再将刚刚下载的rpm文件重命名再次放入tmp目录中
上面我重命名错了,只记得修改后面,下面是再次修改后的结果。
卸载rabbitmq,然后再重新安装一次。
还是出现报错:
出现了这个报错,很莫名其妙,然后我就去用docker安装,有解决办法的可以评论一下。
在其他教程到这一步已经可以了,可以参考下面两篇博客:
宝塔面板安装RabbitMQ(已解决)_宝塔安装rabbitmq-CSDN博客
宝塔安装rabbitMQ实战-CSDN博客
四、docker中安装rabbitmq
1、安装docker
2、配置docker镜像加速
# 创建目录
mkdir -p /etc/docker# 复制内容,注意把其中的镜像加速地址改成你自己的
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["http://hub-mirror.c.163.com","https://mirrors.tuna.tsinghua.edu.cn","http://mirrors.sohu.com","https://ustc-edu-cn.mirror.aliyuncs.com","https://ccr.ccs.tencentyun.com","https://docker.m.daocloud.io","https://docker.awsl9527.cn"]
}
EOF# 重新加载配置
systemctl daemon-reload# 重启Docker
systemctl restart docker
3、拉取RabbitMQ镜像
docker pull rabbitmq
4、运行RabbitMQ
docker run \-e RABBITMQ_DEFAULT_USER=quick \-e RABBITMQ_DEFAULT_PASS=quick \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \-d \rabbitmq
5、查看镜像和容器
docker images
docker ps
到这里已经是成功在docker中装好mq容器了
但是在我访问http://主机ip:15672的时候却无法访问,即使我开放了服务器的安全组。后来猜到应该是客户端服务可能是没开启,在之前宝塔软件里面好像有看过这个东西。
6、开放客户端服务
在mq容器中打开终端
列出所有可用的插件:
rabbitmq-plugins list
找到rabbitmq_management:
开启rabbitmq_management:
rabbitmq-plugins enable rabbitmq_management
然后再访问客户端,成功访问:
7、登录RabbitMQ客户端
这里显示有些特性标志未开启,我们可以去开启那些标志。
参考博客:Docker RabbitMQ安装_all stable feature flags must be enabled after com-CSDN博客
8、创建虚拟主机
创建一个单独的虚拟主机来进行隔离,这里可以参考前面在虚拟机上的操作。
五、部署项目验证
参考我之前的博客:记录部署项目《庆自提》完整流程-CSDN博客
修改yml配置文件,修改下面的消息:
rabbitmq:host: ${quick.rabbitmq.host}port: ${quick.rabbitmq.port} # 端口virtual-host: ${quick.rabbitmq.virtual-host} # 虚拟主机username: ${quick.rabbitmq.username} # 用户名password: ${quick.rabbitmq.password} # 密码
在已经上线的小程序测试~~
目前只有一个人收藏,现在去测试一下。
收藏成功,去看一下数据库,查看是否更新。
去查看mq客户端:
成功更新,说明使用RabbitMQ实现异步通讯成功。
在配置mq过程中遇到许许多多的bug和问题,改了很久很久,如果里面有哪些不足的欢迎指正和建议!!!
相关文章:

SpringBoot中整合RabbitMQ(测试+部署上线 最完整)
一、RabbitMQ安装 由于在测试环境中,我们现在虚拟机上基于docker安装mq docker run \-e RABBITMQ_DEFAULT_USERquick \-e RABBITMQ_DEFAULT_PASS123 \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network your-net\-d \r…...

算法板子:线性DP——算出三角形中的最大路径值、求最长上升子序列、求最长公共子序列
目录 一、数字三角形——算出三角形中的最大路径值 二、最长上升子序列——求一个数组中的最长递增子序列 三、最长公共子序列——求两个字符串中的最长公共子序列 一、数字三角形——算出三角形中的最大路径值 #include <iostream> using namespace std;const int N …...

【C++】值传递
函数值传递的特点:值传递过程中即使形参改变也不会改变实参 没有返回值的函数用“ void ”定义 下面是一个实例: #include<iostream> using namespace std;//值传递 //定义函数,实现两个数字进行交换函数//如果函数不需要返回值&…...

工业三防平板助力MES系统打造工厂移动式生产管理
随着工业4.0时代的到来,智能制造、数字化车间等概念层出不穷,生产过程的可视化管理也成为了企业提升效率、优化生产的关键。而工业三防平板,凭借其坚固耐用、功能强大、便携易用等特性,成为了实现生产过程可视化管理的重要利器&am…...

keepalived+nginx实现的简单高可用故障转移
keepalived和nginx和适配 nginx服务停止后对keepalived的影响最近研究了一下keepalived绑定虚拟Ip,然后实现集群的方案,发现实现故障转移的模式,只有在keepalived服务整个挂掉后才能实现虚拟IP的漂移,和实际应用的场景不怎么适配,所以把它和nginx结合在一起实现集群高可用…...

openai api使用
1OpenAI 的 API 介绍 1.1 api分类 常用的 OpenAI Api 接口总共分为 4 类:对话类、私有化模型训练类、通用类、图片 & 音频类,其中对话类与私有化模型训练类是最常用的。 a .对话类 这类是最常用也是最核心的接口,用于人机对话。对话类…...

带你走进haproxy的世界
华子目录 前言什么是负载均衡为什么用haproxy负载均衡负载均衡公司负载均衡类型四层负载均衡七层负载均衡四层和七层的区别 haproxy介绍haproxy的安装与服务信息软件安装haproxy基本配置信息proxies配置socat工具 haproxy算法静态算法动态算法其他算法 高级功能及配置基于cooki…...

STM32--中断使用(超详细!)
STM32中断机制是嵌入式系统设计中一个非常重要的组成部分,它允许单片机在执行程序的过程中,对外部或内部发生的事件做出快速响应。以下是一篇关于STM32中断机制的详细介绍和示例代码,希望能够帮助你更好地理解和应用中断。 一、中断的基本概…...

【深度学习实践】基于深度学习的图像去雾算法-ChaIR-实践
本文介绍一个去雾算法ChaIR的使用方法,可以完成图像去雾,也可以用于图像去雨、去噪音等任务。本文不涉及论文原理,只包含源代码的跑通和使用。 先展示一下效果: 原图去雾 论文:Exploring the potential of channel …...

《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统
Title 题目 Screening Outcomes of Mammography with AI in Dense Breasts: A Comparative Study with Supplemental Screening US 《乳腺密度高的女性中,使用AI辅助的乳腺X线筛查与补充筛查超声的比较研究》 Background 背景 Comparative performance between…...

crm 销售管理系统有哪些?国内外排名前十盘点
本文深入对比的 crm销售管理系统有:1.纷享销客; 2.Zoho CRM; 3.销售易; 4.有赞CRM; 5.Salesforce; 6.HubSpot; 7.简道云CRM; 8.爱客CRM; 9.Apptivo。 如果你正寻找一种方…...

package-lock.json 要提交到git吗?
之前一直没有提交package-lock.json文件到git仓库,直到我打包失败了。。。 我才知道package-lock.json需要提交到git仓库。 npm官网建议将package-lock.json一起提交到代码库中,不要忽略它。 package-lock.json的主要作用是锁定dependencies的版…...

算法学习day32
一、解码方法II(解码方法I的升级版) 在I的基础上增加了*,可以代替1-9中任意一个数字,求解码的方法有多少种 输入:s "*" 输出:9 解释:这一条编码消息可以表示 "1"、"…...

知识与智慧
前两天在medium上看到一篇文章,探讨知识(knowledge)和智慧(wisdom)之间的区别,很受启发,结合自己的经历和理解,形成此文: 何为知识 知识通常指的是信息的积累和对特定领…...

使用FFmpeg实现摄像头RTMP实时推流
在当今的数字时代,视频直播已成为连接人与人之间的重要桥梁,广泛应用于在线教育、远程会议、娱乐直播等多个领域。随着技术的不断进步,人们对于直播的实时性、稳定性和高质量需求日益增加。为了实现高效的视频直播,选择合适的工具和协议至关重要。 RTMP(Real-Time Messagi…...

使用 LabVIEW 编程更改 IMAQ/IMAQdx 接口的相机文件
问题详情 可能需要通过编程方式更改与 IMAQ/IMAQdx 接口关联的相机文件。这种需求通常发生在图像采集系统中,例如使用 PCIe-1433 硬件时,可能需要动态切换不同的相机配置文件来适应不同的应用场景。 解决方案 当前在 Measurement & Automation Ex…...

[后端代码审计] PHP 基础学习
文章目录 前言1. 基础语法1 .1 注释1 .2 分隔符 2. 变量与常量2 .1 变量2 . 1 .1 变量定义2 . 1 .2 变量释放 2 .2 常量2 . 2 .1 常量定义2 . 2 .2 预定义常量 3. 运算符3. 1 算数运算符3 .2 字符串运算符3 .3 赋值运算符3 .4 比较运算符3 .5 逻辑运算符3 .6 其他运算符 4. 流程…...

【OpenCV C++20 学习笔记】直方图计算-split, calcHist, normalize
直方图计算-split, calcHist, normalize 广义直方图示例目标分离通道计算直方图绘制计算结果归一化绘制 最终结果 广义直方图 直方图的横坐标除了可以是图片中的强度值,也可以是任何其他我们想要观察的特征。例如,下面的图片矩阵中包含了0-255的强度值&…...

js入门经典学习小结
简介 js是解释型语言,虽然名字有java,但和java,c等编译型语言不同,它是解释型的,类似perl,py 历史 90年代最早js 1.0版本是网景navigator2引入的 然后欧洲计算机制造商协会(ECMA)…...

nps内网穿透之——腾讯云服务器和linux虚拟机
准备 1、客户端:准备一个内网的linux内网主机,或是一个虚拟机。 2、服务端:准备一个云服务器(阿里、腾讯、华为都行)。 安装方式: 1、自己到Github官网下载安装包上传。 下载地址:https://…...

大数据知识点
VMWare 设置网段 虚拟机设置 JDK部署 云平台 创建VPC 找到阿里云控制台里的VPC,点击专有网络 安全组 搁置…有需要再使用,因为每月要花200左右 大数据 数据导论...

【计算机毕设项目】2025级计算机专业项目推荐 (前后端Web项目)
以下项目选题适合计算机专业大部分专业,技术栈主要为:Java语言,SSMVue框架,MySQL数据库 后台免费获取源码,可提供远程调试、环境安装配置服务(文末有联系方式) 以下是本次部分项目推荐1-end&a…...

【MySQL】2.MySQL实际操作
目录 一、数据分析基本流程 注:Navicat快捷键 二、获取数据后的代码操作 (1)探索数据,查看定义 (2)筛选有用的字段 (3)建新表(查询建表插值 三合一) 注意…...

Winform画圆以及无边框窗体的移动
普通圆 在WinForms中绘制一个圆形,可以通过几种方式实现: 1. 使用ControlPaint类 在窗体的Paint事件中使用ControlPaint.DrawCircle方法来绘制圆形。 private void Form1_Paint(object sender, PaintEventArgs e) {int x 100; // 圆心的X坐标int y …...

如何高效记录并整理编程学习笔记?
高效记录并整理编程学习笔记是提升编程学习效率和效果的重要方法。以下是一些具体的步骤、工具及其使用方法的介绍: 一、高效记录笔记的方法 专注理解:在记录笔记时,首先要保持高度的专注,努力理解老师或教程中讲解的知识点。避免…...

docker的安装和常用命令
docker的安装和常用命令 安装老版本新版本 镜像源配置常用命令基本命令清理文件复制构建镜像上传镜像 补充权限不足无目录权限无用户权限 容器访问jenkins推送镜像失败修改主机名编写Dockerfile 注:这里的安装是针对于cetnos7。 安装 老版本 安装老版本可能遇到报…...

haproxy 7000字配图超详细教程 从小白到入门
简介:HAProxy是一个免费的负载均衡软件,可以运行于大部分主流的Linux操作系统上。HAProxy提供了L4(TCP)和L7(HTTP)两种负载均衡能力,具备丰富的功能。HAProxy的社区非常活跃,版本更新快速,HAProxy具备媲美商用负载均衡器的性能和稳…...

使用 LangChain 掌握检索增强生成 (RAG) 的终极指南:5、将自然语言问题转换为结构化查询
5. 查询构建 — Ragatouille 用户用自然语言提出问题并被路由到特定数据源(例如,向量存储、图形数据库等)后,该问题需要被转换为结构化查询,以便从选定的数据源检索信息(例如,文本到SQL、文本到…...

浅析JavaScript 堆内存及其通过 Chrome DevTools 捕获堆快照的方法
JavaScript 的堆内存(Heap Memory)是内存中专门用于存放程序执行过程中动态生成的对象、函数实例以及其他动态数据结构的区域。与调用栈(Call Stack)专注于管理函数调用的顺序和执行环境不同,堆内存则专注于动态地分配…...

C++学习笔记----2、使用C++进行优雅编程(五)----命名
C编译器对于命名有如下规则: 命名中可以有大小写字母、数字、下划线。字母不限于英文字符,可以是任意国家语言的字母,例如日文,阿拉伯文等。不能以数字开头,例如9to5。包含双下划线的被标准库保留不可使用,…...