消息驱动 微服务器,消息驱动的微服务 - Spring Cloud Alibaba RocketMQ

2023-11-08

引入MQ后的架构演进

20190803232033122669.png

MQ的选择

消息队列对比参照表:

20190803232033662728.png

RocketMQ vs. ActiveMQ vs. Kafka:

20190803232034928402.png

参考至:

CentOS7上搭建RocketMQ

环境要求:

CentOS 7.2

64位JDK1.8+

4G+的可用磁盘空间

1、下载RocketMQ的二进制包,我这里使用的是4.5.1版本,下载地址如下:

使用wget命令下载:

[[email protected] ~]# cd /usr/local/src

[[email protected] /usr/local/src]# wget http://mirror.bit.edu.cn/apache/rocketmq/4.5.1/rocketmq-all-4.5.1-bin-release.zip

2、解压下载好的压缩包,并移动到合适的目录下:

[[email protected] /usr/local/src]# unzip rocketmq-all-4.5.1-bin-release.zip

[[email protected] /usr/local/src]# mv rocketmq-all-4.5.1-bin-release /usr/local/rocketmq-4.5.1

注:若没有安装unzip命令则使用如下命令安装:

yum install -y unzip

3、进入rocketmq的根目录并查看是否包含如下目录及文件:

[[email protected] /usr/local/src]# cd /usr/local/rocketmq-4.5.1

[[email protected] /usr/local/rocketmq-4.5.1]# ls

benchmark bin conf lib LICENSE NOTICE README.md

4、没问题后,使用如下命令启动Name Server:

[[email protected] /usr/local/rocketmq-4.5.1]# nohup sh bin/mqnamesrv &

[1] 2448

[[email protected] /usr/local/rocketmq-4.5.1]#

5、查看默认的9876端口是否被监听,以验证Name Server是否启动成功:

[[email protected] /usr/local/rocketmq-4.5.1]# netstat -lntp |grep java

tcp6 0 0 :::9876 :::* LISTEN 2454/java

[[email protected] /usr/local/rocketmq-4.5.1]#

6、启动Broker:

[[email protected] /usr/local/rocketmq-4.5.1]# nohup sh bin/mqbroker -n localhost:9876 &

[2] 2485

[[email protected] /usr/local/rocketmq-4.5.1]#

7、验证Broker是否启动成功,如果启动成功,能看到类似如下的日志::

[[email protected] /usr/local/rocketmq-4.5.1]# cat ~/logs/rocketmqlogs/broker.log |grep "boot success"

2019-08-04 01:27:38 INFO main - The broker[study-01, 192.168.190.129:10911] boot success. serializeType=JSON and name server is localhost:9876

[[email protected] /usr/local/rocketmq-4.5.1]#

若想停止Name Server和Broker,则依次执行以下两条命令即可:

[[email protected] /usr/local/rocketmq-4.5.1]# sh bin/mqshutdown broker

The mqbroker(2492) is running...

Send shutdown request to mqbroker(2492) OK # 输出该信息说明停止成功

[[email protected] /usr/local/rocketmq-4.5.1]# sh bin/mqshutdown namesrv

The mqnamesrv(2454) is running...

Send shutdown request to mqnamesrv(2454) OK # 输出该信息说明停止成功

[2]+ 退出 143 nohup sh bin/mqbroker -n localhost:9876

[[email protected] /usr/local/rocketmq-4.5.1]#

验证RocketMQ功能是否正常

1、验证生产消息正常,执行如下命令:

[[email protected] /usr/local/rocketmq-4.5.1]# export NAMESRV_ADDR=localhost:9876

[[email protected] /usr/local/rocketmq-4.5.1]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

正常的情况下,会看到一堆的类似于如下的输出,这是生产消息后成功的result:

SendResult [sendStatus=SEND_OK, msgId=C0A8BE810A690D7163610FCC253B03E7, offsetMsgId=C0A8BE8100002A9F000000000002BDFE, messageQueue=MessageQueue [topic=TopicTest, brokerName=study-01, queueId=3], queueOffset=249]

2、验证消费消息正常,执行如下命令:

[[email protected] /usr/local/rocketmq-4.5.1]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

正常的情况下,会看到一堆的类似于如下的输出,这是消费的消息内容:

ConsumeMessageThread_6 Receive New Messages: [MessageExt [queueId=3, storeSize=180, queueOffset=242, sysFlag=0, bornTimestamp=1564853837073, bornHost=/192.168.190.129:34708, storeTimestamp=1564853837074, storeHost=/192.168.190.129:10911, msgId=C0A8BE8100002A9F000000000002AA4E, commitLogOffset=174670, bodyCRC=911284903, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic=‘TopicTest‘, flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1564854006859, UNIQ_KEY=C0A8BE810A690D7163610FCC251103CB, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 55, 49], transactionId=‘null‘}]]

