030-从零搭建微服务-消息队列(二)

news/2025/3/14 18:10:40/

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心

源码地址(前端):mingyue-ui: 🎉 基于 Vue3 + TS + Vite + Element plus 等技术,适配 MingYue 后台微服务

文档地址:Wiki - Gitee.com

mingyue-common-mq

添加依赖

根据需要在 mingyue-common-mq 模块中添加所需的 MQ 中间件,例如:RocketMQ、Kafka。

<dependencies><!-- RocketMQ --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-stream-rocketmq</artifactId></dependency>
​<!-- Kafka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId></dependency>
</dependencies>

集成 RocketMQ

引入依赖

<!-- MQ工具 -->
<dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-mq</artifactId>
</dependency>

Nacos 配置

spring:cloud:stream:function:# 重点配置 与 binding 名与消费者对应definition: rocketmqDemorocketmq:binder:# rocketmq 地址name-server: 192.168.21.32:9876bindings:rocketmqDemo-out-0:producer:# 必须得写group: defaultbindings:rocketmqDemo-out-0:content-type: application/jsondestination: stream-rocketmq-demo-topicgroup: demo-groupbinder: rocketmqrocketmqDemo-in-0:content-type: application/jsondestination: stream-rocketmq-demo-topicgroup: demo-groupbinder: rocketmq

RocketMQ 生产者

@Component
public class RocketMqProducer {
​@Resourceprivate StreamBridge streamBridge;
​public void rocketMqDemoMsg(String msg) {// 构建消息对象MqMessageDto messageDto = new MqMessageDto().setMsgId(IdUtil.fastSimpleUUID()).setMsgText(msg);
​streamBridge.send("rocketmqDemo-out-0", MessageBuilder.withPayload(messageDto).build());}
​
}

RocketMQ 消费者

@Slf4j
@Component
public class RocketMqConsumer {
​@BeanConsumer<MqMessageDto> rocketmqDemo() {log.info("Rocket MQ 初始化订阅");return msg -> {log.info("通过 Rocket MQ 消费到消息 => {}", msg.toString());};}
​
}

推送消息到 RocketMQ

@GetMapping("/sendRocketMq")
@Operation(summary = "发送消息到RocketMQ", parameters = { @Parameter(name = "msg", description = "推送的消息体", required = true) })
public R<Void> sendRocketMq(String msg) {rocketMqProducer.rocketMqDemoMsg(msg);return R.ok();
}

集成 Kafka

引入依赖

<!-- MQ工具 -->
<dependency><groupId>com.csp.mingyue</groupId><artifactId>mingyue-common-mq</artifactId>
</dependency>

Nacos 配置

spring:cloud:stream:function:# 重点配置 与 binding 名与消费者对应definition: kafkaDemokafka:binder:brokers: 192.168.21.32:9092bindings:kafkaDemo-out-0:destination: stream-kafka-demo-topiccontentType: application/jsongroup: demo-groupbinder: kafkakafkaDemo-in-0:destination: stream-kafka-demo-topiccontentType: application/jsongroup: demo-groupbinder: kafka

Kafka 生产者

@Component
public class KafkaProducer {
​@Resourceprivate StreamBridge streamBridge;
​public void kafkaDemoMsg(String msg) {// 构建消息对象MqMessageDto messageDto = new MqMessageDto().setMsgId(IdUtil.fastSimpleUUID()).setMsgText(msg);
​streamBridge.send("kafkaDemo-out-0", MessageBuilder.withPayload(messageDto).build());}
​
}

Kafka 消费者

@Slf4j
@Component
public class KafkaConsumer {
​@BeanConsumer<MqMessageDto> kafkaDemo() {log.info("Kafka 初始化订阅");return msg -> {log.info("通过 Kafka 消费到消息 => {}", msg.toString());};}
​
}

推送消息到 Kafka

@GetMapping("/sendKafka")
@Operation(summary = "发送消息到Kafka", parameters = { @Parameter(name = "msg", description = "推送的消息体", required = true) })
public R<Void> sendKafka(String msg) {kafkaProducer.kafkaDemoMsg(msg);return R.ok();
}

拓展 RabbitMQ

mingyue-common-mq 添加依赖

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

Nacos 配置

--- # rabbitmq 配置
spring:rabbitmq:host: rabbitmqIpport: 5672username: rootpassword: rootcloud:stream:function:# 重点配置 与 binding 名与消费者对应definition: rabbitmqDemorabbit:bindings:rabbitmqDemo-in-0:consumer:delayedExchange: truerabbitmqDemo-out-0:producer:delayedExchange: truebindings:rabbitmqDemo-in-0:destination: delay.exchange.democontent-type: application/jsongroup: delay-groupbinder: rabbitrabbitmqDemo-out-0:destination: delay.exchange.democontent-type: application/jsongroup: delay-groupbinder: rabbit

小结

