RocketMQ 【安装与启动单机版】

RocketMQ 安装与启动(单机版)


在这里插入图片描述

​ RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部经历了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache名下的一个顶级项目

​ 目前RocketMQ在阿里云上有一个购买即可用的商业版本,商业版集成了阿里内部一些更深层次的功能及运维定制。开源版本相对于阿里云上的商业版本,功能上略有缺失,但大体上功能一致

🌈 RocketMQ的官网地址
🌈 Github官网
🌈 官方文档

1.1 基本概念

消息(Message)

消息是指,消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题

主题(Topic)

主题是 Apache RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。 主题的作用主要如下:

  • 定义数据的分类隔离: 在 Apache RocketMQ 的方案设计中,建议将不同业务类型的数据拆分到不同的主题中管理,通过主题实现存储的隔离性和订阅隔离性

  • 定义数据的身份和权限: Apache RocketMQ 的消息本身是匿名无身份的,同一分类的消息使用相同的主题来做身份识别和权限管理

一个消费者属于一个消费者组,一个消费者组可以订阅多个 topic,但不允许一个消费者同时订阅两个或两个以上的 topic

消息类型(Message Type)

Apache RocketMQ 支持的消息类型有普通消息、顺序消息、事务消息和定时/延时消息

Apache RocketMQ 从5.0版本开始,支持强制校验消息类型,即每个主题Topic只允许一种消息类型的消息,这样可以更好的运维和管理生产系统,避免混乱。但同时保证向下兼容4.x版本行为,强制校验功能默认开启

标签(Tag)

为消息设置的标签,用于同一主题下区分不同类型的消息。来自同一业务单元的消息,可以根据不同业务目的在同一主题下设置不同标签。标签能够有效地保持代码的清晰度和连贯性,并优化 RocketMQ 提供的查询系统。消费者可以根据 Tag 实现对不同子主题的不同消费逻辑,实现更好的扩展性

消息队列(Message Queue)

队列 是 Apache RocketMQ 中消息存储和传输的实际容器,也是消息的最小存储单元。Apache RocketMQ 的所有主题都是由多个队列组成,以此实现队列数量的水平拆分和队列内部的流式存储。队列通过QueueId来做唯一标识和区分

存储消息的物理实体。一个 Topic 中可以包含多个 Queue,每个 Queue 中存放的就是该 Topic 的消息。一个 Topic 的 Queue 也被称为一个 Topic 中消息的分区(Partition)

通俗理解:就是 topic 的分区,用来更好实现队列数量的水平拆分和队列内部的流式存储(水平拆分意味着可以通过增加更多的队列来提高系统的并行处理能力,而流式存储则是指队列可以持续接受和发送消息,适用于高吞吐量的场景)

一个 Topic 的 Queue 中的消息只能被一个消费者组中的一个消费者消费,一个 Queue 中的消息不允许同一个消费者组中的多个消费者同时消费

消费者分组(Consumer Group)

消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。和消费者不同,消费者分组并不是运行实体而是一个逻辑资源。在Apache RocketMQ 中,通过消费者分组内初始化多个消费者,实现消费性能的水平扩展以及高可用容灾

订阅关系(Subscription)

Apache RocketMQ 发布订阅模型中,消息过滤、重试、消费进度的规则配置。订阅关系以消费者粒度进行管理,消费组通过定义订阅关系控制指定消费组下的消费者如何实现消费过滤、消费重试以及消费进度回复等

分片

分片(Sharding)。分片不同于分区,在 RocketMQ 中,分片指的是存放相应 Topic 的 Broker 的数量。每个分片中会创建出相应数量的分区,即 Queue,每个 Queue 的大小都是相同的

在这里插入图片描述

在这里插入图片描述

消息表示(MessageId / Key)

