521、Java Spring Cloud Alibaba -【Spring Cloud Alibaba RocketMQ 】 2021.12.27

本文详细介绍了如何使用Docker在Linux服务器上快速搭建RocketMQ4.4,包括创建配置文件、启动容器、配置防火墙端口,并展示了RocketMQ控制台的使用。同时,文章还展示了在Spring项目中集成RocketMQ客户端的步骤,包括添加依赖、配置、创建生产者和消费者。最后,通过发送消息验证了RocketMQ的正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、RocketMQ 简介

RocketMQ
是阿里巴巴开源的分布式消息中间件。支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。它里面有几个区别于标准消息中件间的概念,如Group、Topic、Queue等。系统组成则由Producer、Consumer、Broker、NameServer等。

RocketMQ 特点

  • 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型;
  • 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递,RocketMQ 可以保证严格的消息顺序,而ActiveMQ 无法保证;
  • 支持拉(Pull)和推(Push)两种消息模式;Push 好理解,比如在消费者端设置 Listener 回调;而 Pull,控制权在于应用,即应用需要主动的调用拉消息方法从 Broker 获取消息,这里面存在一个消费位置记录的问题(如果不记录,会导致消息重复消费);
  • 单一队列百万消息的堆积能力;RocketMQ 提供亿级消息的堆积能力,这不是重点,重点是堆积了亿级的消息后,依然保持写入低延迟;
    支持多种消息协议,如 JMS、MQTT 等;
  • 分布式高可用的部署架构,满足至少一次消息传递语义;RocketMQ 原生就是支持分布式的,而ActiveMQ 原生存在单点性;
  • 提供 docker 镜像用于隔离测试和云集群部署;
  • 提供配置、指标和监控等功能丰富的 Dashboard。

Broker

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

Broker Server 是 RocketMQ 真正的业务核心,包含了多个重要的子模块:

  • 路由模块:整个 Broker 的实体,负责处理来自 clients 端的请求。
  • 客户端管理:负责管理客户端(Producer/Consumer)和维护 Consumer 的 Topic 订阅信息
  • 存储服务:提供方便简单的 API 接口处理消息存储到物理硬盘和查询功能。
  • 高可用服务:高可用服务,提供 Master Broker 和 Slave Broker 之间的数据同步功能。
  • 消息索引服务:根据特定的 Message key 对投递到 Broker 的消息进行索引服务,以提供消息的快速查询。

NameServer

NameServer 是一个非常简单的 Topic 路由注册中心,其角色类似 Dubbo 中的 zookeeper,支持 Broker
的动态注册与发现。

主要包括两个功能:

  • Broker 管理:NameServer 接受 Broker 集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查 Broker 是否还存活;
  • 路由信息管理:给 Producer 和 Consumer 提供服务获取 Broker 列表。每个 NameServer 将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。然后 Producer 和 Conumser 通过 NameServer 就可以知道整个 Broker 集群的路由信息,从而进行消息的投递和消费。

2、使用 Docker 快速搭建 RocketMQ 4.4

rocketmq 需要部署 broker 与 nameserver ,考虑到分开部署比较麻烦,这里将会使用 docker-compose。另外,还需要搭建一个 web 可视化控制台,可以监控 mq 服务状态,以及消息消费情况,这里使用 rocketmq-console,同样该程序也将使用 docker 安装。

2.1 在 linux 服务器上选择并建立目录;

mkdir rocketmq-docker

2.2 进入 rocketmq-docker 目录,建立一个名为 broker.conf 的配置文件,内容如下:

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
# broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
# 0表示Master,大于0表示不同的slave
brokerId = 0
# 表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
# 在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
# 有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
# 刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址
# brokerIP1 = 192.168.138.131

注意:这里的 brokerIP1 请务必设置,否则默认会成为 docker 容器内部IP导致外网链接不上。

2.3 还是在 rocketmq-docker 目录,建立一个名为 rocketmq.yaml 的脚本文件;

在这里插入图片描述
rocketmq.yaml 内容如下:

version: '2'
services:
  namesrv:
    image: rocketmqinc/rocketmq
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - /docker/rocketmq/data/namesrv/logs:/home/rocketmq/logs
      - /docker/rocketmq/data/namesrv/store:/home/rocketmq/store
    command: sh mqnamesrv
  broker:
    image: rocketmqinc/rocketmq
    container_name: rmqbroker
    ports:
      - 10909:10909
      - 10911:10911
      - 10912:10912
    volumes:
      - /docker/rocketmq/data/broker/logs:/home/rocketmq/logs
      - /docker/rocketmq/data/broker/store:/home/rocketmq/store
      - /docker/rocketmq/conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
    command: sh mqbroker -n namesrv:9876 -c /opt/rocketmq-4.4.0/conf/broker.conf
    depends_on:
      - namesrv
    environment:
      - JAVA_HOME=/usr/lib/jvm/jre
  console:
    image: styletang/rocketmq-console-ng
    container_name: rocketmq-console-ng
    ports:
      - 8087:8080
    depends_on:
      - namesrv
    environment:
      - JAVA_OPTS= -Dlogging.level.root=info   -Drocketmq.namesrv.addr=rmqnamesrv:9876 
      - Dcom.rocketmq.sendMessageWithVIPChannel=false

