SpringCloud Stream消息驱动

SpringCloudStream集成Kafka 由于我们直接使用Spring Cloud Stream 集成Kafka,官方也已经有现成的starter。首先需要定义SubscribableChannel 接口方法使用Input注解。首先需要定义生产者MessageChannel,这里会用到Output注解。通过@StreamListener监听通道的消息。使用MessageChannel 发送消息。 阅读详情

1、消息驱动概述

什么是消息驱动

在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ、RabbitMQ、RocketMQ、Kafka等,学习所有这些消息中间件无疑需要大量时间经历成本,那有没有一种技术,使我们不再需要关注具体的消息中间件的细节,而只需要用一种适配绑定的方式,自动的在各种消息中间件内切换呢?消息驱动就是这样的技术,它能**屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。**好比jdb能够操作MySQL、Oracle等数据库。

SpringCloud Stream是一个构件消息驱动的微服务框架。应用程序通过inputs和outputs来与SpringCloud Stream中的绑定器(binder)对象交互,通过配置来绑定,而SpringCloud Stream的绑定器对象负责与消息中间件交互,所以,我们只需要搞清楚如何与SpringCloud Stream交互就可以方便使用消息驱动的方式。但是截至到目前时间,SpringCloud Stream目前仅支持RabbitMQ和Kafka。

官网

https://spring.io/projects/spring-cloud-stream

设计思想

在经典的消息队列中,生产者/消费者之间靠消息媒介传递信息内容,消息必须走特定的通道Message Channel,消息通道里的子接口Subscribable Channel消费消息,然后MessageHandler负责收发处理。

在SpringCloud Stream中,通过定义绑定器(binder)作为中间层,实现了应用程序与消息中间件细节之间的隔离。在消息绑定器中,INPUT对应于消费者,OUTPUT对应于生产者,Stream中的消息通信方式遵循了发布—订阅模式:用Topic(主题)进行广播(RabbitMQ中对应于Exchange交换机,Kafka中就是Topic)。

在这里插入图片描述

编码API和常用注解

在这里插入图片描述

组成说明
Middleware中间件,目前只支持RabbitMQ和Kaf
BinderBinder是应用与消息中间件之间的封装,目前实行了RabbitMQ和Kafka的Binder,通过Binder可以很方便的连接中间件,可以动态的改变消息类型(对应于Kafka的topic,RabbitMQ的exchange),这些都可以通过配置文件来实现
@Input注解标识输入通道,通过该输入通道接收到的消息进入应用程序
@Output注解标识输出通道,发布的消息将通过该通道离开应用程序
@StreamListner监听队列,用于消费者的队列的消息接收
@EnableBinding使信道Channel和交换机/主题(Exchange/Topic)绑定在一起

2、SpringCloud Stream之消息生产者

新建Module:stream_rabbitmq_provider8801作为消息的生产者用来发送消息

pom文件

在其POM文件中除引入web、actuator、eureka-client等必要启动器外,还需要引入SpringCloud Stream对应实现RabbitMQ的启动器依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
编写其配置文件application.yml:
server:
  port: 8801

spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      binders: # 在此处配置要绑定的rabbitmq的服务信息;
        defaultRabbit: # 表示定义的名称,用于于binding整合
          type: rabbit # 消息组件类型
          environment: # 设置rabbitmq的相关的环境配置
            spring:
              rabbitmq:
                host: localhost
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        output: # 这个名字是一个通道的名称,OUTPUT表示这是消息的发送方
          destination: testExchange # 表示要使用的Exchange名称定义
          content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
          binder: defaultRabbit # 设置要绑定的消息服务的具体设置

eureka:
  client: # 客户端进行Eureka注册的配置
    service-url:
      defaultZone: http://eureka7002.com:7002/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
    lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
    instance-id: send-8801.com  # 在信息列表时显示主机名称
service业务类

@EnableBinding注解用来绑定消息的推送管道,消息生产者绑定的消息推送管道为org.springframework.cloud.stream.messaging.Source:

package com.jun.Service;

/**
 * @author junfeng.lin
 * @date 2021/3/2 18:44
 */
public interface IMessageProvider {
    public String send();
}

package com.jun.Service.Impi;

import com.jun.Service.IMessageProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import java.util.UUID;

/**
 * @author junfeng.lin
 * @date 2021/3/2 18:45
 */
@EnableBinding(Source.class) //定义消息的推送管道
public class MessageProviderImpl implements IMessageProvider {

    @Autowired
    private MessageChannel output; //消息发送管道

    @Override
    public String send() {
        String serial = UUID.randomUUID().toString();
        output.send(MessageBuilder.withPayload(serial).build());//发送消息
        System.out.println("========serial:" + serial);
        return null;
    }
}

controller
package com.jun.Controller;

