Stream 简介

Spring Cloud Stream 是用于构建消息驱动的微服务应用程序的框架,提供了多种中间件的合理配置

Spring Cloud Stream 包含以下核心概念:

  • Destination Binders:目标绑定器,目标指的是 Kafka 或者 RabbitMQ,绑定器就是封装了目标中间件的包,如果操作的是 Kafka,就使用 Kafka Binder,如果操作的是 RabbitMQ,就使用 RabbitMO Binder
  • Bindings:外部消息传递系统和应用程序之间的桥梁,提供消息的“生产者”和“消费者”(由目标绑定器创建)
  • Message:一种规范化的数据结构,生产者和消费者基于这个数据结构通过外部消息系统与目标绑定器和其他应用程序通信

应用程序通过 inputs 或者 outpus 与 Spring Cloud Stream 的 Binder 交互,Binder 层负责和中间件的通信,通过配置来 binding。通过定义 Binder 作为中间层,实现了应用程序与消息中间件细节之间的隔离,应用程序不需要再考虑各种不同的消息中间件实现。当需要升级消息中间件或是更换其他消息中间件产品时,只需要更换对应的 Binder 绑定器

Stream 整合 kafka

以 Kafka 为例,确保安装 Kafka 并启动

分别创建生产者和消费者项目,分别添加依赖

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

1. 创建生产者

开发 MqSource 接口

public interface MqSource {

    @Output("test-topic")
MessageChannel testTopic(); @Output("test-topic-2")
MessageChannel testTopic2();
}

通过 @Output@Input 注解定义消息输入和输出通道的名称定义,输出通道需要返回 MessageChannel 接口对象,它定义了向消息通道发送消息的方法。默认情况下,通道的名称就是注解的方法的名称,也能自己定义通道名称,只需要给 @Input@Output 注解传入 String 类型参数通道名称即可,这里指定两个通道分别为 test-topictest-topic-2

开发 MsgProducer 类

@Slf4j
@EnableBinding(MqSource.class)
public class MsgProducer { @Autowired
private MqSource mqSource; public void sendTestTopicMessage(String msg) {
try {
mqSource.testTopic().send(MessageBuilder.withPayload(msg).build());
} catch (Exception e) {
log.error("sendTestTopicMessage error", e);
}
} public void sendTestTopic2Message(String msg) {
try {
mqSource.testTopic2().send(MessageBuilder.withPayload(msg).build());
} catch (Exception e) {
log.error("sendTestTopic2Message error", e);
}
}
}

使用 @EnableBinding 创建和绑定通道,绑定通道是指将通道和 Binder 进行绑定,比如 Kafka、RabbiMQ 等。如果类路径下只有一种 Binder,那么 Spring Cloud Stream 会找到并绑定它,不需要进行配置。如果有多个就需要明确配置

调用 MqSource 接口方法获取输出通道对象,接着调用 send 方法发送数据。send 方法接收一个 Message 对象,这个对象不能直接新建,需要使用 MessageBuilder 获取

2. 创建消费者

public interface MqSink {

    @Input("test-topic")
MessageChannel testTopic(); @Input("test-topic-2")
MessageChannel testTopic2();
}

与生产者的 MqSource 同理

开发 MsgReceiver 类,@StreamLisiener 接收的参数是要处理的通道名,所注解的方法就是处理从通道获取数据的方法,方法的参数就是获取到的数据

@Slf4j
@EnableBinding(MqSink.class)
public class MsgReceiver { @StreamListener("test-topic")
public void testTopicMessageListen(String msg) {
log.info("testTopicMessageListen: {}", msg);
} @StreamListener("test-topic-2")
public void testTopic2MessageListen(String msg) {
log.info("testTopic2MessageListen: {}", msg);
}
}

