030-从零搭建微服务-消息队列(二)
写在最前
如果这个项目让你有所收获,记得 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 基础搭建已经完成,后续会编写一些实际开发中使用到队列的场景,如:
-
订单处理:
-
电子商务平台可以使用消息队列来处理订单,确保订单的创建、支付、发货和通知等各个步骤都能按顺序和可靠地执行。
-
-
通知和提醒:
-
网站或应用程序可以使用消息队列来发送通知和提醒,如电子邮件通知、短信通知、推送通知等,以便与用户互动。
-
-
用户注册和身份验证:
-
当用户注册或请求密码重置时,消息队列可以用于生成和发送验证链接或令牌,确保用户身份验证的安全性和可扩展性。
-
-
数据同步:
-
在多个系统之间同步数据,以确保数据的一致性,例如将用户配置信息从一个微服务同步到另一个微服务。
-
-
事件日志和审计:
-
记录应用程序事件、用户活动和系统操作,以进行审计、监视和故障排除。
-
-
批量处理:
-
处理大量数据导入、数据清洗、ETL(提取、转换、加载)操作等批处理任务,以提高性能和可维护性。
-
-
异步任务处理:
-
处理后台任务,如图像处理、视频编码、生成报告等,以减少响应时间和提高系统的吞吐量。
-
-
队列服务:
-
提供队列服务以支持其他应用程序或团队的异步通信需求,例如云服务提供商的消息队列服务。
-
-
数据分发:
-
将数据从生产者分发给多个消费者,以实现发布-订阅模式,例如新闻订阅、市场报价和天气预报。
-
-
错误处理和重试:
-
处理意外错误和故障,将失败的操作或任务放入队列,以便进行重试或错误处理。
-
这些业务使用场景只是消息队列的一些示例。消息队列有助于提高系统的可扩展性、弹性和可靠性,允许异步处理和解耦合组件,从而改善了应用程序的整体性能和用户体验。不同的业务需求可能需要不同类型的消息队列系统和配置。
相关文章:
030-从零搭建微服务-消息队列(二)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…...
Docker从认识到实践再到底层原理(九)|Docker Compose 容器编排
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…...
操作EXCEL计算3万条数据的NDVI并填入
Python操作EXCEL,计算3万条数据的NDVI并填入 问题描述 现在是有构建好了的查找表,不过构建了3万条数据,在excel中手动计算每行的NDVI值太麻烦了,也不会操作。 就试试python吧,毕竟python自动处理大型EXCEL数据很方便…...
Linux服务器安装Anaconda 配置远程jupyter lab使用虚拟环境
参考的博客: Linux服务器安装Anaconda 并配置远程jupyter lab anaconda配置远程访问jupyter,并创建虚拟环境 理解和创建:Anaconda、Jupyterlab、虚拟环境、Kernel 下边是正文了。 https://www.anaconda.com/download是官网网址,可…...
R语言实现随机生存森林(3)
常见问题解答 1、计算C指数 1-Error rate,或者 rsf.err <- get.cindex(yvar$Survival_months,yvar$OS,predictedrf.grow$predicted) 2、模型中predicted和predicted.oob区别 predicted和predicted.oob是两个不同的属性,它们分别表示模型的预测结果…...
WebPack-打包工具
从图中我们可以看出,Webpack 可以将多种静态资源 js、css、less 转换成一个静态文件,减少了页面的请求. 下面举个例子 : main.js 我们只命名导出一个变量 export const name"老六"index.js import { name } from "./tset/…...
CISSP学习笔记:PKI和密码学应用
第七章 PKI和密码学应用 7.1 非对称密码学 对称密码系统具有共享的秘钥系统,从而产生了安全秘钥分发的问题非对称密码学使用公钥和私钥对,无需支出复杂密码分发系统 7.1.1 公钥与私钥 7.1.2 RSA(兼具加密和数字签名) RSA算法…...
简述Java21新特性
Java21新特性 你发任你发我用Java8 不管Java更新了多少版本,我还是用Java8,因为在很多框架不知道支持不支持Java21,而且因为很多Jar包的版本冲突问题,所以我还是用Java8,但是对于新技术的了解是非常必要的。 Java 21是新推出的长…...
Composition API(常用部分)
1. Composition API(常用部分) 文档: https://composition-api.vuejs.org/zh/api.html 1) setup 新的option, 所有的组合API函数都在此使用, 只在初始化时执行一次函数如果返回对象, 对象中的属性或方法, 模板中可以直接使用2) ref 作用: 定义一个数据的响应式语法: cons…...
驱动插入中断门示例代码
驱动插入中断描述符示例代码 最近做实验,每次在应用层代码写测试代码的时候都要手动挂一个中断描述符,很不方便所以就想着写个驱动挂一个中断门比较省事 驱动测试效果如下: 下面的代码是个架子,用的时候找个驱动历程传递你要插…...
1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning
2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务(相似子轨迹搜索、轨迹预测和轨迹聚类)最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类: 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…...
如何做一个基于 Python 的搜索引擎?
怎么做一个基于 python 的搜索引擎? 1、确定搜索引擎范围和目标用户 在决定做一个基于Python的搜索引擎之前,首先需要确定搜索引擎的范围和目标用户。搜索引擎的范围可以包括新闻、商品、音乐等,不同的领域需要不同的数据来源和处理方式。同…...
Python报错:KeyError: ‘820‘
Python报错:KeyError: ‘820’ 问题描述 原因 操作的表格列名是数字 NIRdata[820] Rdata[630]以上是出错行,dataframe的这种索引方式不支持用数字。 解决方案 先修改列名为字符 然后将出错行改为对应列名 NIRdata[nir] Rdata[r]...
【kubernetes】kubernetes中的Deployment使用
1 Why need Deployment? K8S中Pod是用户管理工作负载的基本单位,Pod通常通过Service进行暴露,因此,通常需要管理一组Pod,RC和RS主要就实现了一组Pod的管理工作,其中,RC和RS的区别在于,RS提供更…...
百度2024校招机器学习、数据挖掘、自然语言处理方向面试经历
本文介绍2024届秋招中,百度的机器学习/数据挖掘/自然语言处理工程师岗位一面的面试基本情况、提问问题、代码题目等。 8月初参与了百度提前批的机器学习/数据挖掘/自然语言处理工程师岗位面试,所在部门是搜索方向的。一面结束之后就知道凉了,…...
RabbitMQ原理(二):SpringAMQP编程
文章目录 3.SpringAMQP3.1.导入Demo工程3.2.快速入门3.1.1.消息发送3.1.2.消息接收3.1.3.测试3.3.WorkQueues模型3.3.1.消息发送3.3.2.消息接收3.3.3.测试3.3.4.能者多劳3.3.5.总结3.4.交换机类型3.5.Fanout交换机3.5.1.声明队列和交换机3.5.2.消息发送3.5.3.消息接收3.5.4.总结…...
什么是SQL注入(SQL Injection)?如何预防它
什么是 SQL 注入(SQL Injection)?如何预防它? SQL注入(SQL Injection)是一种常见的网络安全漏洞,攻击者通过在应用程序的输入中插入恶意SQL代码来执行未经授权的数据库操作。SQL注入攻击可能导…...
metrology
创建模型:create_metrology_model 设置图像大小:set_metrology_model_image_size 添加测量模型:add_metrology_object_rectangle2_measure 设置对象参数:set_metrology_object_param 设置模型参数:set_metrology_model…...
UE学习记录06----根据Actor大小自适应相机位置
背景: staticMesh 会根据业务需要随时变化,然后通过staticMesh的大小自适应相机位置,捕捉画面用来预览该模型,使模型在画布中不会太大导致显示不全,也不会太小 参考: UE实现相机聚焦物体功能_右弦GISer的…...
Go-Python-Java-C-LeetCode高分解法-第八周合集
前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏,每日一题,和博主一起进步 LeetCode专栏 本文部分内容来自网上搜集与个人实践。如果任何信息存在错误,欢迎…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
