前言:

​ 在了解完RabbitMQ后,再来学习SpringCloudStream就轻松很多了,SpringCloudStream现在主要支持两种消息中间件,一个是RabbitMQ,还有一个是KafKa,我这里只会介绍RabbitMQ相关的内容


概述:

​ Spring Cloud Stream是一个为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot来创建独立的,可用于生产的Spring应用程序。它通过使用Spring Integration来连接消息代理中间件以实现消息时间驱动。Spring Cloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,并且引入了发布-订阅,消费组,以及分区这个3个概念(后文会详细介绍)。简单来说,Spring Cloud Stream本质上就是整合了Spring Boot 跟 Spring Integration。实现了一套轻量级的消息驱动的微服务框架。

入门案例:

​ 我这里直接用官网的例子:

@SpringBootApplication
@EnableBinding(Sink.class)
public class LoggingConsumerApplication { public static void main(String[] args) {
SpringApplication.run(LoggingConsumerApplication.class, args);
} @StreamListener(Sink.INPUT)
public void handle(Person person) {
System.out.println("Received: " + person);
} public static class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}
}

​ pom文件

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-test-support</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

我们不需要做其他任务的配置,启动服务,可以在日志中看到如下的输出:

​ 我们可以看到,红线框出的部分代表了,我们申明了一个队列,队列名称为input.anonymous.xxxx,并将其绑定到了名为input的交换机上

​ 我们可以到RabbitMQ的管理后台查看以验证我们的结论:

我们查看队列也可以发现:



我们启动程序后,相当于做为一个消费者一直在监听这个队列,我们现在可以尝试直接用MQ后台往这个队列中publish一条消息

可以看到程序输出如下:

receive: hello,spring cloud stream

在上面的例子中,我们用到了这几个注解

  1. @EnableBinding(Sink.class)
  2. @StreamListener(Sink.INPUT)

还有这个类:

public interface Sink {
String INPUT = "input"; @Input(Sink.INPUT)
SubscribableChannel input();
}

我们现在一一介绍下:

@EnableBinding 注解,该注解用来指定一个或多个定义了@input,@output注解的接口,以此来实现对消息通道(Channel)的绑定。在上面的例子中,我们通过@EnableBinding(Sink.class),绑定了Sink接口,该接口是Spring Cloud Stream默认实现的对输入消息通道绑定的定义。

@StreamListener(Sink.INPUT),这个注解主要的作用是将被修饰的方法注册为消息中间件上数据流的事件监听器.注册中的属性值对应了监听的消息通道名。在上面的例子中,我们通过这个注解将receive方法注册为input消息通道的监听处理器,所以当我们在RabbitMQ的控制页面中发送消息时,receive方法会做出对应的响应动作

​ 经过上面的入门案例后,我们对Spring Cloud Stream算是有了一些基础的了解,现在我们继续深入的学习下Spring Cloud Stream,官网中Spring Cloud Stream的应用模型如下(红字是我对这个模型图的理解):

我们之前讲了,Spring Cloud Stream引入了发布-订阅,消费者组,分区这个3个概念。我们现在就这三个概念一起探讨下:

  1. 发布-订阅

    Spring Cloud Stream中的消息通信方式遵循了发布-订阅模式,当一条消息被投递到消息中间件后,它会通过共享的Topic主题进行广播,消息消费者在收到消息后,会对它进行自身的业务逻辑处理,这里的Topic其实就是对应了RabbitMQ中的交换机

  2. 消费组

    设想这样一种情况,我们有3台服务器,并且都部署了我们应用,并且这3台服务器都是MQ的消费者。假设我们发送了一条用户确认支付的消息,现在服务器应该做的操作是扣减库存。但是问题来了,我们之前已经知道了发布订阅模式,按照现在这种情况,3台服务器都会收到我们的消息,这样的话,扣减库存这一操作就会被执行3次,这样显然是不合理的。可能有的同学会说,我们只将一台服务器注册为MQ的消费者不就行了吗?但是这样是否又违背了高可用的原则呢?对于这种情况,MQ为我们提供了一种更有效的方法,就是消费组。

    我们可以通过spring.cloud.stream.bindings.通道名称.group=groupName(在上面的例子就是spring.cloud.stream.bindings.input.group=groupName)指定组名,在同一组的消费组,只会有一个实例收到消息

  3. 消息分区

    了解了消费组的概念后,我们已经可以做到,在多实例的情况下,可以确保我们的消息只被消费一次。但是,现在我们无法保证消息到底是被哪个消费者消费了,对于同一条消息,它多次到达之后可能是由不同的消费者消费的。但是在有些特定的情况下,我们可能想要一些具有特定特征的消息每次都被同一个消费者消费。这个时候消息生产者可以为消息增加一个固有的特征ID来进行分区,使得拥有这些ID的消息每次能被同一个消费者消费。分区概念的引入就是为了解决这样的问题的:当生产者将消息数据发送到多个消费者实例时,保证拥有共同特征的消息数据始终是由同一个消费者示例接收和处理

