前言:

​ 在了解完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. Sentry实时应用错误跟踪系统在Kubernetes中私有化部署

    应用错误跟踪系统:对软件系统运行过程中产生的错误日志进行收集从而实现监控告警. 虽然软件错误❌是不可避免的,但是可以降低错误数. 提高对错误的治理能力能让错误带来的损失降到最低 ​

  2. ASE课程总结 by 冯晓云

    开始的开始,采访往届ASE班的blog:http://www.cnblogs.com/legs/p/4894362.html 和北航软工M1检查:http://www.cnblogs.com/legs ...

  3. 学习JVM参数前必须了解的

    JVM参数是什么 大家照相通常使用手机就够用了,但是针对发烧友来说会使用更专业的设备,比如单反相机,在单反里有好几个模式,P/A/S/M,其中P是傻瓜模式,程序会自动根据环境设置快门速度和光圈大小,以 ...

  4. pomelo环境配置(windows环境)

    目录 简介 准备 安装 工程的创建 简介 1.网易开源,免费,业(diao)界(si)良(fu)心(li)呀,^.^ 2.游戏服务器框架(当然也可以用于web服务器) 3.高性能.高可伸缩.分布式,多 ...

  5. vue2.x学习笔记(十一)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12586416.html. 表单的输入绑定 表单的输入绑定是一块很重要的内容,因为所有的业务系统都离不开基础表单的录 ...

  6. layui table渲染和数据处理

    最近在用layui开发管理系统,果然是"累"ui 实现功能:将之前选择的选项勾选,渲染备注信息(原数据为空的列) <table class="layui-hide& ...

  7. Java中集合的嵌套

    集合的嵌套遍历 获取10个1-20之间的随机数,要求不能重复 键盘录入多个数据,以0结束,要求在控制台输出这多个数据的最大值. public static void main(String[] arg ...

  8. jeecg ant design vue一级菜单跳到外部页面——例如跳到百度

    需求:点击首页跳到百度新打开的页面 找到SideMenu.vue   对应的inde.js找到renderMenuItem 函数.加一个判断 if(menu.meta.url=='https://ww ...

  9. HashMap源码解析JDK8

    一.HashMap基础 1.1 HashMap的定义 我们先看一下HashMap的定义: public class HashMap<K,V> extends AbstractMap< ...

  10. 构建密钥验证ssh

    1.需要两个虚拟机,每一个创建一个用户登录到用户根下   2.每个用户都要创建密钥对   3.把两个用户的公用密钥用ssh-copy-id -i 命令将公用的密钥复制到另一个用户中   4.在客户端开 ...