前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RocketMQ源码之路(一)搭建RocketMQ源码环境

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

作者头像
itlemon
发布2020-09-27 15:07:30
9730
发布2020-09-27 15:07:30
举报
提到消息队列(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代码结构
图1-1 RocketMQ代码结构

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

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

3.1 启动Namesrv

进入到namesrv源代码的org.apache.rocketmq.namesrv包中,找到启动类NamesrvStartup,然后拷贝它的全路径,进入到启动窗口进行配置(建议先启动一下启动类,然后该窗口的部分参数都会自动填好),如下3-1所示:

图3-1 Namesrv启动参数配置面板
图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 = 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所示:

图3-2 Broker启动参数配置面板
图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源码世界吧!

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、RocketMQ源码结构
  • 二、RocketMQ源码编译
  • 三、启动Namesrv和Broker
    • 3.1 启动Namesrv
      • 3.2 启动Broker
      • 四、测试消息生产者和消费者
      • 五、总结
      相关产品与服务
      文件存储
      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档