一、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安装,有解决办法的可以评论一下。
在其他教程到这一步已经可以了,可以参考下面两篇博客:
四、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安装
8、创建虚拟主机
创建一个单独的虚拟主机来进行隔离,这里可以参考前面在虚拟机上的操作。
9、关于图形化界面可能出现的问题
stats in management ui are disabled on this node
可以参考这篇博客:
五、部署项目验证
参考我之前的:部署
修改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(测试+部署上线最新完整)的文章就介绍到这了,更多相关springboot整合rabbitmq部署内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论