【RocketMQ】安装与部署(Windows)
准备工作
下载
可以在官网上下载RocketMQ · 官方网站 | RocketMQ (apache.org)或者直接到Apache的文件站点下Index of /dist/rocketmq (apache.org)找到对应版本下载。
这里以编写时的最新版本为例,选择Binary版本下载,该版本为编译后的版本,可以直接使用。
Source下载获取的是源码,需要经过编译后才可以使用,不过比较方便自行扩展,有扩展需求可以使用该版本自行编译。
下载完成后解压出来是如下的文件结构。
以下以windows为环境演示。
RocketMQ依赖的是Java的运行环境,因此系统上应该安装Java并且拥有对应的环境变量JAVA_HOME.
RocketMQ使用的java环境是java8,对于高版本环境可能需要进行一些适配性的改动。
在RocketMQ目录下的bin文件夹中有对应的服务启动脚本,包含Linux可运行的sh文件以及Windows可运行的cmd文件。
环境变量
解压完毕后需要手动添加名为ROCKETMQ_HOME的环境变量,索引到RocketMQ的解压目录即可,设置完毕后需要重启电脑。
NameServer
打开cmd命令行后,通过cd命令进入到解压目录的bin目录下。然后使用
start mqnamesrv.cmd
命令新开一个命令行窗口启动NameServer
或者直接使用
mqnamesrv.cmd
在当前命令行中启动。
其本质是通过此前设置的环境变量找到RocketMQ的bin路径,再通过该路径下的runserver.cmd脚本文件实现运行的,因此启动项配置其实来自runserver.cmd中。
出现The Name Server boot success提示则表示NameServer服务启动成功,启动成功后不要关闭该命令窗口。
可能出现的问题
Please set the ROCKETMQ_HOME variable in your environment!
这个问题提示其实不够准确,并不一定是在我们没有设置环境变量时出现。
因为在运行过程中,脚本文件是通过环境变量来定位到runserver.cmd的位置再通过该脚本来启动应用的,因此在当runserver.cmd文件定位不到时才会出现该问题。
处理方法:可以重新打开一个命令行,然后通过
echo %ROCKETMQ_HOME%
打印一下环境变量出来检查一下环境变量是否有误。同时这种方式也能够让环境变量刷新,如果此前曾经修改过环境变量而没有重启电脑,则这种方式能够让环境变量刷新成修改后的值。
如果仍然没有解决,则可以进入到该对应路径下看看是否缺失了runserver.cmd文件,到这一步也都没有发现问题,那就只能重启一下试试,可能环境变量的更改并没有生效。
Unrecognized VM option
在通过runserver.cmd运行时,如果以高于java8的版本作为环境运行可能会出现如下错误:Unrecognized VM option ‘UseConcMarkSweepGC’
这是因为在运行脚本中,包含了一些对CMSGC的一些调优参数。
据查在java9中使用G1来作为GC的默认实现,从而废弃了CMS相关的一些参数。因此启动时需要进行一些相关参数的改动,或者将java降级,指定特定的jre8来作为虚拟机运行。
在sh版本的runserver脚本中对java的版本进行了专门的适配,可以识别java版本采用特定的指令。如果使用cmd脚本时仍需要在Java高版本环境中运行,也可以参照sh版本脚本修改一下对应的虚拟机参数。
处理方法:这里提供一个根据sh脚本修改过来的适配高版本java的cmd脚本,使用高版本运行时用该脚本替代原本的runserver.cmd即可。
@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements. See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License. You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.if not exist "%JAVA_HOME%\bin\java.exe"echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT/B 1
set"JAVA=%JAVA_HOME%\bin\java.exe"
setlocal
set BASE_DIR=%~dp0
set BASE_DIR=%BASE_DIR:~0,-1%
for%%d in (%BASE_DIR%)doset BASE_DIR=%%~dpd
set CLASSPATH=.;%BASE_DIR%conf;%BASE_DIR%lib\*;%CLASSPATH%
set"JAVA_OPT=%JAVA_OPT% -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"set"JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"set"JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails"set"JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"set"JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages"set"JAVA_OPT=%JAVA_OPT% %JAVA_OPT_EXT% -cp "%CLASSPATH%""echo%*"%JAVA%"%JAVA_OPT% %*
为什么不对cmd脚本进行适配呢?
sh脚本中的java版本适配其本质上,是通过运行
java -version
命令 获取到控制台输出的完整java版本信息。再通过字符串匹配的方式来获取java版本号,再去以8为基准去匹配对应的运行参数。
经过测试,windows平台下的java -version获取到的版本字符串通过命令行是无法捕获到的。
推测也就是这个原因windows导致没有办法单独通过命令行来确定java版本号,也自然就没有办法参照其进行适配了。
找不到或无法加载主类
该问题的主要诱因是环境变量中存在空格。导致解析命令时环境变量被分割成了两个命令。
处理方法:最好的解决办法是变更目录,在RocketMQ的路径中不要存在空格。
还有,其实当命令中存在不需要被分割的空格时,只需要使用 双引号"" 将对应的命令包裹起来即可。
但是此处经过尝试后发现,该处被错误分割的情况消失,但是仍然存在问题,可能在runserver中的BASE_DIR与CLASSPATH等变量也需要加上双引号防止错误分割,解决起来较为麻烦,而且不清楚后续会不会造成其他问题,因此不再对这种情况进行处理。
Broker
启动
在启动前需要先添加一个环境变量NAMESRV_ADDR,用来指向nameServer服务的地址。因为测试部署时服务部署在本机,所以使用localhost地址,加上此前默认的端口9876作为环境变量值。
打开cmd命令行后,通过cd命令进入到RocketMQ解压目录的bin目录下,运行命令
start mqbroker.cmd autoCreateTopicEnable=true
启动服务。
出现The broker[…] boot success提示则表示broker服务启动成功,启动成功后同样不要关闭该命令窗口。
可能出现的问题
因为运行逻辑类似,因此也会出现上述情况类似的问题,此处不过多阐述,对照着修改即可。
关于java版本适配的问题,此处也提供一个高版本可用的运行脚本:
@echo off
rem Licensed to the Apache Software Foundation (ASF) under one or more
rem contributor license agreements. See the NOTICE file distributed with
rem this work for additional information regarding copyright ownership.
rem The ASF licenses this file to You under the Apache License, Version 2.0
rem (the "License"); you may not use this file except in compliance with
rem the License. You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an "AS IS" BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.if not exist "%JAVA_HOME%\bin\java.exe"echo Please set the JAVA_HOME variable in your environment, We need java(x64)! & EXIT/B 1
set"JAVA=%JAVA_HOME%\bin\java.exe"
setlocal
set BASE_DIR=%~dp0
set BASE_DIR=%BASE_DIR:~0,-1%
for%%d in (%BASE_DIR%)doset BASE_DIR=%%~dpd
set CLASSPATH=.;%BASE_DIR%conf;%BASE_DIR%lib\*;%CLASSPATH%
rem ===========================================================================================
rem JVM Configuration
rem ===========================================================================================
set"JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g"set"JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"set"JAVA_OPT=%JAVA_OPT% -verbose:gc -Xlog:gc*:file=%USERPROFILE%/mq_gc.log:time,tags:filecount=5,filesize=30M"set"JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"set"JAVA_OPT=%JAVA_OPT% -XX:+AlwaysPreTouch"set"JAVA_OPT=%JAVA_OPT% -XX:MaxDirectMemorySize=15g"set"JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages -XX:-UseBiasedLocking"set"JAVA_OPT=%JAVA_OPT% -Drocketmq.client.logUseSlf4j=true"set"JAVA_OPT=%JAVA_OPT% %JAVA_OPT_EXT% -cp %CLASSPATH%""%JAVA%"%JAVA_OPT% %*
用其取代runbroker.cmd即可。
导包问题
java.lang.IllegalAccessError:classorg.apache.rocketmq.common.UtilAll(in unnamed module@0x4bde3f8a) cannot access classsun.nio.ch.DirectBuffer(in modulejava.base) because modulejava.base does not export sun.nio.ch tounnamedmodule@0x4bde3f8a
在启动参数中额外添加一句
--add-exports=java.base/sun.nio.ch=ALL-UNNAMED
即可.。
"%JAVA%"%JAVA_OPT% %*
更改为
"%JAVA%"--add-exports=java.base/sun.nio.ch=ALL-UNNAMED %JAVA_OPT% %*
控制台
上述服务搭建成功后服务就已经可用了,但是为了便于管理其中的数据,我们需要搭建一个控制台,用来提供一个前端页面供我们管理数据。
获取源码
在早些时候,控制台项目隶属于GitHub - apache/rocketmq-externals项目下,位于其中的rocketmq-console中,其中还包含一些其他的RocketMQ的拓展项目,可以参考使用。后来控制台项目单独独立了出来,我们可以在GitHub - apache/rocketmq-dashboard仓库中找到。
首先将其源码通过以下git指令克隆到本地。
git clone https://github.com/apache/rocketmq-dashboard.git
安装依赖
克隆完毕后因为还需要处理依赖,有条件的话可以直接使用JAVA编译器打开,使用IDEA导入为maven项目的话会自动加载依赖,其本质上就是java spring 的项目。如果依赖下载较慢可以使用阿里的maven仓库作为中央仓库,因为本来就是阿里的项目,应该不会存在依赖版本等的问题。
<mirrors><mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf></mirror></mirrors>
不借助编译器处理依赖的话可以cd到项目目录下,自行使用mvn的指令去处理依赖。
启动
在依赖安装完成之后,在运行之前先要修改一下配置。其实配置项的功能描述在application.yml中都有,没有的大多是spring的基本配置,查spring对应的配置项即可。此处只包括影响到应用启动的配置。
配置NameServer地址
在application.yml中,需要配置一下此前的NameServer的ip地址,因为源码中的配置文件中 NameServer地址配置多了一个127.0.0.2:9876地址,运行过程中连接不上可能会报错,删掉即可。
此处可以配置一个,也可以配置多个,使用yml的数组写法即可,即在每一项数组元素均使用 “-”开头。
如果在properties文件中数组则是类似于通常数组的写法,只不过每个元素都要单独写一项,比较麻烦。
rocketmq.config.namesrvAddrs[0]=127.0.0.1:9876
rocketmq.config.namesrvAddrs[1]=127.0.0.2:9876
配置启动端口
也可以配置一下当前控制台的启动使用的访问端口,随意一个空闲端口即可。
启动
使用编译器启动,通过
mvn spring-boot:run
启动或者通过maven打包成jar包然后运行jar包均可,运行成功后如下图。
部署
部署时可以参照传统的maven项目进行打包部署,另外官方也提供了docker镜像来便捷部署,根据ReadMe中描述,通过以下docker指令拉取docker镜像。
docker pull apacherocketmq/rocketmq-dashboard:latest
然后通过以下指令修改参数后运行即可
docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876"-p 8080:8080 -t apacherocketmq/rocketmq-dashboard:latest
其中rockermq.namesrv.addr的值为此前部署的NameServer的地址,-p参数冒号前的值为应用在虚拟机中的启动端口,后面的值应该映射到宿主机开放给该服务的端口。
访问
启动后通过部署的ip+port端口的形式访问即可。
需要中文界面的话可以通过ChangeLanguage来切换语言。
多语化文件放置在源码目录下的
src/main/resources/static/src/i18n
文件夹中,可参照前端的i18n标准自行修改翻译或者添加其他语言。
版权归原作者 JJoker0402 所有, 如有侵权,请联系我们删除。