前言
环境搭建是源码分析的第一步,俗话说磨刀不误砍柴工,我们必须要先把本地环境搭建好,才方便后续我们分析和debug源码。
环境&源码准备
开发环境
- JDK
调试RocketMQ的JDK建议使用JDK1.8
- Maven
源码准备
RocketMQ源码在Github上apache/rocketmq,首先Fork一个属于自己的仓库,然后再从Fork出来的仓库将源码拉下来,代码拉完之后通过idea打开,再等待Maven下载依赖包,idea加载索引,一切准备完成之后,别忘了将分支切换到想要分析源码的分支。
本文使用的RocketMQ版本是
release-4.9.4
我们可以通过idea statistic插件看到RocketMQ大概有15万行代码。
RocketMQ包介绍
我们主要分析RocketMQ中最重要的4大组件namesrv
,broker
,producer
,consumer
。通过idea打开RocketMQ工程有如下包
我们需要重点关注的包有
- rocketmq-broker
broker源码存放在rocketmq-broker包中
- rocketmq-client
producer和consumer的源码存放在rocketmq-client中
- rocketmq-example
这个包有很多rocketmq使用的例子,包括简单消息发送和接收例子,批量消息,顺序消息,事务消息,定时消息等等,需要重点关注,我们也可以利用example包中的例子帮助我们调试RocketMQ的源码
- rocketmq-namesrv
namesrv的源码存放在这个包中
- rocketmq-store
broker中消息存储相关的代码
本地调试环境搭建
本地Debug环境搭建过程如下
- 通过源码启动Namesrv
- 搭建Docket搭建rocketmq-dashboard
- 通过源码启动broker
- 通过源码启动Producer
- 通过源码启动Consumer
Namesrv本地调试环境搭建
Namesrv源码在rocketmq-namesrv
包下,启动类是src/main/java/org/apache/rocketmq/namesrv/NamesrvStartup.java
,直接通过NamesrvStartup的main方法启动会失败。
终端输出提示我们需要配置一个ROCKETMQ_HOME
环境变量,我们将环境变量配置到idea中
再次启动NamesrvStartup后再次报错
说明namesrv启动过程需要logback相关配置文件,我们可以从RocketMQ官网下载一个RocketMQ安装包,解压过后,安装包目录如下
我们可以将conf文件夹复制到rocketmq源码的根目录,再启动namesrv,控制台提示启动成功
Rocketmq-dashboard环境搭建
Rocketmq-dashboard是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。rocketmq-dashboard不是我们本次研究的源码范围,因此我们通过docker来快速搭建rocketmq-dashboard,通过docker搭建步骤如下
- 下载镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
- 启动docker-dashboard
下面需要将namesrv ip改为自己本机的ip,监听端口也可以根据自己的需要修改
docker run -p 8101:8080 --name rocketmq-console -d \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.0.120:9876" \
-t apacherocketmq/rocketmq-dashboard
通过浏览器打开rocketmq-dashboard没有报错提示,说明dashboard已经连上了namesrv,dashboard搭建成功,点开Cluster没有匹配的Cluster是因为还没有Broker注册到namesrv上。
Broker本地调试环境搭建
Broker源码在rocketmq-broker
包下,启动类是src/main/java/org/apache/rocketmq/broker/BrokerStartup.java
,如果直接通过idea启动也会失败。
与上面namesrv一样,我们在idea上配置启动环境变量ROCKETMQ_HOME
。打开conf文件,可以看到安装包中包含logback相关配置文件,broker.conf是broker的配置文件,打开broker.conf,并修改namesrAddr为本地ip。
再次启动broker,broker成功启动,启动后控制台提示broker成功启动,仔细观察发现控制台中打印的brokerName与配置文件中的brokerName不相同,RocketMQ的Dashboard也没有集群信息,虽然broker成功启动了,但是并没有将信息注册到namesrv上。
在broker启动时可以通过-c
参数指定broker的配置路径,添加broker配置路径后,再次重新启动
控制台输出的brokerName与配置文件中的brokerName相同
dashboard上也显示broker成功注册到namesrv上,至此rocketmq本地的调试环境就搭建完成拉,小伙伴可以推送一条消息试试。