RocketMQ中每个消息拥有唯一的 MessageId,且可以携带具有业务标识的 key,以方便对消息的查询。不过需要注意的是,MessageId 有两个:在生产者 send() 消息时会自动生成一个 MessageId(msgId),当消息到达 Broker 后,Broker 也会自动生成一个 MessageId(offsetMsgId)。msgId 与 key 都成为消息标识

  • msgId:由 producer 端生成,其生成规则为:
    • producerIp + 进程pid + MessageClientIDSetter类的 ClassLoader 的 hashCode + 当前时间 + AutomicInteger 自增计数器
  • offsetMsgId:由 broker 端生成,其生成规则为:brokerIp + 物理分区的 offset(Queue中的偏移量)
  • key:由用户指定业务相关的唯一标识

1.2 系统架构

在这里插入图片描述

RocketMQ 架构上主要分为四部分构成

1.2.1 Producer

消息生产者,负责生产消息。Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败并且低延迟

RocketMQ 中的消息生产者都是以生产者组(Producer Group)的形式出现的。生产者组里的多个生产者可以生产同样的一个或多个主题的消息,比如 A 生产 abc,B 也可以生产 abc

1.2.2 Consumer

消息消费者,负责消费消息。一个消息消费者会从 Broker 服务器中获取消息,并对消息进行相关业务处理。

RocketMQ 中的消息消费者都是以消费者组(Consumer Group)的形式出现的。一个消费者组消费一个 topic ,topic 中的一个分区只能被消费者组中的一个消费者消费。消费者组使得在消息消费方面,实现负载均衡(将一个 topic 中的不同的 Queue 平均分配给同一个 Consumer Group 的不同的 Consumer,注意并不是将消息负载均衡)和容错(一个 Consumer 挂了,该 Consumer Group中的其它 Consumer 可以接着消费原 Consumer 消费的 Queue)的目标变得非常容易

消费者组中 Consumer 的数量应该小于等于订阅 Topic 的 Queue 数量。如果超出 Queue 数量,则多出的 Consumer 将不能消费消息

不过一个 Topic 类型的消息可以被多个消费者组同时消费

一个消费者组中的消费者必须订阅完全相同的 Topic;消费者组只能消费一个 Topic 的消息,不能同时消费多个 Topic 消息

1.2.3 Name Server
  1. 功能介绍

NameServer 是一个 Broker 与 Topic 路由的注册中心,支持 Broker 的动态注册与发现

RocketMQ 的思想依赖于 Kafka,而 Kafka 是依赖了 Zookeeper。在 MetaQ v1.0与2.0版本中,依赖的仍是 Zookeeper。从 MetaQ v3.0,即 RocketMQ 开始去掉了 Zookeeper 依赖,使用了自己的 NameServer

主要包括两个功能:

1、Broker 管理:接受 Broker 集群的注册信息并且保存下来,作为路由信息的基本数据;提供心跳检测机制,检查 Broker 是否存活

2、路由信息管理:每个 NameServer 中都保存着 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer 和 Consumer 通过 NameServer 可以获取整个 Broker 集群的路由信息,从而进行消息的投递和消费

  • 路由注册

NameServer 通常也是以集群的方式部署,不过 NameServer 是无状态的,即 NameServer 集群中的各个节点间是无差异的,各节点间不进行相互信息通讯。那个节点中的数据是如何进行数据同步的呢?在 Broker 节点启动时,轮询 NameServer 列表,与每个 NameServer 节点建立长连接,发起注册请求。在 NameServer 内部维护着一个 Broker 列表,用来动态存储 Broker 的信息

# 注意这种方式与其它像zk、Eureka、Nacos等注册中心不同的地方
在 RocketMQ 中的 NameServer 是无状态方式
- 优点
NameServer 集群搭建、扩容简单
- 缺点
对于 Broker,必须明确指出所有 NameServer 地址,否则未指出的将不会去注册。也正因为如此,NameServer 并不能随便扩容,因为若 Broker 不重新配置,新增的 NameServer 对于 Broker 来说是不可见的,其不会向这个 NameServer 进行注册

Broker 节点为了证明自己活着,为了维护与 NameServer 间的长连接,会将最新的信息以心跳包的方式上报给 NameServer,每30秒发送一次心跳。心跳包中包含 BrokerId、Broker地址、Broker名称、Broker所属集群名称等等。NameServer 在接收到心跳包后,会更新心跳时间戳,记录这个 Broker 的最新存活时间

  • 路由剔除

