当前位置: 首页 > news >正文

【Spring相关知识】Spring应用如何优雅使用消息队列

文章目录

    • 概述
      • **核心概念**
      • **使用场景**
      • **快速入门**
        • 1. 添加依赖
        • 2. 配置 Binder
        • 3. 定义消息通道
        • 4. 发送和接收消息
        • 5. 运行应用
      • **高级特性**
      • **优点**
      • **适用场景**

概述

Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring BootSpring Integration,提供了与消息中间件(如 Kafka、RabbitMQ 等)的集成。通过 Spring Cloud Stream,开发者可以轻松地将消息传递机制引入到微服务架构中,而无需直接与底层消息中间件交互。

核心概念

  1. Binder

    • Binder 是 Spring Cloud Stream 的核心组件,用于与消息中间件(如 Kafka、RabbitMQ)集成。
    • 它抽象了底层消息中间件的细节,开发者只需通过配置即可切换不同的消息中间件。
    • 例如:spring-cloud-starter-stream-kafkaspring-cloud-starter-stream-rabbit
  2. Binding

    • Binding 是消息通道(Channel)与消息中间件之间的桥梁。
    • 分为 输入绑定(Input Binding)输出绑定(Output Binding)
      • 输入绑定:用于接收消息。
      • 输出绑定:用于发送消息。
  3. Message Channel

    • 消息通道是 Spring Cloud Stream 中的抽象概念,用于发送和接收消息。
    • 常用的通道接口:
      • MessageChannel:用于发送消息。
      • SubscribableChannel:用于订阅消息。
  4. 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 发送和接收。

高级特性

  1. 消息分区

    • 通过配置分区策略,将消息分发到不同的分区中。
    • 示例配置:
      spring:cloud:stream:bindings:output:destination: myTopicproducer:partition-key-expression: headers['partitionKey']partition-count: 3
      
  2. 消息分组

    • 通过分组确保同一组内的消息只被一个消费者实例处理。
    • 示例配置:
      spring:cloud:stream:bindings:input:destination: myTopicgroup: myGroup
      
  3. 消息重试和错误处理

    • 通过配置重试策略和错误通道处理消息消费失败的情况。
    • 示例配置:
      spring:cloud:stream:bindings:input:destination: myTopicconsumer:max-attempts: 3back-off-initial-interval: 1000
      
  4. 多 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 是一个用于构建消息驱动微服务的框架&#xff0c;它基于 Spring Boot 和 Spring Inte…...

人工智能:从概念到未来

人工智能&#xff1a;从概念到未来 一、引言 在当今数字化时代&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;已从科幻小说和电影中的幻想逐渐走进现实&#xff0c;成为推动社会进步和经济发展的关键力量。它正在深刻地改变着我们的生活…...

CUDA Graph

cudaGraphLaunch 是 NVIDIA CUDA API 中的一个函数&#xff0c;用于在 CUDA Graphs 中启动一个已实例化的图。 CUDA Graphs 简介 CUDA Graphs 是 NVIDIA CUDA 编程模型中的一种技术&#xff0c;旨在优化 GPU 程序的性能。它允许将一系列连续的 GPU 操作&#xff08;如计算和数…...

1343. 大小为 K 且平均值大于等于阈值的子数组数目

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 在遍历时维护一个统计的变量&#xff0c;用来统计满足条件的子数组个数 2.2 代码尝试 class Solution { public:int numOfSubarrays(vec…...

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台&#xff0c;第一次需要注册一个账号 进去之后需要创建一个API KEY&#xff0c;然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址&#xff0c;点击左边的&#xff1a;接口…...

C# winforms 使用菜单和右键菜单

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决

目录 概述|背景 报错解析 解决方法 IDEA配置解决 Pom配置插件解决 概述|背景 报错发生背景&#xff1a;在SpringBoot项目中引入Lombok依赖并使用后出现"找不到符号"的问题。 本文讨论在上述背景下发生的报错原因和解决办法&#xff0c;如果仅为了解决BUG不论原…...

C基础寒假练习(6)

一、终端输入行数&#xff0c;打印倒金字塔 #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——第一部分:引言与模型架构

论文原文链接&#xff1a;DeepSeek-V3/DeepSeek_V3.pdf at main deepseek-ai/DeepSeek-V3 GitHub 特别声明&#xff0c;本文不做任何商业用途&#xff0c;仅作为个人学习相关论文的翻译记录。本文对原文内容直译&#xff0c;一切以论文原文内容为准&#xff0c;对原文作者表示…...

【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框架中 设置定时任务&#xff0c;有的末尾是星号有的是问号&#xff0c;有的是6位&#xff0c;有的是7位。就这个机会总结下cron表达式的使用&#xff0c;综合源代码中的crontab地址翻译分析&#xff0c;结合最近超爆的deepseek 提高学习效率&#xff0c;归纳总结出…...

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》&#xff0c;这是一篇关于图&#xff08;graph&#xff09;上异常节点诊断的论文。 论文出处&#xff1a;ICML 2022 论文地址&#xff1a;Rethinking Graph Ne…...

vue知识补充

1.列的样式 第一种&#xff1a;一列一列的写 <div class"house-detail"><div class"static-container"><form-item-static label"业主姓名">{{ baseData.mainOwnerName }}</form-item-static><form-item-static la…...

pushgateway指标聚合问题

一 问题现象 一个job有多个实例推送指标&#xff0c;但是从pushgateway上看这个job的instance字段&#xff0c;只显示一个实例的ip&#xff0c;而不是多个实例。导致在grafana上无法正常根据ip查看监控。 应用的prometheus的配置 management:metrics:tags:application: ${spr…...

使用docker搭建FastDFS文件服务

1.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/fastdfs:latest2.使用docker镜像构建tracker容器&#xff08;跟踪服务器&#xff0c;起到调度的作用&#xff09; docker run -dti --networkhost --name tracker -v /data/fdfs/tracker:/var/fdfs -…...

【R语言】数据分析

一、描述性统计量 借助R语言内置的airquality数据集进行简单地演示&#xff1a; 1、集中趋势&#xff1a;均值和中位数 head(airquality) # 求集中趋势 mean(airquality$Ozone, na.rmT) # 求均值 median(airquality$Ozone, na.rmT) # 求中位数 2、众数 众数&#xff08;mod…...

蓝桥杯C语言组:图论问题

蓝桥杯C语言组图论问题研究 摘要 图论是计算机科学中的一个重要分支&#xff0c;在蓝桥杯C语言组竞赛中&#xff0c;图论问题频繁出现&#xff0c;对参赛选手的算法设计和编程能力提出了较高要求。本文系统地介绍了图论的基本概念、常见算法及其在蓝桥杯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&#xff0c;用于表示一个角度&#xff0c;其中角度以弧度为单位存储。这个结构体提供了许多特性&#xff0c;包括复制、克隆、默认实现、调试输出、部分相等性比较、哈希等。此外&#xff0c;它还根据编译时的特性&#xff08;features…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

服务器硬防的应用场景都有哪些?

服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式&#xff0c;避免服务器受到各种恶意攻击和网络威胁&#xff0c;那么&#xff0c;服务器硬防通常都会应用在哪些场景当中呢&#xff1f; 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...