搭建RocketMQ控制台

RocketMQ官方提供了一个基于Spring Boot开发的可视化控制台,可以方便我们查看RocketMQ的运行情况以及提升运维效率。所以本小节将介绍一下如何搭建搭建RocketMQ的控制台,由于我们使用的RocketMQ版本是4.5.1,所以需要对控制台的源码进行一些改动以适配RocketMQ的4.5.1版本。

1、首先需要下载源码,有两种方式,一是使用git克隆代码仓库,二是直接下载rocketmq-externals的zip包,我这里使用git方式,执行如下命令:

git clone https://github.com/apache/rocketmq-externals.git

2、修改控制台代码,使用IDE打开rocketmq-console项目,如下图所示:

20190803232035379591.png

2.1、修改项目中的application.properties配置文件,我这里主要是修改了监听端口和Name Server的连接地址,至于其他配置项有需要的话可按照说明自行修改:

# console的监听端口,默认是8080

server.port=8011

# Name Server的连接地址;非必须,可以在启动了console后,在控制台导航栏 - 运维 - NameSvrAddrList一栏设置

rocketmq.config.namesrvAddr=192.168.190.129:9876

2.2、修改依赖,由于console项目默认使用的rocketmq版本是4.4.0,与我们这里使用的是4.5.1不完全兼容,所以需要修改一下依赖版本,找到这一行:

4.4.0

修改为:

4.5.1

2.3、修改代码,由于修改了rocketmq的版本,会导致org.apache.rocketmq.console.service.impl.MessageServiceImpl#queryMessageByTopic方法编译报错,所以需要改动一下此处代码 ,将:

@Override

