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

目录

一、RabbitMQ安装

二、启动RabbitMQ

三、编写Java代码

1、引入依赖

2、配置yml

3、配置消息转换器

4、编写接收方接收消息

5、编写发送方发送消息

6、小程序验证

三、宝塔中安装RabbitMQ

1、下载erlang

(1)查看rabbitmq的版本

(2)查找erlang兼容版本

(3)安装RPM包

2、前往宝塔面板

3、安装RabbitMQ

四、docker中安装rabbitmq

1、安装docker

2、配置docker镜像加速

3、拉取RabbitMQ镜像

4、运行RabbitMQ

5、查看镜像和容器

6、开放客户端服务

7、登录RabbitMQ客户端

8、创建虚拟主机

五、部署项目验证

六、拓展使用


一、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、创建虚拟主机

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

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

Stats in management UI are disabled on this node

可以参考这篇博客:

RabbitMQ客户端界面问题 Stats in management UI are disabled on this node-CSDN博客

五、部署项目验证

参考我之前的博客:记录部署项目《庆自提》完整流程-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和问题,改了很久很久,如果里面有哪些不足的欢迎指正和建议!!!

相关推荐
杨荧20 分钟前
【开源免费】基于Vue和SpringBoot的夕阳红公寓管理系统(附论文)
前端·javascript·vue.js·spring boot·开源
等一场春雨1 小时前
Spring Boot + MyBatis-Flex 配置 ProxySQL 的完整指南
spring boot·后端·mybatis
银氨溶液2 小时前
RabbitMQ实现延迟消息发送——实战篇
java·spring boot·分布式·后端·职场和发展·rabbitmq·延迟消息
xiaolin03332 小时前
RabbitMQ确保消息可靠性
微服务·rabbitmq·springcloud·可靠性
web182859970892 小时前
Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
spring boot·elasticsearch·jenkins
神探阿航2 小时前
基于 Spring Boot 和 Vue.js 的全栈购物平台开发实践
java·vue.js·spring boot·后端
m0_748235073 小时前
springboot+全局异常处理
java·spring boot·spring
web137656076433 小时前
SpringBoot高级-底层原理
java·spring boot·spring
m0_748256783 小时前
springboot整合mybatis-plus【详细版】
spring boot·tomcat·mybatis
苹果酱05673 小时前
前端框架: Vue3组件设计模式
java·vue.js·spring boot·mysql·课程设计