SpringBoot中整合RabbitMQ(测试+部署上线 最完整)

news2024/11/26 0:55:27

一、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 # 密码
    listener:
      simple:
        acknowledge-mode: auto # 自动ack
        retry:
          enabled: true # 开启消费者失败重试
          initial-interval: 1000ms # 初识的失败等待时长为1秒
          multiplier: 1 # 失败的等待时长倍数,下次等待时长 = multiplier * last-interval
          max-attempts: 3 # 最大重试次数
          stateless: false # true无状态;false有状态。如果业务中包含事务,这里改为false
    publisher-confirm-type: CORRELATED # 交换机的确认
    publisher-returns: true # 队列的确认

3、配置消息转换器
/**
 * 配置消息转换器
 */
@Configuration
@ConditionalOnClass(RabbitTemplate.class) //有RabbitTemplate依赖才会生效,否则不生效
public class MqConfig {
    @Bean
    public 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,所以不用配置direct
            key = "addFavorite.success" // 绑定的key
    ))
    public void listenAddFavoriteCountsSuccess(Long storeId){
        storeService.updateStoreFavoriteUsersCountAdd1(storeId);
    }

}

虽然代码里面也已经解释了,但是下面也再解释一下:

value:是队列信息。起名规则(服务名+业务名+成功+队列),durable表示持久化
exchange:是交换机名称。起名规则是(业务名+direct),和发送方一致
key:绑定的key。起名规则是(业务名+success),表示成功的key,和发送方一致

起名规则是个人而定

5、编写发送方发送消息

@Transactional
    @Override
    public 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实现异步通讯成功。

六、拓展使用

关于一些拓展使用可以参考以下这些博客:

RabbitMQ实现多线程处理接收消息-CSDN博客

在配置mq过程中遇到许许多多的bug和问题,改了很久很久,如果里面有哪些不足的欢迎指正和建议!!!

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

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

相关文章

学习文本到语音转换技术时为何要掌握Mel频谱图?

理解Mel频谱图 “Mel”指的是梅尔频率刻度&#xff08;Mel Frequency Scale&#xff09;&#xff0c;这是一种基于人类听觉感知方式的频率刻度。梅尔频率刻度旨在更好地模拟人耳对声音的感知&#xff0c;因为人类对频率的感知并不是线性的&#xff0c;而是对低频更敏感&#x…

gitlab查看root密码

gitlab查看root密码 gitlab安装后会创建默认的root密码&#xff0c;密码存在配置文件cat /etc/gitlab/initial_root_password中。

深度解析Edge SCDN与CDN:安全加速,全面防护

在现代互联网应用中&#xff0c;CDN已成为提高网站和应用性能不可或缺的技术之一。然而&#xff0c;随着网络安全威胁的日益严峻&#xff0c;单纯依靠CDN提供的加速服务已经不足以满足企业的安全需求。因此&#xff0c;Edge SCDN出现了&#xff0c;它不仅具备CDN的加速特性&…

Selenium + Python 自动化测试12(unittest组织更多用例)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了unittest中test suite 的构建&#xff0c;可以测试多条测试用例。 本篇文章我们接着讲。使用discover()方法构建更多的测试用例。 1、引入需要完成的任务 上…

【鸿蒙教程】快速集成鸿蒙 IM SDK 并实现单聊发送消息

本文手把手教您快速集成鸿蒙版环信即时通讯 IM 并实现单聊。 教程目录 前提条件准备开发环境SDK导入及声明SDK 初始化注册监听回调注册登录发送消息 前提条件 DevEco Studio NEXT Developer Beta1&#xff08;5.0.3.300&#xff09;及以上&#xff1b;HarmonyOS SDK API 12…

4款视频剪辑免费软件推荐,剪辑必备的神器!

对于许多新入门的剪辑小白或者经费有限的剪辑朋友来说&#xff0c;寻找一款免费且好用的剪辑软件是非常重要的。今天&#xff0c;我就来给大家分享4款很实用且专业的免费剪辑软件。 1、福昕免费剪辑 直达链接&#xff1a;www.pdf365.cn/foxit-clip/ 第一个是款功能全面且易上…

支持海思3520D平台网络硬盘录像机NVR源码与NVR解决方案

支持海思3520D平台网络硬盘录像机NVR源码与NVR解决方案 本NVR模组基于HiSilicon&#xff08;海思&#xff09;平台&#xff0c;提供了一套完整的网络视频录像机&#xff08;NVR&#xff09;解决方案。该方案集成了视频接入、存储、回放、智能处理、告警及系统管理等功能模块&a…

数字化转型的权威指南:《数字化时代的敏捷架构》

「链接」https://shop.architectszone.org.cn/p/t_pc/goods_pc_detail/goods_detail/v_66bc7093e4b0d84dab16b12c 《数字化时代的敏捷架构》培训课程 全球最具影响力数字化转型架构出品方The Open Group 专注于企业架构师职业发展的平台AZone联合推出 The Open Group&#x…

第一百九十七节 Java集合教程 - Java集合Map映射

Java集合教程 - Java映射 映射表示包含的集合键值映射。 Map是一个集合&#xff0c;其中每个元素表示一个键值对作为<key&#xff0c;value> ;.<key&#xff0c;value> 对也称为映射中的条目。键和值必须是引用类型。 映射由 Map<K&#xff0c;V> 接口的实…

笔记:在WPF中如何注册控件级全局事件和应用程序级全局事件

一、目的&#xff1a;在WPF中如何注册控件级全局事件和应用程序级全局事件 二、实现 应用程序级全局事件 //注册应用程序级全局事件 EventManager.RegisterClassHandler(typeof(Button), Button.ClickEvent, new RoutedEventHandler(ic_event_Click)); 如上代码既会注册全局…

[爬虫基础]--抓取豆瓣top250电影, 简单易懂, 零基础入门

1. 抓取目标: 下载top250电影的图片, 并以电影名称作为文件名进行保存 2. 获取网页源代码: 我们每天看到的浏览器页面, 本质上都是html代码和css代码, 向服务器发出请求后, 服务器会返回一连串的信息, 经过浏览器选然后, 就变成了我们每天看到的界面 可以在网页中通过鼠标右…

Linux系统编程 --- day1

目录 1. 标准IO 2. 基本操作 2.1 fopen 2.2 fgetc 2.3 fputc 2.4 fgtes 2.5 fputs 2.6 fread 2.7 fwrite 3. linux的文件 1. 标准IO &#xff08;1&#xff09;标准io的概念 1975 Dennis r IO库&#xff0c;C语言的标准&#xff0c; IO --- input output I&#xff…

当前人形机器人公司及产品介绍

产品型号属地公司名字Optimus美国特斯拉Figure02美国FigureAIAtlas美国波士顿动力通用人形Apollo美国ApptronikPhoenix加拿大Sanctuary AIRoBee意大利OversonicASIMO日本本田NAO日本软银GR-1上海傅利叶远征A1上海智元XR4上海达闼先行者K1上海开普勒青龙上海国创AstribotS1深圳星…

AIDL使用及原理介绍

一、AIDL使用及理解 介绍参考官方文档&#xff1a;https://developer.android.com/develop/background-work/services/aidl?hlzh-cn 1.1、aidl文件的产物 1.1.1 aidl文件 interface IDownloadIpc {//开始下载DownloadResponse start(in DownloadInfoParcel downloadInfo);…

【数据结构与算法】A*算法——自动寻路

这里写目录标题 一.为什么用A*算法二.A*算法的实现原理三.A*算法的实现1.初始化地图2.格子初始化3.两个列表4.起点到终点的路径5.起点到终点的最佳路径★6.资源的释放 四.完整代码1.Astar.h2.Astar.cpp3.main.cpp4.运行结果 一.为什么用A*算法 上节课我们已经讲了最短路径算法…

【Qt】内置对话框

一.Qt内置对话框 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt标准对话框全部继承于QDialog类。常⽤标准对话框如下&#xff1a; 二.内置对话框分类 1.消息对话框 QMessageBox 1.1 概念 消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为…

SpringBoot集成微信小程序(二)【登录、获取头像昵称及手机号】

一、背景 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识&#xff0c;快速建立小程序内的用户体系。 微信小程序官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 二、技术栈 SpringBoot…

RFID在晶圆搬运机中的智能化实践

RFID在晶圆搬运机中的智能化实践 应用背景 在半导体制造行业&#xff0c;晶圆搬运是一个至关重要的环节&#xff0c;它不仅影响生产效率&#xff0c;还直接关系到产品的质量和成本。在如今的多品种少量生产中&#xff0c;要保障生产效率和品质&#xff0c;工序管理至关重要。…

Python环境安装及PIP安装(Mac OS版)

官网 https://www.python.org/downloads/ 安装python python-3.12.1-macos11.pkg下载后&#xff0c;安装一直下一步即可 验证是否安装成功&#xff0c;执行python3命令和pip3命令 配置环境变量 获取python3安装位置并配置在.bash_profile #查看python路径 which python3#…

卫星图像检测,分割,跟踪,超分辨率,数据集调研

卫星图像检测&#xff0c;分割&#xff0c;跟踪&#xff0c;超分辨率&#xff0c;数据集调研 超分辨率Image super-resolution: A comprehensive review, recent trends, challenges and applicationsA Review of GAN-Based Super-Resolution Reconstruction for Optical Remot…