由于 Broker 关机、宕机或网络抖动等原因,NameServer 没有收到 Broker 的心跳,NameServer 可能会将其从 Broker 列表中剔除

NameServer 中有一个定时任务,每隔10秒就会扫描一次 Broker 表,查看每一个 Broker 的最新心跳时间戳距离当前时间是否超过120秒,如果超过,则会判定 Broker 失效,然后将其从 Broker 列表中剔除

# 扩展:对于 RocketMQ 日常运维工作,例如 Broker 升级,需要停掉 Broker 的工作。OP需要怎么作?

- OP 需要将 Broker 的读写权限禁掉。一旦 Client(Consumer或Producer)向 Broker 发送请求,都会受到 Broker 的 NO_PERMISSION 相应,然后 Client 会进行对其它 Broker 的重试

- 当 OP 观察到这个 Broker 没有流量后,再关闭它,实现 Broker 从 NameServer 的移除

OP:运维工程师
SRE:Site Reliability Engineer,现场可靠性工程师
  • 路由发现

RocketMQ 的路由发现采用的是 Pull 模型。当 Topic 路由信息出现变化时,NameServer 不会主动推送给客户端,而是客户端定时拉取主题最新的路由。默认客户端每30s会拉取一次最新的路由

# 扩展
1) Push模型:推送模型。其实时性较好,是一个“发布-订阅”模型,需要维护一个长连接,而长连接的维护时需要资源成本的。该模型适合于的场景有
- 实时性要求较高
- Client 数量不多,Server数据变化较频繁

2) Pull模型:拉去模型。存在问题是,实时性较差

3) Long Polling模型:长轮询模式。典型的Nacos Config,其是对 Push 与 Pull模型的整合,充分利用了这两种模型的优势,屏蔽了它们的劣势
  • 客户端 NameServer 选择策略

这里的客户端指的是Producer与Consumer

客户端在配置时,必须要写上 NameServer 集群的地址,那么客户端到底连接的是哪个 NameServer 节点呢?客户端首先会产生一个随机的数,然后再与 NameServer 节点数量取模,此时得到的就是所要连接的节点索引,然后就会进行连接。如果连接失败,则会采用 round-robin 策略,逐个尝试着去连接其它节点

首先采用的是 随机策略 进行的选择,失败后采用的是 轮询策略

# 扩展:Zookeeper Client 是如何选择 Zookeeper Server的?
简单来说就是经过两次 Shuffle(刷新,刷牌),然后选择第一台 Zookeeper Server
详细说就是,将配置文件中的 zk Server 地址进行第一次 shuffle,然后随机选择一个。这个选择出的一般都是一个 hostname。然后获取到该 hostname 对应的所有 ip,再对这些 ip 进行第二次 shuffle,shuffle 过的结果中取第一个 Server 地址进行连接
1.2.4 Broker
  • 功能介绍

Broker 充当着消息中转角色,负责存储消息、转发消息、Broker 在 RocketMQ 系统中负责接收并存储从生产者发送来的消息,同时为消费者的拉取请求做准备。Broker 同时也存储着消息相关的元数据,包括消费者消费进度偏移 offset、主题、队列等

在这里插入图片描述

  • Remoting Module:整个 Broker 的实体,负责处理来自 Clients 端的请求。而这个 Broker 实体则由以下模块构成

    • Client Manager:客户端管理器。负责接收、解析客户端(Producer / Consumer)请求,管理客户端。例如,维护 Consumer 的 Topic 订阅消息

    • Store Service:存储服务。提供方便简单的 API 接口,处理 消息存储到物理硬盘消息查询 功能

    • HA Service:高可用服务。提供 Master Broker 和 Slave Broker 之间的数据同步功能

    • Index Service:索引服务。根据特定的 Message key,对投递到的 Broker 的消息进行索引服务,同时也提供根据 Message Key对消息进行快速查询的功能

