# RocketMQ源码环境搭建
1、fork源码到本地仓库
github.com/apache/rock… 首先我们进入到 rocketMQ官网,我们先 fork源码到自己的 github仓库中。再将仓库中fork的源码 clone下来,这样的好处就是可以把自己写的源码注释上传到 github上了。
具体步骤如下:
随后会出现确认弹窗:
第一个就是存储在你github下的仓库地址,第二个如果选中那么就仅会fork master分支下的内容,点击右下角的按钮,稍等片刻后就会在自己账号下克隆一个一模一样的项目,其中包括文件、提交历史、issues等等。
然后就可以在自己的仓库下克隆项目了,并且可以提交相关代码:
如果发现了开源项目中有什么问题,或者可以优化的点,愿意为开源项目做贡献的话,也可以提出 pull request:
在选好相应的分支后,会自动对比代码显示提交记录,填入相应的原因解释等就可以提交。
需要注意的是你的提交需要遵循项目本身的 pr规范,视具体的项目不同,在具体项目中查看具体的规范细则。
2、拉取RocketMQ项目并启动
按照上面的步骤拉取项目到本地,使用idea打开源码,这里以 release-4.9.4版本为准。
整体项目结构:
- ACL: 用户权限、安全、验证等相关模块。
- Broker: Broker组件相关代码。
- Client: Producer、Consumer这些客户端的代码
- common: 公共模块。
- **distribution:**用来部署MQ。
- **logging:**MQ的日志模块
- example: MQ的用例,以及相关demo。
- filter: MQ的过滤器。
- NameSvr:
NameServer的实现代码,实现注册中心是需要看的重点。 - **openmessageing:**开发消息标准模块
- remoting: MQ的远程网络通信模块,基于
netty实现。 - **srvutil:**模块的相关工具类。
- store: Broker的消息存储模块,重点。
- style: 代码检查相关
- test: 测试相关模块
- tools: 命令行监控相关工具类
首先我们进入 namesrv模块找到 NameStartup,尝试直接启动 main()方法。
可以看到提醒我们需要设置ROCKETMQ_HOME,查找打印的位置我们可以发现它是NameConfig里的一个属性。需要从系统里面获取。
我们可以在源码中编写代码设置它,也可以将其设置成系统变量,或者在启动的时候增加命令行参数。
这里我们将其设置为系统变量:
继续启动:
会发现并没有找到这个需要的配置文件,是因为我们虽然指定了环境变量但是我们并没有把相关的配置文件放进来。
我们在项目主目录下新建一个 config目录,和上边设置的的ROCKETMQ_HOME目录地址保持一致,然后创建conf、logs、store三个目录。config用来存储配置文件,logs存放日志,store则用于消息存储。
在 distribution#conf目录下存放着很多配置文件模版,这里我们把需要的三个配置文件复制到我们所创建的conf目录下。
修改broker.conf文件增加配置:
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# brokerClusterName = DefaultCluster
# brokerName = broker-a
# brokerId = 0
# deleteWhen = 04
# fileReservedTime = 48
# brokerRole = ASYNC_MASTER
# flushDiskType = ASYNC_FLUSH
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
#删除文件的时间点,一天的固定时间执行一次删除过期文件操作,默认为凌晨4点。
deleteWhen = 04
#文件保留时间,也就是从最后一次更新时间到现在,如果超过了该时间,则认为是过期文件,可以被删除,单位小时
fileReservedTime = 48
#broker的角色,默认是异步master,即生产者发送的每一条消息只要写入master就返回告诉生产者成功。然后再“异步复制”到slave。
#同步master:Sync Broker:生产者发送的每一条消息都至少同步复制到一个slave后才返回告诉生产者成功,即“同步双写”。
brokerRole = ASYNC_MASTER
#消息刷盘策略,默认是异步刷盘。
#异步刷盘ASYNC_FLUSH:生产者发送的每一条消息并不是立即保存到磁盘,而是暂时缓存起来,然后就返回生产者成功。随后再异步的将缓存数据保存到磁盘,有两种情况:
#1是定期将缓存中更新的数据进行刷盘,2是当缓存中更新的数据条数达到某一设定值后进行自动刷盘。异步刷盘有较低概率导致消息丢失,比如在还未来得及同步到磁盘的时候宕机,但是性能更好。
#同步刷盘SYNC_FLUSH:生产者发送的每一条消息都在保存到磁盘成功后才返回告诉生产者成功。这种方式不会存在消息丢失的问题,但是有很大的磁盘IO开销,性能有一定影响。
flushDiskType = ASYNC_FLUSH
#nameserver的地址,也可以指定真实ip
namesrvAddr=127.0.0.1:9876
#brokerIp,也可以指定真实ip
brokerIP1=127.0.0.1
#消息存储根路径
storePathRootDir=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store
#commitLog文件的存储路径
storePathCommitLog=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store/commitlog
#consume queue文件的存储路径
storePathConsumeQueue=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store/consumequeue
#消息索引文件的存储路径
storePathIndex=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store/index
#checkpoint文件的存储路径
storeCheckpoint=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store/checkpoint
#abort文件的存储路径
abortFile=/Users/gaosheng/IdeaProjects/rocketmq_self/config/store/abort
注意根据具体路径的不同做具体修改。
然后我们来修改日志文件中的配置:
我们需要将两个logback日志文件中的${user.home}修改为我们ROCKETMQ_HOME配置的路径,将${brokerLogDir}修改为broker。方便我们后边查看相关日志。
再次启动我们可以看到 nameserver已经成功启动。
我们再来启动broker,broker通过BrokerStartup类启动,同理我们也需要配置相关变量:
我们可以看到除了配置一样的环境变量外,还需要配置一个启动参数来指定conf配置文件的地址。
broker已经成功启动。
我们也可以在logs下查看相关启动日志。
3.拉取管理后台项目并启动
MQ还有一个管理后台项目,我们也按照上面的流程拉取到本地。
我们修改yml文件中namesrvAddrs地址,修改为本机地址。
通过访问默认8080端口,就可以看到管理后台界面。
4.快速启动
在example模块中有很多快速启动的例子。
我们可以找到这个包下面有两个简单的测试类。
我们打开Producer类,可以看到是一个循环发送1000条消息的代码。
我们添加一行代码来指定namesrv的地址。
同理在Consumer类中也添加一行代码:
consumer.setNamesrvAddr("127.0.0.1:9876");
依次启动生产者和消费者,我们可以看到控制台有相应的数据及日志。
我们也可以在管理后台中自行查看相应的统计信息。
参考文章:
希望这篇文章对大家有所帮助,您的赞和收藏是对我最大的支持和认可!