Spring Cloud Stream学习(五)入门
前言:
在了解完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
在上面的例子中,我们用到了这几个注解
- @EnableBinding(Sink.class)
- @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个概念。我们现在就这三个概念一起探讨下:
发布-订阅
Spring Cloud Stream中的消息通信方式遵循了发布-订阅模式,当一条消息被投递到消息中间件后,它会通过共享的Topic主题进行广播,消息消费者在收到消息后,会对它进行自身的业务逻辑处理,这里的Topic其实就是对应了RabbitMQ中的交换机
消费组
设想这样一种情况,我们有3台服务器,并且都部署了我们应用,并且这3台服务器都是MQ的消费者。假设我们发送了一条用户确认支付的消息,现在服务器应该做的操作是扣减库存。但是问题来了,我们之前已经知道了发布订阅模式,按照现在这种情况,3台服务器都会收到我们的消息,这样的话,扣减库存这一操作就会被执行3次,这样显然是不合理的。可能有的同学会说,我们只将一台服务器注册为MQ的消费者不就行了吗?但是这样是否又违背了高可用的原则呢?对于这种情况,MQ为我们提供了一种更有效的方法,就是消费组。
我们可以通过
spring.cloud.stream.bindings.通道名称.group=groupName
(在上面的例子就是spring.cloud.stream.bindings.input.group=groupName
)指定组名,在同一组的消费组,只会有一个实例收到消息消息分区
了解了消费组的概念后,我们已经可以做到,在多实例的情况下,可以确保我们的消息只被消费一次。但是,现在我们无法保证消息到底是被哪个消费者消费了,对于同一条消息,它多次到达之后可能是由不同的消费者消费的。但是在有些特定的情况下,我们可能想要一些具有特定特征的消息每次都被同一个消费者消费。这个时候消息生产者可以为消息增加一个固有的特征ID来进行分区,使得拥有这些ID的消息每次能被同一个消费者消费。分区概念的引入就是为了解决这样的问题的:当生产者将消息数据发送到多个消费者实例时,保证拥有共同特征的消息数据始终是由同一个消费者示例接收和处理
Spring Cloud Stream学习(五)入门的更多相关文章
- spring cloud深入学习(五)-----熔断器Hystrix
雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服务消费者” ...
- 官方文档中文版!Spring Cloud Stream 快速入门
本文内容翻译自官方文档,spring-cloud-stream docs,对 Spring Cloud Stream的应用入门介绍. 一.Spring Cloud Stream 简介 官方定义 Spr ...
- Spring Cloud (十五)Stream 入门、主要概念与自定义消息发送与接收
前言 不写随笔的日子仿佛就是什么都没有产出一般--上节说到要学Spring Cloud Bus,这里发现按照官方文档的顺序反而会更好些,因为不必去后边的章节去为当前章节去打基础,所以我们先学习Spri ...
- Spring Cloud实战之初级入门(五)— 配置中心服务化与配置实时刷新
目录 1.环境介绍 2.配置中心服务化 2.1 改造mirco-service-spring-config 2.2 改造mirco-service-provider.mirco-service-con ...
- Spring cloud stream【入门介绍】
案例代码:https://github.com/q279583842q/springcloud-e-book 在实际开发过程中,服务与服务之间通信经常会使用到消息中间件,而以往使用了哪个中间件比如 ...
- Spring Cloud Stream消息驱动之RocketMQ入门(一)
SpringCloudStream目前支持的中间件有RabbitMQ.Kafka,还有我最近在学习的RocketMQ,以下是我学习的笔记 学习Spring cloud Stream 可以先学习一下了解 ...
- 「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream
系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...
- Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)
文章大纲 一.什么是Spring Cloud Stream二.Spring Cloud Stream使用介绍三.Spring Cloud Stream使用细节四.参考文章 一.什么是Spring Cl ...
- Spring Cloud Alibaba学习笔记(14) - Spring Cloud Stream + RocketMQ实现分布式事务
发送消息 在Spring消息编程模型下,使用RocketMQ收发消息 一文中,发送消息使用的是RocketMQTemplate类. 在集成了Spring Cloud Stream之后,我们可以使用So ...
随机推荐
- Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 前面介绍了两种allure的 ...
- java的图形化界面 文本区JTextArea的程序例子
package java1; //使用时这个改成你的包名即可//文本区 JTextArea import javax.swing.*;import java.awt.*;import java ...
- 刮刮乐自定义view
说明:该代码是参考鸿洋大神的刮刮乐自定义view来写的. 实现:刮刮乐-刮奖的效果,如下效果 下面直接放代码了:只有一个自定义view,要实现真正的功能还需要进一步封装 /** * 自定义view-刮 ...
- 第八节:time和random模块
定义: 模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用. 重点: 1.模块的名字不要和自带的模块名字相同,不然会优先调用自己的那个模块,因为查找模块的时候是按照sys.pat ...
- eclipse git 文件状态 及git分支的创建与合并与删除
eclipse里面Git文件状态及图标展示 EGit会出现如下图标,其对应状态及意义如下: 1)忽略[ ignored ]:仓库认为该文件不存在(如bin目录,不需要关注).通过右键Te ...
- 实例讲解Springboot以Template方式整合Redis及序列化问题
1 简介 之前讲过如何通过Docker安装Redis,也讲了Springboot以Repository方式整合Redis,建议阅读后再看本文效果更佳: (1) Docker安装Redis并介绍漂亮的可 ...
- Java 解析 xml 常见的4中方式:DOM SAX JDOM DOM4J
Java 四种解析 XML 的特点 1.DOM 解析: 形成了树结构,有助于更好的理解.掌握,且代码容易编写. 解析过程中,树结构保存在内存中,方便修改. 2.SAX 解析: 采用事件驱动模式,对内存 ...
- audio的自动播放报错解决
使用audio标签时,当前页面没有进行交互时,比如用户刷新了页面后,play()调用就会报错,如下图 查找资料后,发现是2018年4月以后,chrome浏览器对这块进行了优化,为了节约流量,禁止了自动 ...
- think--数据库的设置
1.在项目下的Common下的Conf下的config.php 配置: 'DB_TYPE' => 'mysql', // 数据库类型 'DB_HOST' => 'localhost', / ...
- kubernetes1.30集群部署+dashboard+heapster
v2.1 1.系统配置 1.1.禁用防火墙.禁用selinux #防火墙禁用 systemctl stop firewalld systemctl disable firewalld #SELinux ...