RocketMQ源码之路(一)搭建RocketMQ源码环境

RocketMQ首图

提到消息队列(Message Queue),大家都会想到常见的那几种,比如:KafkaRabbitMQRocketMQActiveMQZeroMQMetaMQ等,当然还有很多企业内部自研了适用于公司业务的MQ系统。作为分布式系统的重要组件,MQ常用于系统间的解耦,以及削峰填谷、异步处理等场景。我们学习MQ,不仅要学会如何去使用,更要深入学习MQ的设计思想,以及MQ的实现原理。上述常见的MQ组件中,笔者推荐大家对阿里巴巴的RocketMQ进行深入学习,它是Java语言实现,并且经历了“双十一”巨大流量的考验,是一个值得去学习的一个组件。本系列文章采用RocketMQ 4.7.1的版本进行深入的源码研究,感兴趣的朋友可以去RocketMQgithub仓库中将其fork到自己的仓库中进行学习。笔者将RocketMQ 4.7.1的版本的源码下载下来,导入到了自己的仓库中,后续的源码分析注释都将基于该仓库代码,仓库地址:https://github.com/itlemon/itlemon-rocketmq

一、RocketMQ源码结构

本文不再赘述如何去fork代码,如何去git clone代码,笔者认为多数读者都会这些基本操作,如果正在阅读的您尚未掌握这些技巧,可以去查看一下其他博主的文章,正确把RocketMQ源码拉取到本地后再来阅读该文章。
Apache RocketMQ是一个基于Java语言开发的消息中间件,构建工具采用的是常用的maven,基本的代码结构如下图1-1所示:
图1-1 RocketMQ代码结构
RocketMQ的所有模块都在上图进行了展示,笔者隐藏了部分文本文件,可能与你git clone下来的代码结构有细微区别。接下来,用下表对上述模块进行功能解释。

模块名称功能介绍
acl访问控制列表(Access Control Lists,ACL),RocketMQ权限管理模块
broker接收客户端请求,处理消息分发,存储消息数据等
clientMQ客户端,包括Producer和Consumer
common用于存储RocketMQ项目的通用代码和Model等
devmerge_rocketmq_pr.py脚本,用于处理RP
distributionClient、Namesrv、Broker等启动脚本及打包脚本
docs文档
exampleRocketMQ示例代码,源码分析可以从这里入手
filter过滤器模块,包含SQL过滤
logappender日志appender模块
logging日志实现模块
namesrvNamesrv实现模块
openmessagingopenmessaging模块
remoting基于Netty实现的网络通信模块,RocketMQ各组件之间的通信都依赖它
srvutil工具包模块
store数据存储模块,例如Broker数据
style代码风格XML文件
testRocketMQ案例测试模块
toolsRocketMQ对外命令行接口、管理类接口等

二、RocketMQ源码编译

RocketMQ源码导入到IntelliJ IDEA中,如下图2-1所示:

然后进入到RocketMQ根目录,在控制台使用命令mvn -Dmaven.test.skip=true clean package进行编译,当然也可以使用IDEA可视化插件进行编译,如下图2-2所示:

编译成功后如下图2-3所示:

如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将maven的远程仓库替换成为阿里云maven仓库

三、启动Namesrv和Broker

编译完成之后,可以尝试启动NamesrvBroker,为了阅读源码方便,笔者不建议去下载RocketMQ官方编译打包好的NamesrvBroker进行测试,而是直接在IDEA中启动NamesrvBroker,方便后续的代码分析,接下来,我将带着大家一步一步去启动NamesrvBroker

3.1 启动Namesrv

进入到namesrv源代码的org.apache.rocketmq.namesrv包中,找到启动类NamesrvStartup,然后拷贝它的全路径,进入到启动窗口进行配置(建议先启动一下启动类,然后该窗口的部分参数都会自动填好),如下3-1所示:
图3-1 Namesrv启动参数配置面板
这里主要需要配置好一个环境变量ROCKETMQ_HOME,可以在计算机的任何位置建一个目录,设置为ROCKETMQ_HOME,当然笔者建议就在本项目的根目录建一个目录,方便查看日志等。目录建立好之后,在rocketmq_home目录下建立三个目录,分别是conflogsstore,分别用于存储配置文件,日志以及数据。然后将distribution模块中conf目录下的broker.conflogback_broker.xmllogback_namesrv.xml拷贝到rocketmq_home下的conf目录中,并修改部分配置。首先修改broker.conf,具体内容如下:

brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
# 添加此项,broker连接到本地的namesrv上
namesrvAddr = 127.0.0.1:9876
deleteWhen = 04
fileReservedTime = 48
# 同步复制,异步刷盘
brokerRole = SYNC_MASTER
flushDiskType = ASYNC_FLUSH

###########################################添加以下配置,路径请修改为自己的正确路径
# 配置存储位置
storePathRootDir = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store
# commitlog 存储路径
storePathCommitLog = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store/commitlog
# 消费队列存储路径
storePathConsumeQueue = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store/consumequeue
# 消息索引存储路径
storePathIndex = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store/index
# checkpoint文件存储路径
storeCheckPoint = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store/checkpoint
# abort文件存储路径
abortFile = /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/store/abort

为了将日志也存储到指定的rocketmq_home下的logs目录,还需要修改一下两个logback.xml文件,在两个日志中各添加一项配置,在<configuration>标签下的第一行添加如下配置,用来覆盖系统变量值。

<!-- 自定义配置,目录需要改成自己的rocketmq_home -->
<property name="user.home" value="/Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home"/>

配置了上述内容,就可以正常启动Namesev模块了,其实上述配置也包含了Broker的相关配置,为了方便,就放在一起进行表述了。注意:Namesrv的默认启动端口是9876。当然,我们也可以修改NamesrvStartup的源码,让其支持自定义端口,具体可参考《RocketMQ源码之路(二)NameServer路由中心源码分析》。

3.2 启动Broker

配置Broker的启动类,添加一个启动参数指定配置文件启动,参数是:

-c /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/conf/broker.conf

并指定环境变量ROCKETMQ_HOME,具体如下图3-2所示:
图3-2 Broker启动参数配置面板
配置完Broker后就可以正常启动了,后续的测试注意要先启动Namesrv,后启动Broker,顺序不要乱。

四、测试消息生产者和消费者

启动好NamesrvBroker模块以后,进入到example模块中,找到org.apache.rocketmq.example.quickstart包,里面已经有了两个类,分别是ProducerConsumer,在两个类中分别设置一下Namesrv地址,如下所示:

// Producer
producer.setNamesrvAddr("127.0.0.1:9876");
// Consumer
consumer.setNamesrvAddr("127.0.0.1:9876");

然后分别启动ConsumerProducer就可以正常进行消息消费了。

五、总结

本文言简意赅,和我以前的文章风格大有不同,以前是面面俱到,全文翔实。原因是这篇文章是帮助大家尽快搭建起源码环境,对于一些基础知识,比如RocketMQ的发展史,什么是Namesrv、什么是Broker,这些基础知识大家可以去阅读RocketMQ官网文档或者其他博客可以了解到,所以这里就没有过多介绍。接下来,欢迎大家订阅我的RocketMQ源码之路系列文章,让我们一起去遨游RocketMQ源码世界吧!

了解更多干货,欢迎关注我的微信公众号:爪哇论剑(微信号:itlemon)
微信公众号-爪哇论剑-itlemon

相关推荐
©️2020 CSDN 皮肤主题: 撸撸猫 设计师:马嘣嘣 返回首页