集群部署

为了增强 Broker 性能与吞吐量,Broker 一般都是以集群形式出现的。各集群节点中可能存放着相同 Topic 的不同 Queue。不过,如果某个 Broker 节点宕机,如何保证数据的不丢失呢?其解决方案是将每个 Broker 集群节点进行横向扩展,即将 Broker 节点再建为一个 HA 集群,解决单点问题

Broker 节点集群是一个主从集群,即集群中具有 Master 与 Slave 两种角色。Master 负责处理读写操作请求,而 Slave负责对 Master 中的数据进行备份。当 Master 挂掉了,Slave 则会自动切换为 Master 去工作,所以这个 Broker 集群是主备集群。一个 Master 可以包含多个 Slave,但一个 Slave只能隶属于一个 Master。Master 与 Slave 的对应关系是通过指定相同的 BrokerName、不同的 BrokerId 来确定的。BrokerId 为0表示 Master,非0表示 Slave。每个 Broker 与 NameServer 集群中的所有节点建立长连接,定时注册 Topic 信息到所有 NameServer

1.2.5 工作流程

1)启动 NameServer,NameServer 启动后开始监听端口,等待 Broker、Producer、Consumer连接

2)启动 Broker 时,Broker 会与所有的 NameServer 建立并保持长连接,然后每30s向 NameServer 定时发送心跳包

3)发送消息前,可以先创建 Topic,创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,当然在创建 Topic 时也会将 Topic 与 Broker 的关系写入到 NameServer 中,不过这步是可选的,也可以在发送消息时自动创建 Topic

# 手动创建Topic时,有两种模式
- 集群模式:该模式下创建的 Topic,在该集群中所有 Broker 中的 Queue 数量是相同的
- Broker模式:该模式下创建的 Topic,每个 Broker 中的 Queue 数量可以不同

# 自动创建 Topic 时,默认采用的是 Broker 模式,会为每个 Broker 默认创建4个 Queue

4)Producer 发送消息,启动时先跟 NameServer 集群中的其中一台建立长连接,并从 NameServer 中获取路由消息,即当前发送的 Topic 消息的 Queue 与 Broker 的地址(IP + Port)的映射关系。然后根据算法策略从队列中选择一个 Queue,与队列所在的 Broker 建立长连接从而向 Broker 发消息。当然,在获取到路由信息后,Producer 会首先将路由信息缓存到本地,再每30s从 NameServer 更新一次路由信息

5)Consumer 跟 Producer 类似,跟其中一台 NameServer 建立长连接,获取其所订阅 Topic 路由信息,然后根据算法策略从路由信息中获取到其所要消费的 Queue,然后直接跟 Broker 建立长连接,开始消费其中的消息。Consumer 在获取到路由信息后,同样也会每30s从 NameServer 更新一次路由信息。不过不同于 Producer 的是,Consumer还会向 Broker 发送心跳,以确保 Broker 的存活状态

读 / 写队列

从物理上来讲,读 / 写队列是同一个队列,所以不存在读 / 写队列数据同步问题。读 / 写队列是逻辑上进行区分的概念。一般情况下,读 / 写队列数量是相同的

例如,创建 Topic 时设置的写队列数量为8,读队列数量为4,此时系统会创建8个 Queue,分别是0,1,2,3,4,5,6,7。Producer 会将消息写入到这8个队列,但 Consumer 只会消费0,1,2,3这4个队列中的消息,4,5,6,7中的消息是不会被消费到的

再如,创建 Topic 时设置的写队列数量为4,读队列数量为8,此时系统会创建8个 Queue,分别是0,1,2,3,4,5,6,7。Producer 会将消息写入到0,1,2,3这4个队列,但 Consumer 只会消费0,1,2,3,4,5,6,7这8个队列中的消息,4,5,6,7中是没有消息的。此时假设 Consumer Group 中包含两个 Consumer,分别为 Consumer1、Consumer2,Consumer1 则消费0,1,2,3四个队列,而 Consumer2消费 4,5,6,7。但实际情况是,Consumer2 所消费的队列是没有消息的,其没有消息可以消费