2.4 开启 broker 用到的防火墙端口,方便后续使用:

firewall-cmd --zone=public --add-port=10909-10912/tcp --permanent

2.5 执行 sentinel-dashboard.yaml 脚本启动容器:

docker-compose -f rocketmq.yaml up

2.6 进入 rocketmq 控制台,我们会发现类似的图表(当然开始肯定是空的):

http://(安装RocketMQ机器的IP):8087

在这里插入图片描述

2.7 我们选择 “集群” 这一栏,进入就能看见我们设置的 broker 的外网IP了;

到这里我们理论上已经完成 RocketMQ 服务端的部署,现在就可以去 Spring 项目中使用客户端了。

3. 在 Spring 项目中引入 RocketMQ 客户端

3.1 添加 pom 文件依赖:

        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-spring-boot-starter</artifactId>
        <version>2.0.4</version>
    </dependency>

3.2 在 application.yml 添加配置:

server:
  port: 10801
  
spring:
  application:
    name: (项目名称)-service
    
rocketmq:
  name-server: (安装RocketMQ机器的IP):9876
  producer:
    group: (项目名称)-group

3.3 新建一个消息发送类 MessageProducer 作为消息的 生产者:

@Service
public class MessageProducer implements CommandLineRunner {

    @Resource
    private RocketMQTemplate rocketMQTemplate;

    @Override
    public void run(String... args) throws Exception {
        rocketMQTemplate.send("test-topic-1", MessageBuilder.withPayload("Hello, World! I'm from spring message").build());
    }

}

3.4 新建一个消息接收类 MessageListener 作为消息的 消费者:

@Slf4j
@Service
@RocketMQMessageListener(topic = "test-topic-1", consumerGroup = "my-consumer_test-topic-1")
public class MessageListener implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        log.info("received message: {}", message);
    }

}

3.5 新建一个 MessageProducer 的调用控制器类:

@RestController
@RequestMapping
public class HelloController {

    @Resource
    private MessageProducer messageProducer;

