【Spring相关知识】Spring应用如何优雅使用消息队列
文章目录
- 概述
- **核心概念**
- **使用场景**
- **快速入门**
- 1. 添加依赖
- 2. 配置 Binder
- 3. 定义消息通道
- 4. 发送和接收消息
- 5. 运行应用
- **高级特性**
- **优点**
- **适用场景**
概述
Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Integration,提供了与消息中间件(如 Kafka、RabbitMQ 等)的集成。通过 Spring Cloud Stream,开发者可以轻松地将消息传递机制引入到微服务架构中,而无需直接与底层消息中间件交互。
核心概念
-
Binder:
- Binder 是 Spring Cloud Stream 的核心组件,用于与消息中间件(如 Kafka、RabbitMQ)集成。
- 它抽象了底层消息中间件的细节,开发者只需通过配置即可切换不同的消息中间件。
- 例如:
spring-cloud-starter-stream-kafka或spring-cloud-starter-stream-rabbit。
-
Binding:
- Binding 是消息通道(Channel)与消息中间件之间的桥梁。
- 分为 输入绑定(Input Binding) 和 输出绑定(Output Binding):
- 输入绑定:用于接收消息。
- 输出绑定:用于发送消息。
-
Message Channel:
- 消息通道是 Spring Cloud Stream 中的抽象概念,用于发送和接收消息。
- 常用的通道接口:
MessageChannel:用于发送消息。SubscribableChannel:用于订阅消息。
-
Message:
- 消息是 Spring Cloud Stream 中的基本数据单元,包含 Payload(消息体) 和 Headers(消息头)。
使用场景
- 事件驱动架构:通过消息传递实现服务之间的解耦。
- 数据流处理:实时处理和分析数据流。
- 异步通信:提高系统的响应速度和吞吐量。
快速入门
1. 添加依赖
在 pom.xml 中添加 Spring Cloud Stream 和 Binder 的依赖(以 Kafka 为例):
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
2. 配置 Binder
在 application.yml 中配置 Kafka Binder:
spring:cloud:stream:bindings:input:destination: myTopicgroup: myGroupoutput:destination: myTopickafka:binder:brokers: localhost:9092
3. 定义消息通道
通过接口定义输入和输出通道:
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.SubscribableChannel;public interface MyProcessor {String INPUT = "input";String OUTPUT = "output";@Input(INPUT)SubscribableChannel input();@Output(OUTPUT)MessageChannel output();
}
4. 发送和接收消息
编写服务类发送和接收消息:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;@EnableBinding(MyProcessor.class)
@Service
public class MyService {@Autowiredprivate MyProcessor processor;// 发送消息public void sendMessage(String message) {processor.output().send(MessageBuilder.withPayload(message).build());}// 接收消息@StreamListener(MyProcessor.INPUT)public void receiveMessage(String message) {System.out.println("Received: " + message);}
}
5. 运行应用
启动 Spring Boot 应用后,消息将通过 Kafka 发送和接收。
高级特性
-
消息分区:
- 通过配置分区策略,将消息分发到不同的分区中。
- 示例配置:
spring:cloud:stream:bindings:output:destination: myTopicproducer:partition-key-expression: headers['partitionKey']partition-count: 3
-
消息分组:
- 通过分组确保同一组内的消息只被一个消费者实例处理。
- 示例配置:
spring:cloud:stream:bindings:input:destination: myTopicgroup: myGroup
-
消息重试和错误处理:
- 通过配置重试策略和错误通道处理消息消费失败的情况。
- 示例配置:
spring:cloud:stream:bindings:input:destination: myTopicconsumer:max-attempts: 3back-off-initial-interval: 1000
-
多 Binder 支持:
- 支持同时使用多个消息中间件(如 Kafka 和 RabbitMQ)。
- 示例配置:
spring:cloud:stream:binders:kafkaBinder:type: kafkaenvironment:spring:kafka:bootstrap-servers: localhost:9092rabbitBinder:type: rabbitenvironment:spring:rabbitmq:host: localhostport: 5672
优点
- 简化消息中间件集成:通过 Binder 抽象,屏蔽底层消息中间件的差异。
- 灵活的配置:支持多种消息中间件和高级特性(如分区、分组、重试等)。
- 与 Spring 生态无缝集成:基于 Spring Boot,易于与其他 Spring 组件(如 Spring Data、Spring Security)集成。
适用场景
- 需要解耦的微服务架构。
- 实时数据流处理。
- 异步任务处理。
通过 Spring Cloud Stream,开发者可以快速构建高效、可靠的消息驱动微服务,同时享受 Spring 生态的强大支持。
相关文章:
【Spring相关知识】Spring应用如何优雅使用消息队列
文章目录 概述**核心概念****使用场景****快速入门**1. 添加依赖2. 配置 Binder3. 定义消息通道4. 发送和接收消息5. 运行应用 **高级特性****优点****适用场景** 概述 Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Inte…...
人工智能:从概念到未来
人工智能:从概念到未来 一、引言 在当今数字化时代,人工智能(Artificial Intelligence,AI)已从科幻小说和电影中的幻想逐渐走进现实,成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…...
CUDA Graph
cudaGraphLaunch 是 NVIDIA CUDA API 中的一个函数,用于在 CUDA Graphs 中启动一个已实例化的图。 CUDA Graphs 简介 CUDA Graphs 是 NVIDIA CUDA 编程模型中的一种技术,旨在优化 GPU 程序的性能。它允许将一系列连续的 GPU 操作(如计算和数…...
1343. 大小为 K 且平均值大于等于阈值的子数组数目
目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 在遍历时维护一个统计的变量,用来统计满足条件的子数组个数 2.2 代码尝试 class Solution { public:int numOfSubarrays(vec…...
IDEA+DeepSeek让Java开发起飞
1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台,第一次需要注册一个账号 进去之后需要创建一个API KEY,然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址,点击左边的:接口…...
C# winforms 使用菜单和右键菜单
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决
目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景:在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法,如果仅为了解决BUG不论原…...
C基础寒假练习(6)
一、终端输入行数,打印倒金字塔 #include <stdio.h> int main() {int rows;printf("请输入倒金字塔的行数: ");scanf("%d", &rows);for (int i rows; i > 0; i--) {// 打印空格for (int j 0; j < rows - i; j) {printf(&qu…...
【论文翻译】DeepSeek-V3论文翻译——DeepSeek-V3 Technical Report——第一部分:引言与模型架构
论文原文链接:DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明,本文不做任何商业用途,仅作为个人学习相关论文的翻译记录。本文对原文内容直译,一切以论文原文内容为准,对原文作者表示…...
【docker】Failed to allocate manager object, freezing:兼容兼容 cgroup v1 和 v2
参考大神让系统同时兼容 cgroup v1 和 v2 要解决你系统中只挂载了 cgroup v2 但需要兼容 cgroup v1 的问题,可以通过以下几步来使系统同时兼容 cgroup v1 和 cgroup v2。这样 Docker 和其他服务就可以正常工作了。步骤 1:更新 Grub 配置,启用兼容模式 编辑 GRUB 配置来启用同…...
我使用deepseek高效学习-分析外文网站Cron定时执行任务
最近在spring框架中 设置定时任务,有的末尾是星号有的是问号,有的是6位,有的是7位。就这个机会总结下cron表达式的使用,综合源代码中的crontab地址翻译分析,结合最近超爆的deepseek 提高学习效率,归纳总结出…...
Android13-系统服务大管家-ServiceManager进程-启动篇
文章目录 关注 ServiceMager 原因ServerManager需要掌握的知识资料参考ServiceManager 进程启动启动脚本涉及到的相关源码文件源码跟踪ServiceManager脚本启动位置ServiceManager关联脚本 Native层源码分析main.cpp流程打开驱动 initWithDriverinitmakeProcessState 构造方法op…...
论文笔记:Rethinking Graph Neural Networks for Anomaly Detection
目录 摘要 “右移”现象 beta分布及其小波 实验 《Rethinking Graph Neural Networks for Anomaly Detection》,这是一篇关于图(graph)上异常节点诊断的论文。 论文出处:ICML 2022 论文地址:Rethinking Graph Ne…...
vue知识补充
1.列的样式 第一种:一列一列的写 <div class"house-detail"><div class"static-container"><form-item-static label"业主姓名">{{ baseData.mainOwnerName }}</form-item-static><form-item-static la…...
pushgateway指标聚合问题
一 问题现象 一个job有多个实例推送指标,但是从pushgateway上看这个job的instance字段,只显示一个实例的ip,而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…...
使用docker搭建FastDFS文件服务
1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/fastdfs:latest2.使用docker镜像构建tracker容器(跟踪服务器,起到调度的作用) docker run -dti --networkhost --name tracker -v /data/fdfs/tracker:/var/fdfs -…...
【R语言】数据分析
一、描述性统计量 借助R语言内置的airquality数据集进行简单地演示: 1、集中趋势:均值和中位数 head(airquality) # 求集中趋势 mean(airquality$Ozone, na.rmT) # 求均值 median(airquality$Ozone, na.rmT) # 求中位数 2、众数 众数(mod…...
蓝桥杯C语言组:图论问题
蓝桥杯C语言组图论问题研究 摘要 图论是计算机科学中的一个重要分支,在蓝桥杯C语言组竞赛中,图论问题频繁出现,对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯C语言组中的应用&#…...
jmeter 性能测试Linux 常用的安装
把软件安装包全部都放在/data/soft目录下 一、 Java 环境安装 1. 把JDK的安装包上传到/data/soft/目录下 2. 解压jdk安装包,重命名jdk 3. 配置环境变量 JAVA_HOME [root@MiWiFi-RA72-srv soft]# vim /etc/profile export JAVA_HOME=/data/soft/jdk1.8 export PATH=…...
19 角度操作模块(angle.rs)
angle.rs代码定义了一个泛型结构体 Angle,用于表示一个角度,其中角度以弧度为单位存储。这个结构体提供了许多特性,包括复制、克隆、默认实现、调试输出、部分相等性比较、哈希等。此外,它还根据编译时的特性(features…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