public List queryMessageByTopic(String topic, final long begin, final long end) {

DefaultMQPullConsumer consumer = new DefaultMQPullConsumer(MixAll.TOOLS_CONSUMER_GROUP, null);

...

修改为:

@Override

public List queryMessageByTopic(String topic, final long begin, final long end) {

RPCHook rpcHook = null;

DefaultMQPullConsumer consumer = new DefaultMQPullConsumer(MixAll.TOOLS_CONSUMER_GROUP, rpcHook);

...

3、打包构建并启动,打开idea的terminal,执行如下命令:

# 在rocketmq-console目录下执行

mvn clean package -DskipTests

# 进入jar包存放目录

cd target

# 启动rocketmq console

java -jar rocketmq-console-ng-1.0.1.jar

4、使用浏览器访问控制台,我这里由于修改了端口,所以访问地址是:http://localhost:8011,正常的情况下能看到如下界面:

20190803232035821014.png

不习惯英文的话可以在右上角切换语言:

20190803232036003639.png

由于控制台是可视化界面并且支持中文,这里就不过多介绍了,可以参考官方的控制台使用说明文档:

RocketMQ术语与概念

我这里将基本的术语与概念简单总结成了思维导图:

20190803232036514400.png

官方文档:

Spring消息编程模型 - 编写生产者

在以上小节搭建完RocketMQ之后,我们来使用Spring的消息编程模型,编写一个简单的示例。首先需要在项目中添加相关依赖如下:

org.apache.rocketmq

rocketmq-spring-boot-starter

2.0.3

在配置文件中添加rocketmq相关的配置如下:

rocketmq:

name-server: 192.168.190.129:9876

producer:

# 小坑:必须指定group

group: test-group

编写生产者的代码,这里以Controller做示例,具体代码如下:

package com.zj.node.contentcenter.controller.content;

import lombok.Data;

import lombok.RequiredArgsConstructor;

import org.apache.rocketmq.spring.core.RocketMQTemplate;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**

* 生产者

*

* @author 01

* @date 2019-08-03

**/

@RestController

@RequiredArgsConstructor

public class TestProducerController {

/**

* 用于发送消息到 RocketMQ 的api

*/

private final RocketMQTemplate rocketMQTemplate;

@GetMapping("/test-rocketmq/sendMsg")

public String testSendMsg() {

String topic = "test-topic";

// 发送消息

rocketMQTemplate.convertAndSend(topic, Message.getInstance());

return "send message success";

}

}

@Data

class Message {

private Integer id;

private String name;

private String status;

private Date createTime;

static Message getInstance() {

Message message = new Message();

message.id = 1;

message.name = "×××";

message.status = "default";

message.createTime = new Date();

return message;

}

}

编写完成后,启动项目,访问该接口:

20190803232036850351.png

消息发送成功后,可以到RocketMQ的控制台中进行查看:

20190803232037142354.png

消息体可以在消息详情中查看,如下:

20190803232038366034.png

从生产者的代码来看,可以说是十分的简单了,只需要使用一个RocketMQTemplate就可以实现将对象转换成消息体并发送消息。实际上除了RocketMQ外,其他的MQ也有对应的Template,如下:

RocketMQ:RocketMQTemplate

ActiveMQ/Artemis:JmsTemplate

RabbitMQ:AmqpTemplate

Kafka:KafkaTemplate

Spring消息编程模型 - 编写消费者

在消费者项目中,也需要添加rocketmq的依赖:

org.apache.rocketmq

rocketmq-spring-boot-starter

2.0.3

同样需要配置Name Server的连接地址:

rocketmq:

name-server: 192.168.190.129:9876

编写消费者的代码,具体代码如下:

package com.zj.node.usercenter.rocketmq;

import com.alibaba.fastjson.JSON;

import lombok.Data;

import lombok.extern.slf4j.Slf4j;

import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;

import org.apache.rocketmq.spring.core.RocketMQListener;

import org.springframework.stereotype.Component;

import java.util.Date;

/**

* 消费者监听器

*

* @author 01

* @date 2019-08-03

**/

@Slf4j

@Component

// topic需要和生产者的topic一致,consumerGroup属性是必须指定的,内容可以随意

@RocketMQMessageListener(topic = "test-topic", consumerGroup = "consumer-group")

public class TestConsumerListener implements RocketMQListener {

/**

* 监听到消息的时候就会调用该方法

*

* @param message 消息体

*/

@Override

public void onMessage(Message message) {

log.info("从test-topic中监听到消息");

log.info(JSON.toJSONString(message));

}

}

/**

* 消息体结构需要一致

*/

@Data

class Message {

private Integer id;

private String name;

private String status;

private Date createTime;

}

编写完成后启动项目,由于之前我们已经往队列里发送了消息,所以此时消费者项目一启动,就可以监听到消息并消费,控制台就会输出如下日志:

20190803232038855311.png

原文:https://blog.51cto.com/zero01/2426303

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

消息驱动 微服务器,消息驱动的微服务 - Spring Cloud Alibaba RocketMQ 的相关文章

  • 线程(Linux系统实现)

    目录 1 线程概述 2 主线程和子线程 3 创建线程 线程函数 创建线程示例 4 线程退出 线程退出的原理主要包括以下两个方面 5 线程回收 回收子线程数据 6 线程分离 7 线程取消 8 线程 ID 比较 1 线程概述 线程是轻量级的进程
  • Windows最全DOS的CMD命令

    CMD命令 开始 gt 运行 gt 键入cmd或command 在命令行里可以看到系统版本 文件系统版本 1 appwiz cpl 程序和功能 2 calc 启动计算器 3 certmgr msc 证书管理实用程序 4 charmap 启动
  • Python爬虫可以干什么?Python入门必看!

    在爬虫领域 Python几乎是霸主地位 虽然C Java GO等编程语言也可以写爬虫 但Python更具优势 不仅拥有优秀的第三方库 还可以为我们做很多的事情 那么Python爬虫可以干什么 Python爬虫有什么用 想必很多人都比较好奇
  • 【机考】华为OD2022.11.01机考题目思路与代码

    题目一 描述 输入一个长度为4的倍数的字符串 字符串中仅包含WASD四个字母 将这个字符串中的连续子串用同等长度的仅包含WASD的字符串替换 如果替换后整个字符串中WASD四个字母出现的频数相同 那么我们称替换后的字符串是 完美走位 求子串
  • keil5如何打开智能提示

    在使用keil中需要敲上许多重复代码 并且经常需要调用别人写好的包 这时候我们总不能每句代码都重复的敲一遍 这样不仅没有效率 还要去花时间记住许多自己或许不常用的代码 这时候就需要智能提示来帮助我们了 第一步 打开编辑Edit 目录里找到设
  • Kubernetes(k8s)安装和搭建集群时kubeadm init失败

    Kubernetes k8s 按官方文档描述安装和搭建集群遇到kubelet状态异常 环境 Cenots 7 9 2009 adm64 我在搭建master节点时通过以下命令安装了docker kubelet kubectl kubeadm
  • 建立实体-关系模型(案例)

    一 标识实体 通常有用户 角色这两个实体 二 标识关系 用户与角色间为多对多的互相拥有关系 三 标识实体 关系的属性 不仅仅是实体有属性 关系同样也有属性 这些属性在实体间建立关系时才会存在 有时属性太多 无法在图上一一列出 可以用表格 在
  • AndroidStudio运行项目时的Run/debug configurations问题

    今天遇到的问题一个接一个 在调试项目时突然不能调试 但并没有报代码出错 看Logcat提示的是Android SDK没配置 还有一个明显不同之处 就是右上角那个显示当前项目名称的地方 显示的是app还有一个红叉 根据提示是配置Android
  • Spring Cloud Bus消息总线

    目录 一 概述简介 1 1 Bus是什么 1 2 Bus能干嘛 1 3 为何被称为总线 二 RabbitMQ环境配置 2 1 windows下载与安装 2 2 使用RabbitMQ 三 Bus动态刷新全局广播 3 1 Bus设计思想 3 2
  • PHP 获取当天凌晨时间戳

    总结几种PHP 获取当天凌晨时间戳方法 首先设置时区 header Content type text html charset utf 8 设置北京时间为默认时区 date default timezone set PRC 方法一 当天的
  • Django Error——Requested setting INSTALLED_APPS, but settings are not configured.

    django core exceptions ImproperlyConfigured Requested setting INSTALLED APPS but settings are not configured You must ei
  • jupyter notebook主题、字体、字号管理工具

    jupyter notebook编写 调试代码非常方便 但是其默认主题和字体实在是太难看了 因此大家一般都有修改主题的想法 感谢GitHub上的大神提供了一款主题管理工具 网上已经有文章提出其使用方法 如 jupyter notebook
  • Servlet基础_0500_Application

    一 application概念 application即ServletContext 能够被所有的客户端页面共享 不同的浏览器 不同电脑上的浏览器 演示 ServletContextTest java package com servlet
  • docker下使用apt install报错E: Unable to locate package

    解决方法 方法1 方法2 问题背景 由于docker环境是独立的 gcc vim等需要重新安装 输入安装命令 sudo apt install gcc 7 报错 E Unable to locate package gcc 7 原因是软件源
  • airpods固件更新方法_AirPods Pro迎来首个固件更新,检查耳机版本及更新方法

    airpods pro AirPods Pro推出了一段时间 获得一致好评 但有不少bug存在 针对此 苹果推出了airpods Pro的Firmware 固件 更新 早前购买的AirPods Pro都是 2B584 版本 在11月15日
  • Linux网络发送流程概述

    Linux网络的数据发送 本文主要是学习一下有关Linux 基于Linux3 10 网络层数据写入的流程 在Linux中通过网络写入的数据是如何发送到设备层 socket数据写入 在应用层一般写入的往已经创建好的连接进行数据发送的都会使用s
  • ubuntu20.04下载谷歌浏览器

    第一步 打开终端输入 wget https dl google com linux direct google chrome stable current amd64 deb 第二步 在终端中输入 sudo apt install goog
  • 关于临时表空间问题总结

    oracle经常需要查数据库临时表空间大小 使用率 加表空间等 这里总结临时表空间相关的语句 0 查看实例的临时表空间 SELECT FROM dba tablespaces t where t CONTENTS TEMPORARY SEL
  • 移动端通用404页面

随机推荐

  • 【分享NVIDIA GTC 23大会干货】在 GPU 上使用 Video Codec SDK,CV-CUDA 和 TensorRT 加速现代云上视频应用 [SE51229]

    在 GPU 上使用 Video Codec SDK CV CUDA 和 TensorRT 加速现代云上视频应用 前言 基于现代 的视频流水线架构与运用场景 NVIDIA 视频处理的工具集 1 视频编解码工具 2 前后处理部分 CV CUDA
  • Python中的魔术方法详解

    介绍 在Python中 所有以 双下划线包起来的方法 都统称为 Magic Method 中文称 魔术方法 例如类的初始化方法 init Python中所有的魔术方法均在官方文档中有相应描述 但是对于官方的描述比较混乱而且组织比较松散 很难
  • Llama2 指令精调脚本

    指令精调脚本 重要提示 该代码仅适用于特定PEFT版本 运行脚本前请从源码安装commit id为13e53fc的Peft 如果使用其他版本的PEFT或修改部分训练参数设置 如不使用deepspeed 不能保证模型可以正常训练 运行前确保拉
  • 独显和集显设置,双显卡工作及cuda计算

    有时候我们会碰到插上独显后 想用集显却不显示了 不是电脑出问题了 需要在BIOS中进行设置 1 确保在BIOS中设置集显和独显都予以使用 部分板卡可能不支持 2 此时显示器可以接在集显上 独显单独做计算 确保都有合适的驱动 3 多显卡计算时
  • redis 消息的发布与订阅 持久化

    12 redis 消息的发布与订阅 12 1 发布信息 命令 publish channle message 12 2 订阅信息 命令 subscribe channle1 channel2 12 3 注意 一 接收消息 必须先订阅消息 二
  • QT添加图标、打包应用程序

    1 添加应用程序图标 为可执行文件添加 icon 图标的方法很简单 将事先准备好的 icon 图标拷贝到程序对应的文件夹中 然后在 pro 工程文件内添加如下指令 RC ICONS logo ico 其中 logo ico 是图标文件的名称
  • adworld web训练营刷题总结1

    a d w o r l d adworld adworld
  • 网络编程之什么是计算机网络

    引入 1 地球村 也译为世界村 global village 对地球的一种比喻说法 现代科技的迅速发展 缩小了地球上的时空距离 国际交往日益频繁便利 因而整个地球就如同是茫茫宇宙中的一个小村落 地球村的说法表示现代科技的迅速发展 2 信件
  • 递归完成斐波拉契--函数递归与栈

    什么是递归 递归是一种重要的程序设计方法 简单的说 若在一个函数 过程或数据结构的定义中又应用了它自身 则这个函数 过程或数据结构称为是递归定义的 简称递归 什么是栈 栈是一种数据结构 略 栈与递归的关系 使用计算机实现递归 其实是一种栈的
  • 【项目仿真】温湿度智能监控系统设计(Proteus仿真)

    将单片机项目仿真 温湿度智能监控系统设计分享出来 如有不足 敬请指出 实验图片 实验视频 项目仿真 温湿度智能监控系统设计 Proteus仿真 目录 一 设计要求 二 程序软件 三 资料链接 四 关于作者 一 设计要求 通过Proteus仿
  • 科大讯飞、博世、蔚来、华为实习面试总结

    实习面试总结 为了给自己的秋招先铺铺路 找了一些公司实习面试 需要注意 华为实习很看学历 本科基本上过不了简历 苏州科大讯飞 挂 岗位 硬件实习生 问题 1 PCB板子上对外输出电流的时候是不是需要对电流的开关进行控制 如果需要的话 用什么
  • 4378 选取数对(递推)

    1 问题描述 给定一个长度为 n 的整数数列 a1 a2 an 请你选择 k 个数对 l1 r1 l2 r2 lk rk 要求所选数对满足 1 l1 r1 lt l2 r2 lt lt lk rk n 对于 1 i k ri li 1 m
  • Highly recommend using Dart Sass.

    为什么要替换 1 因为node sass和node js版本关联太紧了 如果这两个版本不匹配 就会起冲突 导致项目无法运行 但是dart sass 安装没有兼容性问题 2 sass官网团队也强烈建议使用dart sass sass团队强烈建
  • LNMP部署及搭建论坛

    目录 前言 一 LNMP架构的部署 理论 1 1 LNMP架构概述 1 2 MySQL安装配置 1 3 PHP解析环境的安装 1 4 配置Ngnx支持PHP环境 二 LNMP应用部署 实操 2 1 Nginx安装 2 1 1 编译安装步骤
  • HDLbits Popcount3的一点疑问

    题目 A population count circuit counts the number of 1 s in an input vector Build a population count circuit for a 3 bit i
  • FFmpeg从RTSP获取流时:h264、h265 判断 I 帧的方法

    H264中 I 帧的判断 这是用ffmpeg接口 av read frame 从IPC摄像头获取得到每一帧数据的前几十个字节 一般00 00 00 01分割之后的下一个字节就是NALU类型 NALU类型是可以用来判断帧的类型是I帧 还是P帧
  • Flask-SQLAlchemy(一) 一对一关系

    前言 课程中经常需要进行web开发 往往是采用Flask框架 建立数据库时就避免不了Flask SQLAlchemy的使用 此文章将记录创建关系表的过程 方便日后回顾以及大家交流讨论 一对一关系 下面的一对一关系以用户和身份证为例 首先创建
  • c++ 友元的三种形式和声明方式

    1 成员函数做友元 include
  • HDU 1716 排列2

    测试数据都能过但是WA 求帮看哪里出了问题 题目链接 Hdu 1716 使用STL的next permutation 函数求解 include
  • 消息驱动 微服务器,消息驱动的微服务 - Spring Cloud Alibaba RocketMQ

    引入MQ后的架构演进 MQ的选择 消息队列对比参照表 RocketMQ vs ActiveMQ vs Kafka 参考至 CentOS7上搭建RocketMQ 环境要求 CentOS 7 2 64位JDK1 8 4G 的可用磁盘空间 1 下