MQ 基础搭建已经完成,后续会编写一些实际开发中使用到队列的场景,如:

  1. 订单处理:

    • 电子商务平台可以使用消息队列来处理订单,确保订单的创建、支付、发货和通知等各个步骤都能按顺序和可靠地执行。

  2. 通知和提醒:

    • 网站或应用程序可以使用消息队列来发送通知和提醒,如电子邮件通知、短信通知、推送通知等,以便与用户互动。

  3. 用户注册和身份验证:

    • 当用户注册或请求密码重置时,消息队列可以用于生成和发送验证链接或令牌,确保用户身份验证的安全性和可扩展性。

  4. 数据同步:

    • 在多个系统之间同步数据,以确保数据的一致性,例如将用户配置信息从一个微服务同步到另一个微服务。

  5. 事件日志和审计:

    • 记录应用程序事件、用户活动和系统操作,以进行审计、监视和故障排除。

  6. 批量处理:

    • 处理大量数据导入、数据清洗、ETL(提取、转换、加载)操作等批处理任务,以提高性能和可维护性。

  7. 异步任务处理:

    • 处理后台任务,如图像处理、视频编码、生成报告等,以减少响应时间和提高系统的吞吐量。

  8. 队列服务:

    • 提供队列服务以支持其他应用程序或团队的异步通信需求,例如云服务提供商的消息队列服务。

  9. 数据分发:

    • 将数据从生产者分发给多个消费者,以实现发布-订阅模式,例如新闻订阅、市场报价和天气预报。

  10. 错误处理和重试:

    • 处理意外错误和故障,将失败的操作或任务放入队列,以便进行重试或错误处理。

这些业务使用场景只是消息队列的一些示例。消息队列有助于提高系统的可扩展性、弹性和可靠性,允许异步处理和解耦合组件,从而改善了应用程序的整体性能和用户体验。不同的业务需求可能需要不同类型的消息队列系统和配置。


http://www.ppmy.cn/news/1131986.html

相关文章

XSS详解

XSS一些学习记录 XXS短标签、属性、事件、方法短标签属性事件函数弹窗函数一些对于绕过有用的函数一些函数使用payload收集 浏览器编码问题XML实体编码URL编码JS编码混合编码 一些绕过方法利用constructor原型污染链构造弹框空格绕过圆括号过滤绕过其他的一些绕过 参考 XXS短标…

机器学习之单层神经网络的训练:增量规则(Delta Rule)

文章目录 权重的调整单层神经网络使用delta规则的训练过程 神经网络以权值的形式存储信息,根据给定的信息来修改权值的系统方法称为学习规则。由于训练是神经网络系统地存储信息的唯一途径&#xff0c;因此学习规则是神经网络研究中的一个重要组成部分 权重的调整 &#xff08…

centos 部署nginx 并配置https

centos版本&#xff1a;centos 7.8 &#xff08;最好不要用8&#xff0c;8的很多用法和7相差很大&#xff09; 一.安装nginx 1。下载Nginx安装包&#xff1a;首先&#xff0c;访问Nginx的官方网站&#xff08;https://nginx.org/&#xff09;或您选择的镜像站点&#xff0c;找…

web:[RoarCTF 2019]Easy Calc

题目 进入页面是一个计算器的页面 随便试了一下 查看源代码看看有什么有用的信息 访问一下这个calc.php 进行代码审计 <?php error_reporting(0); if(!isset($_GET[num])){show_source(__FILE__); }else{$str $_GET[num];$blacklist [ , \t, \r, \n,\, ", , \[, \]…

如何在Cocos中绘制一面国旗祝祖国生日快乐、繁荣昌盛

引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 74年风雨兼程、74载山河巨变&#xff0c;我们一起来祝福伟大的祖国生日快乐、繁荣昌盛&#xff01;我爱你中国&#xff01; 本文主要演示在Cocos中绘制一面国旗&#xff0c;用代码去表达…

【新版】系统架构设计师 - 层次式架构设计理论与实践

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 层次式架构设计理论与实践考点摘要层次式体系结构概述表现层框架设计MVC模式MVP模式MVVM模式使用XML设计表现层表现层中UIP设计思想 中间层架构设计业务逻辑层工作流设计业务逻辑层设计 数据访问层…

解决方案:解决https页面加载http资源报错

HTTPS页面加载HTTP资源会报错的原因是出于安全性考虑。 HTTPS&#xff08;HyperText Transfer Protocol Secure&#xff09;是一种通过使用SSL/TLS加密通信来保护数据传输的协议&#xff0c;它确保了客户端和服务器之间的安全连接。 当HTTPS页面尝试加载非加密的HTTP资源时&a…

Java获取给定月份的前N个月份和前N个季度

描述&#xff1a; 在项目开发过程中&#xff0c;遇到这样一个需求&#xff0c;即&#xff1a;给定某一月份&#xff0c;得到该月份前面的几个月份以及前面的几个季度。例如&#xff1a;给定2023-09&#xff0c;获取该月份前面的前3个月&#xff0c;即2023-08、2023-07、2023-0…