import com.jun.Service.IMessageProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author junfeng.lin
 * @date 2021/3/2 18:48
 */
@RestController
public class SendMessageController {
    @Autowired
    private IMessageProvider messageProvider;

    @GetMapping("/sendMessage")
    public String sendMessage() {
        return messageProvider.send();	//发送消息
    }
}

测试

先后启动eureka注册中心、消息生产者模块和RabbitMQ,在控制面板中我们看到了有一个名为testExchange的交换机

在这里插入图片描述
访问 http://localhost:8801/sendMessage 使用消息生产者微服务发送消息,在其微服务后台我们看到了打印的消息,在RabbitMQ的控制面板中我们也看到了确实发送了消息。

在这里插入图片描述

3、SpringCloud Stream之消息消费者

新建Module:stream_rabbitmq_provider8802和stream_rabbitmq_provider8803作为消息的生产者用来发送消息

其POM文件中引入的启动器依赖和消息生产者微服务的依赖几乎相同

编写其配置文件application.yml

其配置文件的书写和消息生产者的几乎一致,特别需要注意的是,消息生产者微服务用到的通道为OUTPUT,而消息消费者微服务用到的通道为INPUT,其他的配置文件信息就只需要注意端口号、注册服务名的区别即可

spring:
  cloud:
      bindings: 
        input: # 这个名字是一个通道的名称,INPUT表示消息消费者
          destination: testExchange # 表示要使用的Exchange名称定义
          content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
          binder: defaultRabbit # 设置要绑定的消息服务的具体设置
controller

由于是消费者,所以只需要编写其Controller即可,@EnableBinding注解用来绑定消息的推送管道,消息消费者绑定的消息推送管道为import org.springframework.cloud.stream.messaging.Sink,在接收消息的方法中需要使用@StreamListner注解来监听其绑定的消息推送管道

package org.jun.Controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;

/**
 * @author junfeng.lin
 * @date 2021/3/2 18:48
 */
@EnableBinding(Sink.class)
public class ReceiveMessageController {

    @Value("${server.port}")
    private String serverPort;

    @StreamListener(Sink.INPUT)
    public void input(Message<String> message) {
        System.out.println("消费者" + serverPort + "号,收到消息:" + message.getPayload());
    }
}
测试

先后启动eureka注册中心、消息生产者模块和消息消费者模块,调用消息生产者接口发送消息,此时消息消费者接收到消息,并在控制台中打印如下

在这里插入图片描述

4、分组消费

重复消费问题

当生产者发送消息后,此时的我们的消费者都接受了消息并进行了消费,也就是说同一条消息被多个消息消费者所消费。其实重复消费这个问题本身不可怕,可怕的是没考虑到重复消费之后,怎么保证幂等性,在有些情况下不能使用重复消费,所以可以利用SpringCloud Stream的消息分组功能来避免重复消费。

在SpringCloud Stream中,处于同一组中的多个消息消费者是竞争关系,也就是保证生产者所发送的同一个消息只会被其中一个消费者消费一次。在不同组的消费者是可以对消息进行重复消费的,只有同一组内才会发生竞争关系。

分组解决重复消费问题

在RabbitMQ控制面板中我们看到的组流水号是系统随机分配的,这样无疑不好控制,所以我们应该自定义配置分组,将8802/8803两个消息消费者微服务分为同一个组,以此来解决消息的重复消费问题,先来演示如何自定义分组。

在8802/8803微服务中的配置文件中分别添加组名属性,当组名相同时表示为同一组

spring:
  cloud:
    stream:
      bindings:
        input:
          group: groupName # 分组名称

将两个消费者微服务设置相同的组名myGroup并重启项目后,可以看到rabbitmq的队列如下

在这里插入图片描述
在这里插入图片描述

此时用生产者发送11条信息,可以看到8802微服务收到6条,而8803微服务收到5条,说明处于同一分组的消费者是竞争关系

在这里插入图片描述

在这里插入图片描述

SpringCloud-10-SpringCloud Stream消息驱动 SpringCloud Stream消息驱动 1. 消息驱动概述 1. 消息驱动是什么? 在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ、RabbitMQ、RocketMQ、Kafka等,学习所有这些消息中间件无疑需要大量时间经历成本,那有没有一种技术,使我们不再需要关注具体的消息中间件的细节,而只需要用一种适配绑定的方式,自动的在各种消息中间件内切换呢?消息驱动就是这样的技术,它能屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。 SpringCloud Stream是一 阅读详情

相关推荐

消息驱动Stream---基于SpringCloud

概述是一个构建消息驱动微服务的框架。作用它是对于消息中间件的进一步封装,通过使用Spring CloudStream,可忽略消息中间件之间的差异,有效降低开发人员对消息中间件的使用复杂度。目前Spring Cloud Stream支持的消息中间件仅有RabbitMQ和Kafka。在消费组中我们可以保证消息不会被重复消费,但是在同组下有多个实例的时候,我们无法确定每次处理消息的是不是被同一消费者消费,这就要使用到Stream的消息分区。

