消息队列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/docker

sudo 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.6
    container_name: rmqnamesrv
    ports:
      - "9876:9876"
    volumes:
      - /data/namesrv/logs:/root/logs
    command: sh mqnamesrv

  rmqbroker:
    image: apache/rocketmq:4.9.6
    container_name: rmqbroker
    depends_on:
      - rmqnamesrv
    ports:
      - "10911:10911"
      - "10909:10909"
    environment:
      - NAMESRV_ADDR=rmqnamesrv:9876
      - MAX_POSSIBLE_HEAP=2000000000
    volumes:
      - /data/broker.conf:/opt/rocketmq-4.9.6/conf/broker.conf
      - /data/broker/logs:/root/logs
      - /data/broker/store:/root/store
    command: sh mqbroker -c /opt/rocketmq-4.9.6/conf/broker.conf

  dashboard:
    image: apacherocketmq/rocketmq-dashboard:1.0.0
    container_name: rmqdashboard
    depends_on:
      - rmqnamesrv
    ports:
      - "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() {
            @Override
            public 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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值