消息队列RocketMQ-docker部署保姆级教程(从0到1)(2)
目录
引言
1. 准备工作
1.1 准备虚拟机
1.2 将虚拟机的ip设置为静态ip地址
1.3 什么是nat网络
1.4 测试网络
2. 准备docker环境
2.1 卸载旧docker(如果有)
2.2 安装依赖包
2.3 添加 Docker 官方仓库(国内推荐使用阿里云镜像)
2.4 安装 Docker CE(社区版)
2.4.1 安装
2.4.2 启动docker
2.4.3 设置docker开机自启
2.4.4 验证是否安装成功
2.4.5 设置docker镜像地址
3. 安装RocketMQ
3.1 下载镜像
3.2 创建目录
3.3 启动docker-compose
3.4 关闭docker-compose
3.5 一键启动脚本
4. 通过Java sdk发送消息已经消费消息
4.1 创建Java项目
4.2 生产者
4.3 消费者
5. 每日一笑
引言
续接上文,上文我们了解到了消息队列,也详细介绍了Rocket MQ的特性和基本使用,这一章我们来讲解如何使用在Linux中部署RocketMQ。知识点如下:
- 安装虚拟机
- 修改虚拟机的ip为静态IP地址
- 安装docker
- 解决docker pull慢/出错的问题
- 安装docker-compse
- 部署RocketMQ
- 通过Java sdk发送消息并且成功消费
1. 准备工作
博主使用的Vmware+CentOS7+MobaXterm
1.1 准备虚拟机
在这里选择你们电脑的镜像文件
至此虚拟机就创建好了,接下来要准备安装系统了,开启虚拟机,
下滑到最后选择中文-简体
密码太简单的点击两次完成就可以了
输入命令行,查看虚拟机IP地址,并且使用ssh连接工具连接虚拟机(博主使用的使用mobaxterm)
ip addr
1.2 将虚拟机的ip设置为静态ip地址
输入命令行
sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改之后的内容如下
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="896b9265-b251-4223-a421-9c73206785a8"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.157.201
NETMASK=255.255.255.0
GATEWAY=192.168.157.2
DNS1=8.8.8.8
DNS2=114.114.114.114
重启网络服务
sudo systemctl restart network
发现ssh工具连接不上了,现在需要设置一下VMware的nat设置以及ssh连接的IP地址,点击编辑然后选择虚拟网络编辑器
因为我刚刚设置的虚拟机ip为192.168.157.201,所以这里的子网ip得设置成192.168.157.0
然后点击nat设置,将网关ip设置成我们虚拟机设置的网关ip地址192.168.157.2
最后点击确定应用即可,接下来修改一下ssh的连接ip地址为192.168.157.201(我们刚刚设置的虚拟机静态ip地址)
成功连接上
1.3 什么是nat网络
VMware有三种网络连接方式:仅主机、桥接、和nat
在NAT模式下,虚拟机的IP地址由VMware虚拟网络(如VMnet8的子网)分配,例如 192.168.157.200
-
关键点:虚拟机的IP和主机的IP属于不同网段,彼此独立。
所以在nat模式下虚拟机的ip跟我们主机的ip是没有任何关系的。而因为我们在同一个局域网下所以通过ssh工具能够连接上我们的虚拟机。
1.4 测试网络
输入命令测试外网连通性
ping 8.8.8.8
测试dns解析
ping www.baidu.com
结果如上就表明没有任何问题
2. 准备docker环境
2.1 卸载旧docker(如果有)
我们是新装的虚拟机所有不需要执行
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
2.2 安装依赖包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
发现出现下列报错
是因为yum镜像源的问题我们需要修改一下镜像源头
# 备份旧的 yum 源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup# 下载阿里云 CentOS 7 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo# 清理缓存并生成新缓存
yum clean all
yum makecache
执行结果如下:
再次执行命令
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
大功告成
2.3 添加 Docker 官方仓库(国内推荐使用阿里云镜像)
输入以下命令
sudo yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
2.4 安装 Docker CE(社区版)
2.4.1 安装
输入以下命令
sudo yum install -y docker-ce docker-ce-cli containerd.io
大功告成!
2.4.2 启动docker
sudo systemctl start docker
输入之后就启动成功了(没有任何输出结果,这是正常的)
2.4.3 设置docker开机自启
sudo systemctl enable docker
2.4.4 验证是否安装成功
docker version
docker info
出现下列界面就是正常的
2.4.5 设置docker镜像地址
通过docker pull镜像的时候很慢甚至总是报错可以使用下面的命令行修改一下镜像地址
sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://do.nark.eu.org","https://dc.j8.work","https://docker.m.daocloud.io","https://dockerproxy.com","https://docker.mirrors.ustc.edu.cn","https://docker.nju.edu.cn","https://registry.docker-cn.com","https://hub-mirror.c.163.com","https://hub.uuuadc.top","https://docker.anyhub.us.kg","https://dockerhub.jobcher.com","https://dockerhub.icu","https://docker.ckyl.me","https://docker.awsl9527.cn","https://mirror.baidubce.com","https://docker.1panel.live","https://2epe3hl0.mirror.aliyuncs.com"]
}
EOF
执行完成之后会发现/etc/docker目录下多了一个daemon.json镜像文件,这个就是我们设置的镜像地址
重启一下docker,确保配置生效
systemctl staret docker
2.3 安装docker-compose
博主最开始使用的docker直接拉镜像,发现比较麻烦,所以使用docker-compose,后期维护也很好维护
2.3.1 下载docker-compose
这里用的是 v1.29.2,稳定兼容 Docker Engine < 20.10 的版本
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.3.2 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose
2.3.3 创建软连接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
2.3.4 验证安装
docker-compose --version
安装成功!
3. 安装RocketMQ
3.1 下载镜像
使用docker-compose太慢了,所以我先用docker拉取镜像,再通过docker-compose创建容器和启动
下载RocketMQ4.9.6
docker pull apache/rocketmq:4.9.6
控制台镜像
docker pull apacherocketmq/rocketmq-dashboard:1.0.0
3.2 创建目录
下载tree
yum install tree
在根目录创建如下结构的目录
其中docker-compose.yml内容如下
version: '3.8'services:rmqnamesrv:image: apache/rocketmq:4.9.6container_name: rmqnamesrvports:- "9876:9876"volumes:- /data/namesrv/logs:/root/logscommand: sh mqnamesrvrmqbroker:image: apache/rocketmq:4.9.6container_name: rmqbrokerdepends_on:- rmqnamesrvports:- "10911:10911"- "10909:10909"environment:- NAMESRV_ADDR=rmqnamesrv:9876- MAX_POSSIBLE_HEAP=2000000000volumes:- /data/broker.conf:/opt/rocketmq-4.9.6/conf/broker.conf- /data/broker/logs:/root/logs- /data/broker/store:/root/storecommand: sh mqbroker -c /opt/rocketmq-4.9.6/conf/broker.confdashboard:image: apacherocketmq/rocketmq-dashboard:1.0.0container_name: rmqdashboarddepends_on:- rmqnamesrvports:- "8080:8080"environment:- JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876
broker.conf的内容如下:
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.157.201
namesrvAddr=192.168.157.201:9876
需要把ip地址换成自己虚拟机的,如果不换则会导致使用Javasdk发送消息的时候出现
org.apache.rocketmq.remoting.exception.RemotingTooMuchRequestException: sendDefaultImpl call timeout
异常,因为RocketMQ的默认IP地址取的是虚拟机内部容器的ip的地址172.20....
3.3 启动docker-compose
需要先进入含有docker-compose.yml的文件夹中哦
启动命令如下
docker-compose up -d
现在就大功告成了!
通过命令查看docker中的容器
docker ps -a
通过docker-compose能够更好的维护容器已经镜像版本等
3.4 关闭docker-compose
输入以下命令
docker-compose down
3.5 一键启动脚本
创建build.sh文件内容如下(需要和docker-compose.yml放在同一个目录下)
docker-compose down && docker-compose up -d
给文件添加执行权限:
chmod +x ./build.sh
运行
bash build.sh
3.6 访问控制台
在浏览器中数据192.168.157.201:8080即可访问控制台
4. 通过Java sdk发送消息已经消费消息
4.1 创建Java项目
创建Java的maven项目,Java的jdk版本为1.8+,引入RocketMQ4.9.6的依赖
<dependencies><dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>4.9.6</version></dependency></dependencies>
4.2 生产者
代码如下:
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;public class ProducerExample {public static void main(String[] args) throws Exception {
// 创建生产者实例,并设置生产者组名DefaultMQProducer producer = new DefaultMQProducer("test_group");// 设置 Name Server 地址,此处为示例,实际使用时请替换为真实的 Name Server 地址producer.setNamesrvAddr("192.168.157.201:9876");producer.start();try {// 创建消息实例,指定 topic、Tag和消息体Message msg = new Message("TestTopic", "TagA", ("Hello RocketMQ").getBytes());// 发送消息并获取发送结果SendResult sendResult = producer.send(msg);System.out.println("Message sent: " + new String(msg.getBody()));System.out.println("Send result: " + sendResult);} catch (Exception e) {e.printStackTrace();System.out.println("Message sending failed.");} finally {// 关闭生产者producer.shutdown();}}
}
4.3 消费者
代码如下:
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.common.message.MessageExt;import java.util.List;public class ConsumerExample {public static void main(String[] args) throws Exception {// 创建消费者实例,并设置消费者组名DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group");// 设置 Name Server 地址,此处为示例,实际使用时请替换为真实的 Name Server 地址consumer.setNamesrvAddr("192.168.157.201:9876");// 订阅指定的主题和标签(* 表示所有标签)consumer.subscribe("TestTopic", "TagA");// 注册消息监听器consumer.registerMessageListener(new MessageListenerConcurrently() {@Overridepublic ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {for (MessageExt msg : msgs) {System.out.println("Received message: " + new String(msg.getBody()));}return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;}});// 启动消费者consumer.start();System.out.println("Consumer started.");}
}
运行结果如下:
如果想要通过本地ip直接访问虚拟机的话,可以在VMware中设置一下nat的端口转发
点击确定然后保存即可
接下来将生成中的nameserver的ip地址改为localhost:9876,运行截图如下(配置了端口转发之后依旧可以用虚拟机的ip地址访问哦,只是增加了一个通过本地ip访问的途径,包括控制台也是一样:localhost:8083(我设置的8083转发到虚拟机的8080))
大功告成!!!
后续会再出关于rocketmq常见的消息发送的教程和案例以及在企业中对rocketmq的二次封装便于使用!!
有疑问欢迎大家在评论区留言,博主会关注并提供一点帮助
5. 每日一笑
问:程序员最讨厌康熙的哪个儿子?
答:胤禩。因为他是八阿哥(Bug)。