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

本文主要是介绍SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化...

一、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

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

由于目前是测试阶段,这里我使用之前学习的时候的版本。

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

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

创建新用户后重新登陆,然后创建一个单独的 _Virtual Hosts (虚拟主机)_来进行隔离。

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

三、编写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 # 用户名
    XdgRfjsofpassword: xxx # 密码
    listener:
      simple:
        acknowledge-mode: auto # 自动ack
        retry:
          enabled: true # 开启消费者失败重试
          initial-interval: 1000ms # 初识的失败等待时长为1秒
          multiplier: 1 # China编程失败的等待时长倍数,下次等待时长 = 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、编写接收方接收消息

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

/**
 * 接收消息
 */
@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、编写发送方发送消息

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

@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、小程序验证

点击收藏。

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

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

在RabbitMQ的界面中队列也有一条消息出现,说明mq实现异步通讯成功。

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

该案例是收藏商品后完成收藏表插入语句后,还要去商品表更新商品表,更新该商品的被收藏数加一,但是如果同步通讯的话,响应会有延迟,可能会对性能造成一定影响,但是通过异步通讯,不需要实时响应,就会对性能有一定的优化

三、宝塔中安装RabbitMQ

1、下载erlang

RabbitMQ服务端是由并发式语言Erlang编写的,所以安装RabbitMQ的之前需要安装Erlang,保证所需要的环境。

安装之前注意版本兼容问题:Erlang Version Requirements | RabbitMQ

安装erlang地址:https://www.erlang-solutions.com/downloads/#

(1)查看rabbitmq的版本

先去宝塔查看rabbitmq的版本:

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

(2)查找erlang兼容版本

然后去找到版本兼容的erlang版本:Erlang Version Requirements | RabbitMQ

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

(3)安装RPM包

去下载:https://www.erlang-solutions.com/downloads/#

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

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

下载后拿到rpm文件:

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

注意:这里没有下载的版本,下载需要与自己的版本一致,如果发现启动不了RabbitMQ,请看后面的启动RabbitMQ。

注意!注意!注意!

2、前往宝塔面板

进入tmp目录,将之前的rpm包放进去。

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

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

3、安装RabbitMQ

软件商店中安装RabbitMQ

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

出现问题:

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

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

看到报错日志,我又去下载报错日志里面的版本。

再次去:https://www.erlang-solutions.com/downloads/#

我是Centos7,所以下载该版本。那边有点不人性化,我尝试了几次才下载到自己的版本。

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

将之前的哪个rmp文件删掉,再将刚刚下载的rpm文件重命名再次放入tmp目录中

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

上面我重命名错了,只记得修改后面,下面是再次修改后的结果。

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

卸载rabbitmq,然后再重新安装一次。

还是出现报错:

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

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

出现了这个报错,很莫名其妙,然后我就去用docker安装,有解决办法的可以评论一下。

在其他教程到这一步已经可以了,可以参考下面两篇博客:

宝塔面板安装Rawww.chinasem.cnbbitMQ(已解决)

宝塔安装rabbitMQ实战

四、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

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

5、查看镜像和容器

docker images
docker ps

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

到这里已经是成功在docker中装好mq容器了

但是在我访问http://主机ip:15672的时候却无法访问,即使我开放了服务器的安全组。后来猜到应该是客户端服务可能是没开启,在之前宝塔软件里面好像有看过这个东西。

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

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

6、开放客户端服务

在mq容器中打开终端

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

列出所有可用的插件:

rjavascriptabbitmq-plugins list

找到rabbitmq_management:

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

开启rabbitmq_management:

rabbitmq-plugins enable rabbitmq_management

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

然后再访问客户端,成功访问:

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

7、登录RabbitMQ客户端

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

这里显示有些特性标志未开启,我们可以去开启那些标志。

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

参考博客:Docker RabbitMQ安装

8、创建虚拟主机

创建一个单独的虚拟主机来进行隔离,这里可以参考前面在虚拟机上的操作。

9、关于图形化界面可能出现的问题

Stats in management UI are disabled on this node

可以参考这篇博客:

RabbitMQ客户端界面问题 

五、部署项目验证

参考我之前的:部署

修改yml配置文件,修改下面的消息:

  rabbitmq:
    host: ${quick.rabbitmq.host}
    port: ${quick.rabbitmq.port} # 端口
    virtual-host: ${quick.rabbitmq.virtual-host} # 虚拟主机
    username: ${quick.rabbitmq.username} # 用户名
    password: ${quick.rabbitmq.password} # 密码

在已经上线的小程序测试~~

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

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

目前只有一个人收藏,现在去测试一下。

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

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

收藏成功,去看一下数据库,查看是否更新。

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

去查看mq客户端:

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

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

成功更新,说明使用RabbitMQ实现异步通讯成功。

六、拓展使用

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

RabbitMQ实现多线程处理接收消息

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

到此这篇关于SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的文章就介绍到这了,更多相关SpringBoot整合RabbitMQ部署内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153520

相关文章

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

shell脚本自动删除30天以前的文件(最新推荐)

《shell脚本自动删除30天以前的文件(最新推荐)》该文章介绍了如何使用Shell脚本自动删除指定目录下30天以前的文件,并通过crontab设置定时任务,此外,还提供了如何使用Shell脚本删除E... 目录shell脚本自动删除30天以前的文件linux按照日期定时删除elasticsearch索引s

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui