系列文章(更新ing):

「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现

「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制

「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

「 从0到1学习微服务SpringCloud 」05消费者Fegin

「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config

「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

简介

官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架。

简单来说,它就是用来与消息中间件进行交互的,我们不需要直接对消息中间件进行操作,而是通过Spring Cloud Stream,从而简化了对中间件的操作,并进行了解耦(想要更换消息中间件时,无需更改代码)。

应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互,而  Spring Cloud Stream 的 binder 负责与中间件交互。

所以,我们只需要搞清楚如何与  Spring Cloud Stream 交互就可以方便使用消息驱动的方式。最大的好处莫过于对中间件的再次封装,可以做到代码层面对消息中间件的无感知,甚至于动态的切换中间件。

目前Stream只提供了RabiitMq和Kafka的binder,若要使用其他的消息中间件,需要自己自定义binder。

基本使用

消费者

1.新建一个项目, micro-service1用于接收消息,作为eureka client,增加mq,stream-mq的maven,修改相关配置等不再累述,与之前一样

2.定义一个接口,将input绑定名为"input"的消息通道

public interface Receiver {
//消息通道名称
String INPUT = "input"; //绑定可订阅的通道
@Input(INPUT)
SubscribableChannel input();
}

3.定义Stream接收类

@Component
//@EnableBinding注解可以接收一个或多个接口类作为对象
// 声明绑定的消息通到,实现与消息代理的连接
@EnableBinding(Receiver.class)
@Log4j2
public class StreamReceiver { //监听binding的input
@StreamListener(Receiver.INPUT)
//message为接收到信息消息
public void input(Message<String> message){
log.info("StreamReceiver: {}", message.getPayload());
}
}

启动,默认是会创建一个临时队列,临时队列绑定的exchange为 “input”

所有发送 exchange 为“input” 的MQ消息都会被投递到这个临时队列,并通过上述方法接收。

以上代码就完成了最基本的消费者部分。

生产者

1.新建一个项目, micro-service2用于发送消息,具体步骤步骤累述

2.定义一个接口,将output绑定名为"input"的消息通道

public interface Sender {
//消息通道名称
String OUTPUT = "input"; @Output(OUTPUT)
MessageChannel output();
}

3.定义Stream发送类Controller

@RestController
@EnableBinding(Sender.class)
@Log4j2
public class SendController {
@Autowired
@Qualifier(Sender.OUTPUT)
MessageChannel output; @GetMapping("send")
public void send(){
String message = "Hello! I am Stream Message!";
log.info("发送Stream消息: {}",message);
output.send(MessageBuilder.withPayload(message).build());
}
}

以上代码就完成了最基本的消费者部分。

启动后,调用/send接口,可看到收发消息成功的日志

消息分组

当消费者集群部署时,它们当中应当只有一个能接受到消息。但按照现在的配置,每个消费者都能收到消息,我们来看看。

1.启动两个micro-service1,设置不同接口

2.调用/send接口,两个应用均能收到消息

显然这是不合理,这里就需要用到消息分组

3.在micro-service1应用中添加Stream分组配置

cloud:
stream:
bindings:
#为input消息通道添加分组
input:
group: testGroup

4.启动两个micro-service1,调用/send接口。现在,发送一条信息,只能在其中一个应用中接收到消息,两个应用轮训接收。

Spring Cloud Stream的简单使用讲解就到这里了,下期再见啦~

如果觉得不错,分享给你的朋友!

THANDKS

  • End -

一个立志成大腿而每天努力奋斗的年轻人

伴学习伴成长,成长之路你并不孤单!

「 从0到1学习微服务SpringCloud 」08 构建消息驱动微服务的框架 Spring Cloud Stream的更多相关文章

  1. Spring Cloud Alibaba学习笔记(12) - 使用Spring Cloud Stream 构建消息驱动微服务

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

  2. 使用 Spring Cloud Stream 构建消息驱动微服务

    相关源码: spring cloud demo 微服务的目的: 松耦合 事件驱动的优势:高度解耦 Spring Cloud Stream 的几个概念 Spring Cloud Stream is a ...

  3. 「 从0到1学习微服务SpringCloud 」10 服务网关Zuul

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  4. 「 从0到1学习微服务SpringCloud 」09 补充篇-maven父子模块项目

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config 「 从0到1学习微服务SpringCloud 」07 RabbitM ...

  5. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

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

  6. 「 从0到1学习微服务SpringCloud 」06 统一配置中心Spring Cloud Config

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

  7. 「 从0到1学习微服务SpringCloud 」05服务消费者Fegin

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

  8. 「 从0到1学习微服务SpringCloud 」04服务消费者Ribbon+RestTemplate

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

  9. 「 从0到1学习微服务SpringCloud 」03 Eureka的自我保护机制

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

随机推荐

  1. vue 插件大全

    UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和WeUI的组件库 mint-ui - Vue 2的移动UI元素 iview - 基于 Vuejs 的开 ...

  2. dotnet 通过 WMI 获取指定进程的输入命令行

    本文告诉大家如何使用 WMI 通过 Process 获取这个进程传入的命令行 使用下面代码,使用 Win32_Process 拿到所有的进程,通过 WHERE 判断当前的进程,然后拿到进程传入的命令 ...

  3. Windows 服务安装与卸载 (通过 installutil.exe)

    1. 安装 安装 .NET Framework ; 新建文本文件,重命名为 ServiceInstall.bat,将 ServiceInstall.bat 的内容替换为: C:\\Windows\\M ...

  4. HDU1556 Color the ball & 牛客 contest 135-I 区间 [差分标记]

    一.差分标记介绍 差分标记用来解决针对区间(修改-查询)的问题,复杂度比线段树要更低.推荐这个博客. 例如,给数组中处于某个区间的数进行加减操作,然后查询某个位置上数的变化值. 二.HDU1556 C ...

  5. centos7搭建hadoop2.10伪分布模式

    1.准备一台Vmware虚拟机,添加hdfs用户及用户组,配置网络见 https://www.cnblogs.com/qixing/p/11396835.html 在root用户下 添加hdfs用户, ...

  6. 个人项目之数独的生成与数独残局求解——C语言实现

    点击获取项目文件 1.对项目的分析与初步计划: 起初拿到这个项目是非常懵逼的,因为涉及到很多个人的知识盲区,诸如:C语言文件的操作.命令行参数.Code Quality Analysis工具.性能分析 ...

  7. 0018 CSS注释(简单)

    CSS注释规则: /* 需要注释的内容 */ 进行注释的,即在需要注释的内容前使用 "/*" 标记开始注释,在内容的结尾使用 "*/"结束. 例如: p { / ...

  8. CodeForces - 1228D

    乍一看,嗯,图论题,不错: 结果,这尼玛是模拟???? 传送链接:https://codeforces.com/contest/1228/problem/D 看了大佬的代码瞬间就明白了许多!!! #i ...

  9. windows 服务的安装、启动、状态查询、停止操作c++实现

    具体的自己看看代码 粘贴复制即可使用 卸载也很简单自己查看MSDN 加上就是 #ifndef __SERVICEMANAGE_H__ #define __SERVICEMANAGE_H__ #incl ...

  10. IDEA模板快捷键

    2.1 psvm:可生成 main 方法 2.2 sout:System.out.println() 快捷输出 类似的: soutp=System.out.println("方法形参名 = ...