这也设计的优点在于:方便 Topic 的 Queue 的缩容

例如原来创建的 Topic中包含16个 Queue(16个读,16个写),如何能使其 Queue缩容为8个,还不会丢失消息?可以动态修改写队列数量为8,读队列数量不变。此时新的消息只能写入到前8个队列,而消费都消费的却是16个队列中的数据。当发现8个 Queue 中的消息消费完毕之后,就可以再将读队列数量动态设置为8.整个缩容过程,没有任何数据的丢失

  • perm:用于设置对当前创建 Topic 的操作权限,2表示只写,4表示只读,6表示读写

1.3 下载 RocketMQ 安装包

环境准备

  • 64-bit OS,Linux/Unix/macOS is recommended
Linux vinjcent 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
  • 64-bit JDK 1.8+

🌈RocketMQ官网下载地址

🌈版本5.2.0

在这里插入图片描述

在这里插入图片描述

也可以在服务器上下载,通过以下命令

# 下载二进制文件包
[root@vinjcent rocketmq]# wget https://archive.apache.org/dist/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip

# 解压文件
[root@vinjcent rocketmq]# unzip rocketmq-all-5.2.0-bin-release.zip

# 将压缩文件进行命名
[root@vinjcent rocketmq]# mv rocketmq-all-5.2.0-bin-release ./rocketmq-bin-release

在这里插入图片描述

# 编辑环境变量
[root@vinjcent ~]# vim /etc/profile

# 修改之后需要刷新一下环境变量,需要执行以下命令
[root@vinjcent ~]# source /etc/profile

在这里插入图片描述

由于RocketMQ默认预设的 JVM 内存是4G,这是 RocketMQ 的最佳配置。但通常使用虚拟机的话是不够4G运行内存,需要调整 JVM 内存大小

在启动之前,需要修改一下启动的NameServer、Broker运行内存大小。启动后,mqnamesrv会调用runserver.shmqbroker会调用runbroker.sh进入 /usr/local/rocketmq/rocketmq-bin-release/bin目录

[root@vinjcent bin]# vim runserver.sh
[root@vinjcent bin]# vim runbroker.sh
  • runserver.sh

在这里插入图片描述

  • runbroker.sh

在这里插入图片描述

修改broker配置文件,在/usr/local/rocketmq/rocketmq-bin-release/conf目录下的broker.conf文件(可选)

# 允许自动创建topic
autoCreateTopicEnable=true
# 添加nameserver地址
namesrvAddr=localhost:9876

在这里插入图片描述

# 启动nameServer
$ nohup sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqnamesrv > /usr/local/rocketmq/rocketmq-bin-release/logs/nameserver.out 2>&1 &

# 日志查看
[root@vinjcent bin]# tail -1000f /usr/local/rocketmq/rocketmq-bin-release/logs/nameserver.out

# 启动broker
$ nohup sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqbroker -n localhost:9876 --enable-proxy > /usr/local/rocketmq/rocketmq-bin-release/logs/broker.out 2>&1 &

# 终止broker、namesrv节点
$ sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqshutdown broker
$ sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqshutdown namesrv

官方原话:Before test with tools, we need set the nameserver address to system. like system environment variables NAMESRV_ADDR.

在使用工具测试之前,我们需要设置注册中心地址到系统中,如系统环境变量 NAMESRV_ADDR

在这里插入图片描述

在这里插入图片描述

1.4 测试消息生产/消费

在 RocketMQ 的安装包中,提供了一个tools.sh工具可以用来在命令行快速验证 RocketMQ 服务

在bin目录下执行以下命令测试消息发送,默认会发1000条消息,发送完成自动关闭

# 测试之前需要设置nameServer地址的环境变量
$ export NAMESRV_ADDR=localhost:9876
# 在/usr/local/rocketmq/rocketmq-bin-release/bin目录下,执行生产消息和消费消息
# 生产消息
$ sh tools.sh org.apache.rocketmq.example.quickstart.Producer
# 消费消息
$ sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
  • 生产消息