weixin_59248828的博客 1453

最简单的SpringCloudStream集成Kafka教程

SpringCloudStream是一个构建高扩展性的事件消息驱动的微服务框架。简单点说就是帮助你操作MQ,可以与底层MQ框架解耦。将来想要替换MQ框架的时候会比较容易。Kafka是一个分布式发布 - 订阅消息系统,源于LinkedIn的一个项目,2011年成为开源Apache项目。ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册,Kafka的实现同时也依赖于zookeeper。...

lt_xiaodou的博客 8417

奇迹MU单机版开服全流程:从零搭建到分辨率调整(附GM工具使用技巧)

本文详细介绍了奇迹MU单机版从零搭建到分辨率调整的完整流程,包括环境配置、服务端启动、GM工具使用技巧等关键步骤。特别针对现代高分辨率显示器提供了优化方案,帮助玩家轻松搭建个性化游戏环境,重温经典MMORPG的独特魅力。

b3n4m5q6w7的博客 680

简单实用spring-cloud-starter-stream-kafka以及手动提交

spring-cloud-starter-stream-kafka

ai_haibin的博客 3842

首个基于LBS方案的3D传感器,VoxelSensor解析

该传感器将结合OQmented的Lissajous模式的MEMS扫描镜,与每帧逐行工作的光栅扫描相比,Lissajous轨迹扫描速度更快,并且能耗很低,它可以更快地捕获完整的场景和快速移动,并且需要更少的数据处理,可满足AR/VR对于低延迟、高效率的需求。简单来讲,Switching Pixels的区别是专注于识别激光事件,性能比普通事件相机更好,但也可以使用事件相机的算法。在具体应用中,它需要在X和Y方向发射一个或多个脉冲光束,以在X和Y轴上定位,而Z轴,也就是深度,则是通过计算光返回的时间来测量。

qingtingwang的博客 575

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

【十九】初学Kafka并实战整合SpringCloudStream进行使用

初学Kafka并实战整合SpringCloudStream进行使用

weixin_56995925的博客 5686

用Python进行GEO数据挖掘(学习笔记四):富集分析

该笔记详细解释了富集分析的工作原理,并简要地利用gseapy在python中进行富集分析的操作。

m0_64111502的博客 5649

spring boot 使用spring-cloud-stream简单操作kafka使用详解

这篇文章主要介绍了在spring boot 中使用spring-cloud-stream简单操作kafka使用详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

经历过大厂、小厂风风雨雨的程序佬 2455

即插即用系列(代码实践)| GRSL 2024 ARConv核心模块:自适应矩形卷积——专为遥感图像设计,打破固定方形卷积束缚

摘要: 本文提出了一种用于遥感图像处理的自适应矩形卷积模块(ARConv),解决了传统方形卷积核在处理复杂几何结构(如细长道路、密集建筑物)时导致的光谱混叠和边缘模糊问题。ARConv通过动态调整卷积核的长宽比和旋转角度,使卷积核形状与地物特征自适应匹配。该模块可即插即用于全色锐化、语义分割等遥感任务,有效提升边缘保持能力和光谱保真度。核心代码基于PyTorch实现,包含偏移量生成和几何变换逻辑,支持梯度缩放以稳定训练。

分享顶会顶刊论文即插即用模块 140

SOEM主站开发篇(1):移植SOEM主站到Linux开发板

详细介绍了SOEM主站源码移植到Linux开发板上的步骤,同时演示了如何使用Linux开发板获取EtherCAT从站的PDO映射信息。

kevin1499的博客 2398

SpringCloud核心组件之 Spring Cloud Stream消息驱动组件

