【SpringBoot深入浅出系列】SpringBoot之集成RocketMQ


一、RocketMQ 的前世今生

RocketMQ 是阿里巴巴开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务,是一个统一的消息引擎,轻量级的数据处理平台。起源于阿里巴巴 2001 年的五彩石项目, Notify 在这期间应运而生,用于交易核心消息的流转 。

2010 年, B2B 开始大规模使用 ActiveMQ 作为消息内核。

2011 年,随着阿里业务的快速发展,急需一款支持顺序消息,拥有海量消息堆积能力的消息中间件, MetaQ 1.0 因此诞生。

2012 年, MetaQ已经发展到了3.0版本,RocketMQ 正是基于 MetaQ 3.0 开发的分布式消息传递中间件,专为万亿级的消息处理而设计,具有高吞吐量,低延迟,海量积累和有序消息。它是阿里巴巴和众多大型互联网业务场景的双十一购物狂欢的现成工具。由于这些优点,它吸引了越来越多的应用程序进行访问。同年,阿里巴巴正式开源了 RocketMQ 的第一个版本。

2015 年,RocketMQ 见证了消息传递的多项重量级功能,包括交易消息、SQL过滤器、消息追溯、调度消息、多站点高可用性等,以满足阿里巴巴日益丰富的业务场景。它还取代了阿里巴巴自主研发的另一款 MQ 产品 Notify,成为阿里巴巴首选的消息中间件。

2016 年,RocketMQ 在阿里云上开发了首个全托管服务,帮助大量数字化转型企业构建现代应用,并开始体验大规模的云计算实践。同年,RocketMQ 被捐赠给Apache基金会,并加入孵化器项目,旨在在未来为更多的开发者服务。

2016 年,RocketMQ 荣获中国最受欢迎开源软件奖。

2017 年,从 Apache 基金会毕业后,RocketMQ被指定为顶级项目(TLP)。

2018 年,RocketMQ 荣获中国最受欢迎开源软件奖。

二、RocketMQ 的基本概念

1.消息模型(Message Model)

RocketMQ 主要由 Producer、Broker、Consumer 三部分组成,其中 Producer 负责生产消息,Consumer 负责消费消息,Broker 负责存储消息。Broker 在实际部署过程中对应一台服务器,每个 Broker 可以存储多个 Topic 的消息,每个Topic 的消息也可以分片存储于不同的 Broker。Message Queue 用于存储消息的物理地址,每个 Topic 中的消息地址存储于多个 Message Queue 中。ConsumerGroup 由多个 Consumer 实例构成。

2.消息生产者(Producer)

负责生产消息,一般由业务系统负责生产消息。一个消息生产者会把业务应用系统里产生的消息发送到 broker 服务器。RocketMQ 提供多种发送方式,同步发送、异步发送、顺序发送、单向发送。同步和异步方式均需要 Broker 返回确认信息,单向发送不需要。

3.消息消费者(Consumer)

负责消费消息,一般是后台系统负责异步消费。一个消息消费者会从 Broker 服务器拉取消息、并将其提供给应用程序。从用户应用的角度而言提供了两种消费形式:拉取式消费、推动式消费。

4.主题(Topic)

表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ 进行消息订阅的基本单位。

5.代理服务器(Broker Server)

消息中转角色,负责存储消息、转发消息。代理服务器在 RocketMQ 系统中负责接收从生产者发送来的消息并存储、同时为消费者的拉取请求作准备。代理服务器也存储消息相关的元数据,包括消费者组、消费进度偏移和主题和队列消息等。

6.名字服务(Name Server)

名称服务充当路由消息的提供者。生产者或消费者能够通过名字服务查找各主题相应的Broker IP 列表。多个 Namesrv 实例组成集群,但相互独立,没有信息交换。

三、RocketMQ 安装

CentOS7和8下安装RocketMQ Server

四、创建项目集成 RocketMQ

1.项目说明

新建 Spring Initializr 项目 rocketmq,项目下新建 controller、consumer、producer 类,实现集成 RocketMQ 发送消息。
项目目录结构:
在这里插入图片描述

2.创建 Spring Initializr 项目 rocketmq

在这里插入图片描述

(1).添加依赖

添加 rocketmq-spring-boot-starter 依赖,pom.xml 文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.chaoyue</groupId>
    <artifactId>rocketmq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>rocketmq</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

(2).添加配置

application.yml 文件中添加如下配置:

server:
  port: 8081

rocketmq:
  # NameServer
  name-server: 192.168.1.38:9876
  # 默认的消息组
  producer:
    group: group1

(3).新建生产者类 RocketMQProducer

package com.chaoyue.rocketmq.producer;

import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class RocketMQProducer {
    
    

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    // 发送消息
    public void sendMessage(String topic, String msg) {
    
    
        rocketMQTemplate.convertAndSend(topic, msg);
    }

}

(4).新建消费者类 RocketMQConsumer

package com.chaoyue.rocketmq.consumer;

import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(consumerGroup = "group1", topic = "topic1")
public class RocketMQConsumer implements RocketMQListener {
    
    

    @Override
    public void onMessage(Object message) {
    
    
        System.out.println("Received message : " + message);
    }
}

(5).新建控制类 RocketMQController

package com.chaoyue.rocketmq.controller;

import com.chaoyue.rocketmq.producer.RocketMQProducer;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
@RequestMapping("/RocketMQ")
public class RocketMQController {
    
    

    private final String topic = "topic1";

    @Resource
    private RocketMQProducer producer;

    @RequestMapping("/sendMessage")
    public String sendMessage(String message) {
    
    
        producer.sendMessage(topic, message);
        return "消息已发送";
    }

}

3.启动服务并测试

启动服务后,浏览器输入:http://localhost:8081/RocketMQ/sendMessage?message=hi,sendmessage:
在这里插入图片描述

在控制台可以看到如下消息:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u012069313/article/details/122403509#comments_21794705