    @RequestMapping("/message")
    public void message() throws Exception {
        messageProducer.run("");
    }

3.6 启动 Spring 项目,我们来测试一下最简单的消息发送:

GET http://localhost:10801/message
Accept: */*
Cache-Control: no-cache

在这里插入图片描述

我们也能在 RocketMQ 的管理控制台,大致看到消息的消费情况:
在这里插入图片描述

实战到了这里并没有解释一些概念,可能大家会有点犯迷糊。

Topic(主题)相当于一种类型的消息,比如可以设置 Topic1 专门是分销的业务, Topic2 专门是优惠券的业务;而
Group(分组)相当于对生产者和消费者的分组,那我们的微服务既能做生产者也能做消费者,比如可以设置 Group1
是商品的微服务,Group2 是订单的微服务,当然还要区分下是生产者分组还是消费者分组。

  • Group:分为ProducerGroup 和 ConsumerGroup, 代表某一类的生产者和消费者,一般来说同一个服务可以作为 Group,同一个 Group 一般来说发送和消费的消息都是一样的。
  • Topic:消息主题,一级消息类型,生产者向其发送消息,消费者读取其消息。
  • Queue: 分为读和写两种队列,一般来说读写队列数量一致,如果不一致就会出现很多问题。

Topic 中有分为了多个 Queue,这其实是我们发送/读取消息通道的最小单位。我们发送消息都需要指定某个写入某个 Queue,拉取消息的时候也需要指定拉取某个 Queue,所以我们的顺序消息可以基于我们的 Queue 维度保持队列有序,如果想做到全局有序那么需要将 Queue 大小设置为1,这样所有的数据都会在 Queue 中有序。

4、参考链接

[01] Spring Cloud Alibaba RocketMQ

一、物联网的概览1.1物联网的起源1.2物联网的概念1.3物联网的应用1.4物联网技术要素1.5物联网与云计算的关系1.6物联网与大数据的关系二、软件架构演进史2.1单体架构2.2分布式应用2.3微服务架构2.4Serverless架构三、物联网云平台开发环境搭建3.1开发需要的软件与技术环境概览3.2Java环境-JDK安装3.3数据库-MySQL安装3.4高速缓存技术-redis安装3.5时序数据库-influxdb安装3.6IDE开发工具-idea 安装3.7原型图设计工具-axure安装3.8前端开发工具-vscode安装3.9容器部署-docker安装3.10消息队列-kafka安装3.11mqtt broker安装四、可视化管理工具的安装4.1navicat安装与使用4.2redis 可视化工具安装与使用4.3mqtt可视化工具安装与使用4.4kafka可视化工具安装与使用4.5代码管理工具安装git与使用五、后台开发基础知识介绍5.1数据库使用5.2Redis连接5.3Mqtt接入5.4Influxdb接入5.5Kafka接入5.6负载均衡nginx搭建5.7租户概念5.8Iass,pass,sass之间的联系六、微服务架构介绍6.1微服务核心组件介绍6.2微服务网关gateway6.3注册中心6.4配置中心6.5负载均衡6.6服务调用6.7熔断机制七、物联网平台需求分析7.1物联网云平台的背景7.2物联网云平台脑图设计7.3物联网云平台需求分析7.4物联网云平台开发计划设计八、物联网平台架构设计8.1平台服务拆分8.2物联网平台架构图设计8.3平台技术栈的选择8.4设备认证的设计8.5服务网关的设计8.6后台服务的设计 九、物联网云平台原型设计9.1登录注册页面设计9.2首页设计9.3产品页面设计9.4设备页面设计9.5数据中心页面设计十、数据库设计10.1关系数据库表设计10.1.1用户表10.1.2角色表10.1.3权限表10.1.4用户角色表10.1.5角色权限表10.1.6产品表10.1.7设备表10.1.8操作记录表10.2时序数据库表设计十一、物联网云平台接口文档设计11.1物联网云平台通信方式介绍11.2HTTP接口设计11.2.1.登录接口设计11.2.2注册接口设计11.2.3产品列表设计11.2.4产品添加设计11.2.5产品编辑接口11.2.6产品删除设计11.2.7添加设备接口11.2.8编辑设备接口11.2.9删除设备接口11.2.10添加租户接口11.2.11删除租户接口11.2.12编辑租户接口11.3mqtt主题十二、物联网云平台后台代码开发12.1.认证服务代码开发12.2产品管理代码开发12.3设备管理代码开发12.4数据分析代码开发12.5首页代码开发十三、物联网平台接口测试13.1什么是接口13.2接口测试流程13.3常见后台测试用例13.4使用postman测试接口 十四、物联网云平台前端设计14.1物联网云平台前端技术栈14.2vue环境搭建14.3element基础组件学习14.4vue admin element框架13.5vue与后台接口对接与联调 十五、物联网设备客户端开发15.1flutter介绍15.2flutter环境搭建15.3利用flutter编写第一个Android程序15.4flutter写一个程序接入物联网云平台  十六、部署与实施16.1使用idea发布docker环境16.2微服务程序部署方式介绍16.2.1使用jar包部署微服务程序16.2.2docker 部署微服务程序16.3dockerfile编写16.5负载均衡Nginx搭建与配置微服务程序 十七、物联网实例-设计一款远程电子锁17.1材料准备17.2技术原理17.3产品测试
C:\Users\33512\.jdks\corretto-17.0.12\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\lib\idea_rt.jar=56111:C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\bin" -Dfile.encoding=UTF-8 -classpath D:\idea\FileManageSystem\file-system\target\classes;D:\MAVEN\repo\com\alibaba\cloud\spring-cloud-starter-alibaba-seata\2.2.8.RELEASE\spring-cloud-starter-alibaba-seata-2.2.8.RELEASE.jar;D:\MAVEN\repo\org\springframework\boot\spring-boot-starter-aop\2.3.12.RELEASE\spring-boot-starter-aop-2.3.12.RELEASE.jar;D:\MAVEN\repo\org\springframework\spring-aop\5.2.15.RELEASE\spring-aop-5.2.15.RELEASE.jar;D:\MAVEN\repo\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar;D:\MAVEN\repo\io\seata\seata-spring-boot-starter\1.5.1\seata-spring-boot-starter-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-spring-autoconfigure-client\1.5.1\seata-spring-autoconfigure-client-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-spring-autoconfigure-core\1.5.1\seata-spring-autoconfigure-core-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-all\1.5.1\seata-all-1.5.1.jar;D:\MAVEN\repo\io\netty\netty-all\4.1.65.Final\netty-all-4.1.65.Final.jar;D:\MAVEN\repo\org\antlr\antlr4\4.8\antlr4-4.8.jar;D:\MAVEN\repo\org\antlr\antlr4-runtime\4.8\antlr4-runtime-4.8.jar;D:\MAVEN\repo\org\antlr\antlr-runtime\3.5.2\antlr-runtime-3.5.2.jar;D:\MAVEN\repo\org\antlr\ST4\4.3\ST4-4.3.jar;D:\MAVEN\repo\org\abego\treelayout\org.abego.treelayout.core\1.0.3\org.abego.treelayout.core-1.0.3.jar;D:\MAVEN\repo\org\glassfish\javax.json\1.0.4\javax.json-1.0.4.jar;D:\MAVEN\repo\com\ibm\icu\icu4j\61.1\icu4j-61.1.jar;D:\MAVEN\repo\com\alibaba\druid\1.2.6\druid-1.2.6.jar;D:\MAVEN\repo\com\typesafe\config\1.2.1\config-1.2.1.jar;D:\MAVEN\repo\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\MAVEN\rep
最新发布
03-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值