Spring Cloud Stream学习(五)入门的更多相关文章

  1. spring cloud深入学习(五)-----熔断器Hystrix

    雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者” ...

  2. 官方文档中文版!Spring Cloud Stream 快速入门

    本文内容翻译自官方文档,spring-cloud-stream docs,对 Spring Cloud Stream的应用入门介绍. 一.Spring Cloud Stream 简介 官方定义 Spr ...

  3. Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收

    前言 不写随笔的日子仿佛就是什么都没有产出一般--上节说到要学Spring Cloud Bus,这里发现按照官方文档的顺序反而会更好些,因为不必去后边的章节去为当前章节去打基础,所以我们先学习Spri ...

  4. Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新

    目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...

  5. Spring cloud stream【入门介绍】

    案例代码:https://github.com/q279583842q/springcloud-e-book   在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了哪个中间件比如 ...

  6. Spring Cloud Stream消息驱动之RocketMQ入门(一)

    SpringCloudStream目前支持的中间件有RabbitMQ.Kafka,还有我最近在学习的RocketMQ,以下是我学习的笔记 学习Spring cloud Stream 可以先学习一下了解 ...

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

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

  8. Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)

    文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...

  9. Spring Cloud Alibaba学习笔记(14) - Spring Cloud Stream + RocketMQ实现分布式事务

    发送消息 在Spring消息编程模型下,使用RocketMQ收发消息 一文中,发送消息使用的是RocketMQTemplate类. 在集成了Spring Cloud Stream之后,我们可以使用So ...

随机推荐

  1. 简单网络编程如何用python来实现

    对于网络编程,通信模式是后台必备技能,先用最基础代码实现,理解一些 API 的含义,在深入学习. 总是有读者问过我关于 Python 后台开发相关,如果想走 Python 后台方向,对于 Python ...

  2. H - Knight Moves DFS

    A friend of you is doing research on the Traveling Knight Problem (TKP) where you are to find the sh ...

  3. 《Spring In Action》阅读笔记之装配bean

    Spring主要装配机制 1.在XML中进行显式配置 2.在Java中进行显式配置 3.隐式的的bean发现机制和自动装配 自动化装配bean Spring从两个角度来实现自动化装配 1.组件扫描:S ...

  4. 从零开始学习docker之docker的安装

    一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...

  5. 前端以BASE64码的形式上传图片

    前端以BASE64码的形式上传图片 一直有一个很苦恼的问题困扰着铁柱兄,每次上传图片的时候前端要写一大堆js,然后后台也要写一堆java代码做处理.于是就在想,有没有简单又方便的方法把图片上传.今天算 ...

  6. Spring基于注解@Required配置

    基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...

  7. 一篇文章让你彻底弄懂SSL/TLS协议

    目录 SSL/TLS的应用 TLS协议的架构 握手协议 主密码和预备主密码 TLS记录协议 一篇文章让你彻底弄懂SSL/TLS协议 SSL/TLS是一种密码通信框架,他是世界上使用最广泛的密码通信方法 ...

  8. oracle获取表字段及表注释的相关操作

    一.获取表字段: select * from user_tab_columns where Table_Name='用户表' user_tab_columns 为当前用户的columns,除此之外还有 ...

  9. Navicat premium15安装破解教程

    Navicat premium15安装破解教程 注意:安装之前请卸载干净navicat,不要覆盖安装 1.去官网下载Navicat premium15的安装包 官网地址:https://www.nav ...

  10. 基于java的OpenCV安装和配置

    目录 OpenCV简介 OpenCV下载安装 eclipse里引用jar包和配置 OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Window ...