文章目录
简介
简单来说,消息队列就是基础数据结构课程里“先进先出”的一种数据结构,但是如果要消除单点故障,保证消息传输的可靠性,并且还能应对大流量的冲击,对消息队列的要求就很高了。现在互联网“微架构”模式兴起,原有大型集中分布式的IT服务因为各种弊端,通常被分拆成细粒度的多个“微服务”,这些微服务可以在一个局域网内,也可能跨机房部署。一方面对服务之间 松耦合的要求越来越高。分布式消息队列可以提供应用解耦、流量削峰、消息发布等功能,已经成为大型互联网服务架构里标配的中间件。
前言
RocketMQ是java语言开发的,所以运行需要jdk环境
RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:
1.能够保证严格的消息顺序
2.提供丰富的消息拉取模式
3.高效的订阅者水平扩展能力
4.实时的消息订阅机制
5.亿级消息堆积能力
一、Linux安装JDK
1.下载连接
官网传送门:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
鉴于官网下载比较麻烦,本人也提供了百度云网盘下载地址:
链接:https://pan.baidu.com/s/1b5QcHxYJAJ9BV0jdencWHA
提取码:5200
2.配置jdk环境
将下载好的jdk文件拖到linux服务器上,我这里是放在了/usr/local/soft目录下,soft目录不存在可以新建 ,这里linux可视化工具恩多,我自己用的Mobaxterm,也有一些winscp等等,大家自己选择
解压jdk文件
先进入当前目录:cd usr/local/soft
解压指令:tar -zxvf 你的jdk压缩包文件名
我这里是jdk-8u281-linux-x64.tar.gz
所以我是tar -zxvf jdk-8u281-linux-x64.tar.gz
解压完可以用命令查看一下当前文件: ls
配置jdk环境变量
修改etc下的配置文件
命令:vim /etc/profile
调转出这个页面之后,输入i可以进行修改,在第一行或者尾部插入数据就ok!
需要配置三个标签JAVA_HOME,CLASSPATH,PATH
JAVA_HOME:对应你jdk的目录
PATH:jdk的bin目录
CLASSPATH:如上图
修改完按一下esc,然后输入:wq进行保存。
刷新一下/etc/profile 使修改生效
命令:source /etc/profile
测试jdk环境是否生效
输入指令:java -version
查看当前jdk版本
二、安装RocketMQ
1.下载rocketmq安装包
官网传送门:
http://rocketmq.apache.org/dowloading/releases/
百度云网盘地址:
链接: https://pan.baidu.com/s/1d1UjcgABmdYhVp4OwHlI3w
提取码:5200
2.配置rocketmq
文件拖拽到linux目录下
目录: /usr/local/soft (soft如果不存在自己创建)
解压rocketmq压缩包
进入安装包文件目录
执行解压命令: unzip rocketmq-all-4.8.0-bin-release.zip -d ./rocketmq-all-4.2.0-binls
配置rocketmq环境变量
执行命令打开配置文件profile
vim /etc/profile
这里需要配置两个标签rocket和path
export rocketmq=/usr/local/soft/rocketmq-all-4.8.0-bin/rocketmq-all-4.8.0-bin-release/
export PATH=$PATH:$rocketmq/bin
rocket:对应的是你rocket的目录,有些人这里会不太理解,什么是rocket的目录,说白了就是rocket数据包的根目录可以这么理解吧,通俗的讲就是当前目录下一层就是你目录下的所有文件了,拷贝那一层就行了,这里怕很多人rocketmq解压的时候有很多级目录,注意一下!!!
path:不多说,rocketmq么问题的话,直接写就可以
环境到这里就差不多结束了!!!
3.启动RocketMQ
修改启动内存大小
接下来我们启动一下刚才编译的RocketMQ.在启动之前我们需要修改一下RocketMQ启动的内存大小(如果你的系统内存比较大的话,请忽略)。我们进入rocketmq解压包的bin目录下,在终端中输入以下命令修改mqnamesrv的内存大小:vi runserver.sh.修改为如图的内容:
接下来修改broker的内存大小:命令为 vi runbroker.sh
启动mqnameserver
进入rocket的bin目录执行命令
命令:nohup sh mqnamesrv &
&表示后台启动,不能少
可以通过jps命令查看namesrv是否启动
我这里显示已经启动了,也可通过查看日志的方式查看
命令:tail -f /root/logs/rocketmqlogs/namesrv.log
如果显示上述标红的说明已经启动成功!
启动broker
进入rocket的bin目录执行命令
命令:nohup sh mqbroker -n localhost:9876 &
&表示后台启动,不能少
可以通过jps命令查看broker是否启动
4.命令行发送和接收消息
进入到rocketmq目录:
发送消息
export NAMESRV_ADDR=localhost:9876
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
接收消息
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
5.IDEA发送和接收消息
SyncProducer 消息生产者
import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
/**
* @author jinhu
* @create 2021-04-15
* @since 1.0.0
*/
public class SyncProducer {
public static void main(String[] args) throws MQClientException, RemotingException, InterruptedException, MQBrokerException {
DefaultMQProducer producer = new DefaultMQProducer("rocketmq_name1");
producer.setNamesrvAddr("192.168.64.3:9876");
producer.start();
for (int i=0;i<100;i++){
Message message = new Message("TopciTest", "Hello RocketMQ ".getBytes());
SendResult send = producer.send(message);
System.out.printf("%s%n",send);
}
producer.shutdown();
}
}
SyncConsumer 消息消费者
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.message.MessageExt;
import java.util.List;
/**
* @author jinhu
* @create 2021-04-15
* @since 1.0.0
*/
public class SyncConsumer {
public static void main(String[] args) throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("rocketmq_consumer_v1");
consumer.setNamesrvAddr("192.168.64.3:9876");
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
consumer.subscribe("TopicTest", "*");
consumer.registerMessageListener(new MessageListenerConcurrently(){
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
System.out.printf(Thread.currentThread().getName() + "Receive New Message : " + msgs + "%n");
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();
}
}
运行测试
运行生产者
运行消费者
关闭rocketmq命令
第一次直接粗暴的方式
小伙伴们应该都是会的,直接执行命令:
ps -ef | grep java 找到rocket相关进程的端口号,然后进行kill
命令: kill -9 端口号
rocket本身关闭命令
进入到rocketmq的bin目录
关闭namesrv
执行命令:sh mqshutdown namesrv
关闭broker
执行命令:sh mqshutdown broker
最后在执行jps查看当前java进程类
成功!!!
到此处,rocketmq安装的就差不多了,发送接收消息也没有问题!!!
后续会接着出一些rocketmq的使用方式!!!