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://…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...