SpringCloud核心组件之 Spring Cloud Stream消息驱动组件 本文主要讲述了如何使用 Spring Cloud Stream消息驱动组件 首先,我们创建两个工程(基于RabbitMQ,RabbitMQ的安装和使用这里不作说明,默认本机RabbitMQ是启动的) meander-cloud-provider, 端口:8764,作为生产者端发消息 meander-cloud-consumer,端口:8765和8766,作为消费者端接收消息(启动两个消费者服务,端口分别为8765、8766

kongtong2004的专栏 523

手把手教你学Simulink--基于车联网与智能交通系统的场景实例:基于车联网(V2X)的实时路况信息共享与处理

《基于Simulink的车联网(V2X)实时路况共享系统仿真》摘要:本文详细介绍使用Simulink构建V2X智能交通系统的完整方法。系统包含交通路网建模、V2X通信实现(支持DSRC/C-V2X标准)、多源路况信息融合、动态路径规划等核心模块。通过对比实验,验证V2X可使平均车速提升52%,行程时间缩短34%,显著提升交通效率。文章还探讨了AI预测调度、车辆编队等高级应用,为智慧交通系统开发提供实用参考。所需工具包括Simulink、SimEvents及无线通信工具箱等。

MHD0815的博客 739

SpringCloud学习笔记【十四】:Spring Cloud Stream消息驱动

文章目录本篇要点Spring Cloud Stream概述设计思想标准的MQSpring Cloud StreamAPI及常用注解Spring Cloud Stream演示前置条件消息驱动之生产者引入pom依赖配置yml主启动类定义消息的推送管道定义接口测试消息驱动之消费者引入pom依赖配置yml主启动类定义消费者接口测试分组消费与持久化源码下载 Introducing Spring Cloud Stream https://spring.io/projects/spring-cloud-stream

天乔巴夏丶 686

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Cloud 学习笔记之——11 SpringCloud Stream消息驱动

SpringCloud 之 Stream

qq_38777021的博客 2453

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《深入浅出SpringCloud》SpringCloud Stream 消息驱动

SpringCloud Stream 消息驱动 Spring Cloud Stream官方的说法是一个构建消息驱动微服务的框架。我们可以这么理解,这个Spring Cloud Stream封装了mq的玩法,统一了模型,然后屏蔽各个mq产品中间件不同,降低了我们的学习成本,不过目前只支持kafka与rabbitmq。我们的应用程序,也就是spring Application ,通过这个input 与output 这两种channel 与binder 进行交互,binder(绑定器对象)屏蔽了咱们的消息中间件

ysj_2021的博客 2906

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

SpringCloud之Spring Cloud Stream:消息驱动

Spring Cloud Stream 是一个构建消息驱动微服务的框架,该框架在Spring Boot的基础上整合了Spring Integrationg来连接消息代理中间件(RabbitMQ, Kafka等),提供了个性化的自动化配置实现,并引入了发布-订阅、消费组、分区这三个核心概念。 应用程序通过input通道或者output通道来与Spring Cloud Stream中binder(绑定器)交互,通过配置来binding. 而Spring Cloud Stream的binder负责与中间件交互。

gdjlc的专栏 493

SpringCloud-Stream-消息驱动

简介: SpringCloud-Stream 官方定义SpringCloud-Stream是一个构建消息驱动的微服务框架,应用程序通过,inputs 或者ouputs来与SpringCloud-Stream的binder对象负责与消息中间件交互,所以只需知道怎么和SpringCloud-Stream交互就可以方便的使用消息驱动的方式、通过使用 SpringCloud-Stream来连接信息代理中间件以实现消息驱动,SpringCloud-Stream为一些应用商的消息中间件,提供了个性化的自动化配置实现 ,

T 2376

SpringCloud-SpringCloud Stream消息驱动

消息驱动概述 屏蔽底层消息中间件的差异,降低切换版本,统一消息的编程模型 什么是SpringCloudStream 一个构建消息驱动微服务的框架 应用程序通过inputs或者outpus来与Spring Cloud Stream中binder对象交互,通过我们配置来binding(绑定),而Spring Cloud Stream的binder对象负责与消息中间件交互,所以要搞清楚如何与Spring Cloud Stream交互就可以方便使用消息驱动的方式 通过使用Spring Integration来

我不是什么好人 293

Spring Cloud Stream 消息驱动的配置与使用

Spring Cloud Stream 消息驱动的配置与使用一、什么是 Stream 消息驱动二、Spring Cloud Stream 消息驱动的设计思想为什么用 Spring Cloud Stream 消息驱动Stream 凭什么可以统一或屏蔽底层差异?Spring Cloud Stream 消息驱动的工作流程三、快速构建消息驱动生产者、消费者(集群)1、构建消息驱动之生产者2、消息驱动之消费者3、故障1:重复消费问题(重点)Stream 消息分组(Group)解决重复消费问题4、故障2:消息错过Str

Welcome,Everyone. 3397

十五.SpringCloud极简入门-Spring Cloud Stream消息驱动

老鸟飞过,只做学习使用,欢迎交流

墨家巨子@俏如来 1337

springcloud(十二)--SpringCloud Stream消息驱动

SpringCloud Stream消息总线一、消息驱动概述1、消息驱动是什么?二、案列说明三、消息驱动之生产者四、消息驱动之消费者五、分组消费与持久化 一、消息驱动概述 官网: https://spring.io/projects/spring-cloud-stream#overview 文档: https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.1.RELEASE/reference/html/ SpringCloud

weixin_42469070的博客 227
上一篇: 服务总线——Spring Cloud Bus
下一篇: Spring Cloud Sleuth分布式链路跟踪
jf-lin
博客等级 码龄7年 37粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值