RocketMQ源码之路(一)搭建RocketMQ源码环境
一、RocketMQ源码结构
本文不再赘述如何去fork
代码,如何去git clone
代码,笔者认为多数读者都会这些基本操作,如果正在阅读的您尚未掌握这些技巧,可以去查看一下其他博主的文章,正确把RocketMQ
源码拉取到本地后再来阅读该文章。
Apache RocketMQ
是一个基于Java
语言开发的消息中间件,构建工具采用的是常用的maven
,基本的代码结构如下图1-1所示:
RocketMQ
的所有模块都在上图进行了展示,笔者隐藏了部分文本文件,可能与你git clone
下来的代码结构有细微区别。接下来,用下表对上述模块进行功能解释。
模块名称 |
功能介绍 |
---|---|
acl |
访问控制列表(Access Control Lists,ACL),RocketMQ权限管理模块 |
broker |
接收客户端请求,处理消息分发,存储消息数据等 |
client |
MQ客户端,包括Producer和Consumer |
common |
用于存储RocketMQ项目的通用代码和Model等 |
dev |
merge_rocketmq_pr.py脚本,用于处理RP |
distribution |
Client、Namesrv、Broker等启动脚本及打包脚本 |
docs |
文档 |
example |
RocketMQ示例代码,源码分析可以从这里入手 |
filter |
过滤器模块,包含SQL过滤 |
logappender |
日志appender模块 |
logging |
日志实现模块 |
namesrv |
Namesrv实现模块 |
openmessaging |
openmessaging模块 |
remoting |
基于Netty实现的网络通信模块,RocketMQ各组件之间的通信都依赖它 |
srvutil |
工具包模块 |
store |
数据存储模块,例如Broker数据 |
style |
代码风格XML文件 |
test |
RocketMQ案例测试模块 |
tools |
RocketMQ对外命令行接口、管理类接口等 |
二、RocketMQ源码编译
将RocketMQ
源码导入到IntelliJ IDEA
中,如下图2-1所示:
然后进入到RocketMQ
根目录,在控制台使用命令mvn -Dmaven.test.skip=true clean package
进行编译,当然也可以使用IDEA
可视化插件进行编译,如下图2-2所示:
编译成功后如下图2-3所示:
如果编译过程中出现插件找不到或者部分依赖找不到,可以尝试将maven的远程仓库替换成为阿里云maven仓库。
三、启动Namesrv和Broker
编译完成之后,可以尝试启动Namesrv
和Broker
,为了阅读源码方便,笔者不建议去下载RocketMQ
官方编译打包好的Namesrv
和Broker
进行测试,而是直接在IDEA
中启动Namesrv
和Broker
,方便后续的代码分析,接下来,我将带着大家一步一步去启动Namesrv
和Broker
。
3.1 启动Namesrv
进入到namesrv
源代码的org.apache.rocketmq.namesrv
包中,找到启动类NamesrvStartup
,然后拷贝它的全路径,进入到启动窗口进行配置(建议先启动一下启动类,然后该窗口的部分参数都会自动填好),如下3-1所示:
这里主要需要配置好一个环境变量ROCKETMQ_HOME
,可以在计算机的任何位置建一个目录,设置为ROCKETMQ_HOME
,当然笔者建议就在本项目的根目录建一个目录,方便查看日志等。目录建立好之后,在rocketmq_home
目录下建立三个目录,分别是conf
、logs
、store
,分别用于存储配置文件,日志以及数据。然后将distribution
模块中conf
目录下的broker.conf
、logback_broker.xml
、logback_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 = ASYNC_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
。
3.2 启动Broker
配置Broker
的启动类,添加一个启动参数指定配置文件启动,参数是:
-c /Users/itlemon/IdeaProjects/itlemon-rocketmq/rocketmq_home/conf/broker.conf
并指定环境变量ROCKETMQ_HOME
,具体如下图3-2所示:
配置完Broker
后就可以正常启动了,后续的测试注意要先启动Namesrv
,后启动Broker
,顺序不要乱。
四、测试消息生产者和消费者
启动好Namesrv
和Broker
模块以后,进入到example
模块中,找到org.apache.rocketmq.example.quickstart
包,里面已经有了两个类,分别是Producer
和Consumer
,在两个类中分别设置一下Namesrv
地址,如下所示:
// Producer
producer.setNamesrvAddr("127.0.0.1:9876");
// Consumer
consumer.setNamesrvAddr("127.0.0.1:9876");
然后分别启动Consumer
和Producer
就可以正常进行消息消费了。
五、总结
本文言简意赅,和我以前的文章风格大有不同,以前是面面俱到,全文翔实。原因是这篇文章是帮助大家尽快搭建起源码环境,对于一些基础知识,比如RocketMQ
的发展史,什么是Namesrv
、什么是Broker
,这些基础知识大家可以去阅读RocketMQ
官网文档或者其他博客可以了解到,所以这里就没有过多介绍。接下来,欢迎大家订阅我的RocketMQ源码之路
系列文章,让我们一起去遨游RocketMQ
源码世界吧!
- 详解自动识别验证码,LSTM大显身手
- 智能算法——PageRank
- 【Go 语言社区】Golang 可变参数的使用
- 【Go 语言社区】Golang源码解读之map
- 一则报警信息所折射出来的诸多问题(r9笔记第14天)
- Java面试系列17-编程题-读取服务器字符、实现序列化、计数器、1000阶乘、n出列问题等
- tensorflow(一)windows 10 64位安装tensorflow1.4与基本概念解读tf.global_variables_initializer
- 容灾切换中的数据库宕机问题简单分析(一) (r9笔记第12天)
- Java面试系列14
- linux下搭建django记录笔记,未完稿,节后继续
- Java案例-打印图形与π
- 关于两个简单问题的分析(r9笔记第10天)
- 初步解读Golang中的接口相关编写方法
- Go语言获取Windows下文件是否隐藏
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 线程间通信wait---notify
- Ubuntu安装Oracle Java8
- CentOS7安装Git
- RocketMQ-环境搭建(单master模式-ubuntu版)
- 使用Web.xml配置SpringMvc(同时使用xml配置文件)
- 第七节:Activiti6.0——Task的变量使用
- 第八节:Activiti6.0——启动流程相关
- 第九节:Activiti6.0——ReceiveTask接收信号、中间信号捕获事件和中间消息捕获事件的流程推进
- SpringBoot——全局异常捕获和自定义异常
- RTSP协议视频平台EasyNVR接入到EasyNVS管理平台后无法显示RTMP及RTSP视频流地址问题
- SpringBoot——配置logback日志
- Istio 运维实战系列(2):让人头大的『无头服务』-上
- 第十节:Activiti6.0——四种Job工作的产生与管理
- 使用vue3.0,不需要build也可以
- 听说vue项目不用build也能用?