在这里插入图片描述

  • 消费消息

在这里插入图片描述

如果报错

Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed

则需要在终端上执行以下命令

$ export NAMESRV_ADDR=localhost:9876
# 执行到这一步,大家都可能出现以上的错误,各种情况不同,我来说说我遇到的几个情景
### 情景一:4.0+的版本运行时需要指定broker启动时的配置文件,目录在/usr/local/rocketmq/rocketmq-bin-release/conf下的broker.conf文件(文件内容如下)
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr = 127.0.0.1:9876
brokerIP1 = 127.0.0.1

# 启动broker时,需指定配置文件
$ nohup sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqbroker -n 127.0.0.1:9876 -c /usr/local/rocketmq/rocketmq-bin-release/conf/broker.conf autoCreateTopicEnable=true > /usr/local/rocketmq/rocketmq-bin-release/logs/broker.out 2>&1 &

### 情景二:5.0+版本需要根据官方文档运行broker,需要开启代理模式
$ nohup sh /usr/local/rocketmq/rocketmq-bin-release/bin/mqbroker -n 127.0.0.1:9876 --enable-proxy > /usr/local/rocketmq/rocketmq-bin-release/logs/broker.out 2>&1 &

### 情景三:需要先消费掉已生产的消息,当然因为是使用虚拟机,可能存在网络延迟,需要尝试或等待一会
# 在/usr/local/rocketmq/rocketmq-bin-release/bin目录下,执行消费消息
$ sh tools.sh org.apache.rocketmq.example.quickstart.Consumer

1.5 RocketMQ Console 控制台

下载 Windows 版的 RocketMQ 控制台

🌈 Github RocketMQ Dashboard 地址

在这里插入图片描述

  • 解压后的工程目录如下图所示

在这里插入图片描述

  • 在启动RocketMQ控制台之前,需要启动RocketMQ对应的NameServer端,并开启9876、10909、10911端口号

  • 开启防火墙端口命令

# 开启防火墙端口命令,用于在本机访问服务
$ firewall-cmd --zone=public --add-port=9876/tcp --permanent
$ firewall-cmd --zone=public --add-port=10909/tcp --permanent
$ firewall-cmd --zone=public --add-port=10911/tcp --permanent
# 重启防火墙
$ systemctl restart firewalld.service

firewall-cmd --zone=public --add-port=30911/tcp --permanent
firewall-cmd --zone=public --add-port=40911/tcp --permanent

在这里插入图片描述

