RocketMQ是阿里开发的消息中间件,吸取了RabbitMQ和Kafka的优点:并发高,功能丰富,适用场景广。双十一里可以承受数亿级的高并发,主要是它的功劳。

一、RocketMQ内部结构模型和概念

rocketmq docker 地址 rocketmq zookeeper_kafka


上图就是rocketMQ的架构图,需要注意的是:每一个组件都是集群形式,因为它被开发创造的时候,就是为了解决大规模数据的生产环境下的消息发送。所以集群形式部署才是它最适合的用法。

RocketMQ由以下这几个组件组成
  • NameServer : 路由消息的提供者,他管理着broker的信息,相当于zookeeper的功能。
  • Broker:实际处理消息存储、转发等服务的核心组件 (实际干活的)。
  • Producer:消息生产者集群。通常是业务系统中的一个功能模块。
  • Consumer:消息消费者集群。通常也是业务系统中的一个功能模块。

以上4个概念,可以理解为是物理上有区别的概念,还有一些逻辑概念:

  • Topic
    表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息
    订阅的基本单位。
  • Group
    Producer Group具有相同角色的生产者组合在一起 或者 Consumer Group具有相同角色的消费者组合在一起。组与组之间可以是不同的业务逻辑,彼此不影响。
  • MessageQueue
    同一个Topic下的数据,会分片保存到不同的Broker上,而每一个分片单位,就叫做MessageQueue。
  • Message
    消息系统所传输信息的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题Topic。每个消息拥有唯一的Message ID,且可以携带具有业务标识的Key。Message上有一个为消息设置的标志,Tag标签。用于同一主题下区分不同类型的消息。

二、RocketMQ安装和配置

因为RocketMQ的源码是Java编写的,所以它是一个Java项目,在启动它之前,我们要求必须有jdk的环境。具体怎么安装jdk我就不在这里讲解了。我这里用的CentOS7的Linux系统:

1.首先确保已经安装了jdk

rocketmq docker 地址 rocketmq zookeeper_spring_02

2. 下载RocketMQ安装包

执行安装命令:

wget https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip

rocketmq docker 地址 rocketmq zookeeper_rabbitmq_03

3.解压安装包

解压命令

unzip rocketmq-all-4.7.1-bin-release.zip

rocketmq docker 地址 rocketmq zookeeper_rocketmq docker 地址_04

4.配置环境变量

cd到解压的文件后,输入pwd查看文件目录

rocketmq docker 地址 rocketmq zookeeper_rabbitmq_05


然后把目录配置到环境变量中:

# 编辑环境变量文件 
vi ~/.bash_profile

rocketmq docker 地址 rocketmq zookeeper_kafka_06


修改完环境变量文件后,执行刷新命令,让环境变量生效。

source ~/.bash_profile
5.启动NameServer

用静默启动的方式启动NameServer服务

nohup bin/mqnamesrv &

启动成功后,用jps命令,查看是否有 NameservStartup程序,表示启动成功。

rocketmq docker 地址 rocketmq zookeeper_kafka_07

6.启动Broker

也以静默启动的方式启动runbroker.sh

nohup ./mqbroker &

启动后,jps指令可以看到一个BrokerStartup进程。

至此,我们启动RocketMQ就完成了,其实就是启动了两个项目,对应我们上面将的组件:一个是NameServer 和 Broker

三、springBoot入门实战

创建一个空的springBoot项目。

1.在pom文件中导入依赖包
<dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.1.1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-core</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-webmvc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.1.6.RELEASE</version>
        </dependency>
2.在配置文件中配置地址信息

在这个配置文件:application.properties 配置RocketMQ的ID地址和端口 以及 分组名称

rocketmq.name-server=192.168.69.128:9876
	rocketmq.producer.group=springBootGroup
3. 创建生产者Producer

创建MQTestController文件,用户对外提供的接口,可以调取发送消息。

@RestController
@RequestMapping("/MQTest")
public class MQTestController {

    private final String topic = "TestTopic";
    @Resource
    private SpringProducer producer;
    @RequestMapping("/sendMessage")
    public String sendMessage(String message){
        producer.sendMessage(topic,message);
        return "消息发送完成";
    }
}

创建 生产者类 SpringProducer

import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Component
public class SpringProducer {

    @Resource
    private RocketMQTemplate rocketMQTemplate;

    public void sendMessage(String topic,String msg){
        this.rocketMQTemplate.convertAndSend(topic,msg);
    }
}
4. 创建消费者Consumer

创建消费者类SpringConsumer,去监听消息。

@Component
@RocketMQMessageListener(consumerGroup = "MyConsumerGroup", topic = "TestTopic",consumeMode= ConsumeMode.CONCURRENTLY)
public class SpringConsumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("===我是消费者===收到了消息 : "+ message);
    }
}
启动springboot项目的入口类

启动main方法,我们的生产者类和消费者类都会加载到spring容器里,并启动。

@SpringBootApplication
public class RocketMQSBApplication {

    public static void main(String[] args) {
        SpringApplication.run(RocketMQSBApplication.class,args);
    }
}
调用api接口,去发送消息,看效果

启动项目后,默认是8080端口。我们调用Controller里配好的接口地址,并加上message消息。

rocketmq docker 地址 rocketmq zookeeper_rocketmq docker 地址_08


可以看到控制台里,消费者已经把这条消息消费并打印出来了:

rocketmq docker 地址 rocketmq zookeeper_java_09


这就是非常简单的一次Java通过springBoot使用RocketMQ的实战操作。