-
. 简介:RocketMQ4.x本地快速部署
- RocketMQ核⼼组件
- Broker:MQ程序,接收⽣产的消息,提供给消费者消费的程序
- Name Server:给⽣产和消费者提供路由信息,提供轻量级的服务发现、路由、元数据信
息,可以多个部署,互相独⽴(⽐zookeeper更轻量)
- RocketMQ核⼼组件
-
. 运行环境 JDK版本:1.8.0_221 rocketmq版本:rocketmq-all-4.4.0
-
. 下载地址:http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmqall 4.4.0binrelease.zip 系统:centos 6.8
-
. 官网上的部署方式我就不想吐槽了,曾经是阿里开发的但是后来给了apache,还作为了顶级孵化项目,文档写的简直不能再烂,按照官方文档的来安装根本行不通。
下面进入正题(我是部署在自己购买的阿里云服务器上,用本地Java代码调试)
- 首先由于rocketmq是Java语音编写所以运行需要安装jdk 和maven环境。
- 下载地址:http://rocketmq.apache.org/dowloading/releases/.
- 解压:unzip rocketmq-all-4.4.0-source-release.zip
- 进入解压后的目录 cd rocketmq-all-4.4.0/
- 安装:mvn -Prelease-all -DskipTests clean install -U
- 之后再进目录:cd distribution/target/
- 为了方便以后的操作 最好把 target内的 apache-rocketmq文件夹移动到usr/local/下面:
mv apache-rocketmq /usr/local/
- 启动前 要将rocketmq 加入环境变量执行
vim /etc/profile
1 #rocketmq目录
2 export ROCKETMQ_HOME=/usr/local/usr/local/apache-rocketmq
3 export PATH=$ROCKETMQ_HOME/bin:$PATH
- 刷新下环境变量
source /etc/profile
- 修改/usr/local/apache-rocketmq/conf/broker.conf 加入下面3行代码(启动时要选择该配置文件)
brokerIP1 = 当前机器的外网IP
namesrvAddr = 当前机器的外网IP:9876
autoCreateTopicEnable = true (此项非常重要允许创建topic)
- 机器内存不够(一般针对虚拟机),修改/usr/local/apache-rocketmq/bin/runserver.sh 与 /usr/local/apache-rocketmq/bin/runbroker.sh中JAVA_OPT关于内存的设置 基本设置成 128m 或者256 m 都可以。
- 规定是首先启动nameServer 虽然先启动谁都一样不会报错 但是我们作为程序员 要有逻辑性 和严谨性
nohup sh bin/mqnamesrv ‐n 机器的外网ip地址:9876 &
- 查看⽇志 tail -f nohup.out (结尾:The Name Server boot success. serializeType=JSON 表示启
动成功)
- 启动broker (-n指定nameserver地址,nameserver服务端⼝为9876, broker默认端⼝ 10911)
nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf autoCreateTopicEnable=true & tail -f nohup.out
- 看到屏幕上输出下面这句话 说明启动成功 否则用代码调用的时候肯定会报错的
The broker[broker-a, 你机器的外网IP地址:10911] boot success. serializeType=JSON and name server is localhost:9876
- 也可以使用jps命令查看进程
- 下面介绍一下关闭服务
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
- 由于本人的服务器是阿里云 所以别忘记把阿里云的安全组端口打开 9876 和10911 另外还有一个端口是rocketmq的VIP端口 10909 在JAVA中的消费者对象或者是生产者对象中关闭VIP通道即可无需开放10909端口。下面我会提到如何关闭VIP端口
-
下面说用Java代码来测试rocketmq
框架是Springboot 配置文件我比较喜欢yml 方式 (萝卜青菜各有所爱)
- 先配置yml文件
rocketmq:
consumer:
# RocketMQ的请求地址
namesrvAddr: 服务器的IP地址:9876
# 发送同一类消息的设置为同一个group,保证唯一,默认不需要设置,rocketmq会使用ip@pid(pid代表jvm名字)作为唯一标示
groupName: test-demo
- 配置个Bean 来读取rocketMQ的配置
package com.she.userapp.config;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RocketMQConfig {
private static final Logger log = LoggerFactory.getLogger(RocketMQConfig.class);
@Value("${rocketmq.consumer.groupName}")
private String groupName;
@Value("${rocketmq.consumer.namesrvAddr}")
private String namesrvAddr;
@Bean
public DefaultMQProducer defaultMQProducer() throws MQClientException {
DefaultMQProducer producer = new DefaultMQProducer(groupName);
producer.setNamesrvAddr(namesrvAddr);
producer.setRetryTimesWhenSendAsyncFailed(10);
producer.start();
log.info("start rocketmq producer success!");
return producer;
}
}
- 下面我们再新建个测试controller
package com.she.userapp.controllor;
import com.alibaba.fastjson.JSON;
import com.she.userapp.config.RedisCacheUtil;
import com.she.userapp.service.CouponService;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class TestControllor {
@RequestMapping("/test2")
public String test2()throws Exception{
Message message = new Message("TopicTest", "Tag1", "12345", "rocketmq测试成功".getBytes());
producer.setVipChannelEnabled(false);
// 这里用到了这个mq的异步处理,类似ajax,可以得到发送到mq的情况,并做相应的处理
//不过要注意的是这个是异步的
producer.send(message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info("传输成功");
log.info(JSON.toJSONString(sendResult));
}
@Override
public void onException(Throwable e) {
log.error("传输失败", e);
}
});
return "aaa";
}
}
4.浏览器访问这个controller 看到idea的console页面出现下文说明成功:
2019-12-26 10:23:02,797 [NettyClientPublicExecutor_1] [INFO TestControllor:55] - 传输成功
2019-12-26 10:23:02,799 [NettyClientPublicExecutor_1] [INFO TestControllor:56] - {"messageQueue":{"brokerName":"broker-a","queueId":3,"topic":"TopicTest"},"msgId":"C0A8E13F2B6C18B4AAC282F9665B0000","offsetMsgId":"2769365900002A9F000000000002C338","queueOffset":250,"regionId":"DefaultRegion","sendStatus":"SEND_OK","traceOn":true}