修改启动控制台项目的配置文件

  • 由于该项目为SpringBoot项目,所以只需要找到resources目录下对应的application.properties文件即可。需要配置控制台输出在哪个端口(server.port)以及监听注册中心的地址(rocketmq.config.namesrvAddr

在这里插入图片描述

将 RocketMQ 控制台工程打成jar包,并在本地运行

D:\Servers\rocketmq-externals-rocketmq-console-1.0.0\rocketmq-console>mvn clean package -Dmaven.test.skip=true
  • 报错原因及其解决办法

在这里插入图片描述

  • 解决方式一:在pom.xml文件中,将此插件加入跳过配置

在这里插入图片描述

  • 解决方法二:在pom.xml文件中找到插件maven-checkstyle-plugin:2.17对应的插件标签,注释掉

在这里插入图片描述

  • 解决方式三:将压缩文件存放在路径中没有空格的位置(个人是通过此步骤编译成功的)

在这里插入图片描述

在这里插入图片描述

  • 打包好后,在编译好的target目录下使用命令java -jar rocketmq-console-ng-1.0.0.jar启动SpringBoot工程

在这里插入图片描述

  • 访问localhost:9999
    在这里插入图片描述

  • 查询默认创建的 TopicTest 所生成的Message
    在这里插入图片描述

可以看到控制台监控Linux服务器中的NameServer成功

在Linux虚拟机上运行

1、将上述生成的jar包以及application.properties文件上传至虚拟机
在这里插入图片描述

2、修改虚拟机本地rocketmq-console使用的端口号以及监听的nameServer地址
在这里插入图片描述

3、使用java命令,通过自定义上传的配置文件application.properties运行*.jar包,并开放配置文件中的端口9999

# 启动方式一
$ java -jar rocketmq-console-ng-1.0.0.jar --spring.config.location=file:application.properties
# 开启9999端口
$ firewall-cmd --zone=public --add-port=9999/tcp --permanent
$ systemctl restart firewalld.service
# 查看已开放的端口
$ firewall-cmd --list-ports

# 启动方式二:将运行命令放至.sh文件中
$ vim start.sh

# ===============文件内容===============
#!/bin/bash

# 日志文件名
log_file="rocketmq-dashboard.log"

# 启动命令
start_command="java -jar rocketmq-console-ng-1.0.0.jar --spring.config.location=file:application.properties"

# 后台运行启动命令,并将日志输出到日志文件
nohup $start_command > $log_file 2>&1 &

echo "应用已在后台启动,日志输出到 $log_file 文件中."

# ===============文件内容(end)===============

# 赋予文件权限
$ chmod +x start.sh 
# 启动脚本(运行时,需要Ctrl + C终止方式一界面中的程序)
$ ./start.sh 
应用已在后台启动,日志输出到 rocketmq-dashboard.log 文件中.

在这里插入图片描述
在这里插入图片描述

4、在本机测试虚拟机运行的程序接口

在这里插入图片描述

1.6 docker安装

环境准备

# 系统内核时 3.10 以上的
[root@vinjcent ~]# uname -r
3.10.0-1160.el7.x86_64

# 系统版本
[root@vinjcent ~]# cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"


配置docker环境

# 1.卸载旧的版本
yum remove -y docker \
                    docker-client\
                    docker-client-latest\
                    docker-common docker-latest\
                    docker-latest-logrotate\
                    docker-logrotate docker-selinux\
                    docker-engine-selinux\
                    docker-engine
# 2.需要的安装包
$ curl -fsSL get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh --mirror Aliyun

# 5.启动 Docker
$ systemctl start docker

# 6.查看 Docker 状态
$ systemctl status docker

# 配置镜像加速,可以在
# https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors 
# 这个地方获取自己的阿里云镜像,是免费的噢
$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
	"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF

# 7.重新加载docker运行的配置文件
$ sudo systemctl daemon-reload

# 8.启动docker
$ sudo systemctl restart docker

# 9.开机时时自动启动
$ sudo systemctl enable docker
2.28.1
# 10.配置docker-compose
# 在/usr/local/bin目录下下载docker-compose(不建议curl方式下载)
$ curl -L https://github.com/docker/compose/releases/download/1.28.6/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 访问https://github.com/docker/compose/releases
# 下载对应操作系统文件,下载至/usr/local/bin目录下代表可在任意目录下使用docker-compose命令
# 修改对应二进制文件名称
$ mv docker-compose-linux-x86_64 ./docker-compose
# 对二进制文件应用可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
# 查看版本(如若执行报错,则可能下错对应文件类型,或是没给文件添加可编辑权限)
$ ./docker-compose -v

在这里插入图片描述

在这里插入图片描述

配置docker-compose文件

version: '3'
services:
  namesrv:
    image: apache/rocketmq:5.2.0
    container_name: rmqnamesrv
    ports:
      - "9876:9876"
    command: sh mqnamesrv
    environment:
      - JAVA_OPT_EXT=-Xms128m -Xmx128m -Xmn128m

  broker:
    image: apache/rocketmq:5.2.0
    container_name: rmqbroker
    ports:
      - "10909:10909"
      - "10911:10911"
    depends_on:
      - namesrv
    command: sh mqbroker -n namesrv:9876
    environment:
      - JAVA_OPT_EXT=-Xms128m -Xmx128m -Xmn128m
      - BROKER_ID=0
      - AUTO_CREATE_TOPIC_ENABLE=true
      - AUTO_CREATE_SUBSCRIPTION_GROUP=true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naijia_OvO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值