消息驱动 —— SpringCloud Stream的更多相关文章

  1. SpringCloud Stream 消息驱动

    1.什么是消息驱动 SpringCloud Stream消息驱动可以简化开发人员对消息中间件的使用复杂度,让系统开发人员更多尽力专注与核心业务逻辑的开发.SpringCloud Stream基于Spr ...

  2. SpringCloud Stream消息驱动

    简单搭建,没有技术含量,Demo可用 1.介绍 ①产生原因 RabbitMQ.RocketMQ.Kafka.ActiveMQ 在一个项目中,可能存在多种不同的MQ,在不同的MQ中,切换维护开发都很麻烦 ...

  3. SpringCloud之Spring Cloud Stream:消息驱动

    Spring Cloud Stream 是一个构建消息驱动微服务的框架,该框架在Spring Boot的基础上整合了Spring Integrationg来连接消息代理中间件(RabbitMQ, Ka ...

  4. 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  5. SpringCloud学习之Stream消息驱动【自定义通道】(十一)

    如果不清楚本篇内容的,请务必先去看完上一篇再看本篇,否则阅读起来可能会有部分障碍和困难: 上一篇文章<SpringCloud学习之Stream消息驱动[默认通道](十)>我们简单用自定义通 ...

  6. SpringCloud学习之Stream消息驱动【默认通道】(十)

    在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了中间件比如RabbitMQ,那么该中间件和系统的耦合性就会非常高,如果我们要替换为Kafka那么变动会比较大,这时我们可以使用S ...

  7. 九. SpringCloud Stream消息驱动

    1. 消息驱动概述 1.1 是什么 在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ.RabbitMQ.RocketMQ.Kafka等,学习所有这些消息中间件无疑需要大量时间经历成 ...

  8. SpringCloud(七)Stream消息驱动

    Stream消息驱动 概述 屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型 官网:https://cloud.spring.io/spring-cloud-static/spring-cl ...

  9. SpringCloud实战9-Stream消息驱动

    官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...

  10. 第十章 消息驱动的微服务: Spring Cloud Stream

    Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架. 它可以基于Spring Boot 来创建独立的. 可用于生产的 Spring 应用程序. 它通过使用 Sprin ...

随机推荐

  1. java固定窗口大小

    this.setResizable(false);//////frame.setResizable(false)

  2. AcWing 168. 生日蛋糕

    原题链接:AcWing 168. 生日蛋糕 设当前体积是\(v,h.r\)分别记录每层的高度和半径,由于整个蛋糕的上表面面积等于最大蛋糕的圆面积,所以枚举到最大一层的时候直接加上即可. 优化搜索顺序: ...

  3. Ubuntu 20.04 挂载 NTFS 硬盘 / 格式化并挂载 EXT4 硬盘

    创建挂载目录 mkdir /mnt/hdd 此目录在最后一步中用得到. 确定要挂载的硬盘 fdisk -l 由于我们要挂载的是 NTFS 硬盘,根据上面的信息,可以确定 /dev/sda1 是我们要挂 ...

  4. 如何配置CentOS 7网络

    不久之前在配置CentOS 7网络,记录一下操作过程. CentOS 7,你可以按照以下步骤配置网络: 打开终端,输入命令查看本台服务器的IP信息. ip a 输入命令查看网关. ip r 输入命令查 ...

  5. 【结对作业】 第一周 | 学习体会day05

    实现了单条地铁线路的直达 进行了页面的优化,实现了侧边栏功能 并且对第二天(今天)的任务进行了规划.

  6. 从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍

    大家好,我是蓝胖子,最近在做一些elasticsearch 慢查询优化的事情,通常用分析elasticsearch 慢查询的时候可以通过profile api 去分析,分析结果显示的底层lucene在 ...

  7. [CF1641D] Two Arrays

    题目描述 Sam changed his school and on the first biology lesson he got a very interesting task about gen ...

  8. 当一名阿里P9是什么样的体验?

    今天斗胆来跟大家分享一下作为一位阿里的P9是什么样的体验? 首先还是简单给大家介绍一下阿里的p9是属于一个什么样的层级?阿里p9中文名称叫做资深技术专家,一般大概带的团队有从几十人到一两百号人不等,具 ...

  9. 从零玩转Docker之docker-compose-azdocker-compose

    title: 从零玩转Docker之docker-compose date: 2023-04-04 17:39:40.699 updated: 2023-04-04 17:52:15.329 url: ...

  10. 一文带你深入理解K8s-Pod的意义和原理

    本文分享自华为云社区<深入理解K8s-Pod的意义和原理>,作者:breakDawn. 在Kubernetes概念中,有以下五种概念: 容器container:镜像管理的最小单位 生产任务 ...