SpringCloud Stream使用解析

SpringCloudStream

官方定义Spring Cloud Stream 是一个构建消息驱动微服务的框架。
应用通过inputs和outputs来与Spring Cloud Stream中binder对象交互。通过我们配置来binding(绑定),而Spring Cloud Stream中的binder对象负责与消息中间件交互。所以,我们只需要搞清楚如何与Spring Cloud Stream 交互就可以方便使用消息驱动的方式。
通过使用Spring Integration来连接消息代理中间件以及实现消息事件驱动。
目前仅支持RabbitMQ和kafka

下面用RabbitMQ来说明使用!

案例之消息驱动之生产者

1.建一个项目,并添加如下的依赖:

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>

2.编写下面的yml文件

server:
 port: 8801

spring:
 application:
  name: cloud-stream-provider
 rabbitmq:
  host: 192.168.43.76
  port: 5672
  username: guest
  password: guest
 cloud:
  stream:
   binders: # 在此处配置要绑定的rabbitmq的服务信息;
    defaultRabbit: # 表示定义的名称,用于于binding整合
     type: rabbit # 消息组件类型
#     environment: # 设置rabbitmq的相关的环境配置,(本机方式)
#      spring:
#       rabbitmq:
#        host: localhost
#        port: 5672
#        username: guest
#        password: guest
   bindings: # 服务的整合处理
    output: # 这个名字是一个通道的名称
     destination: studyExchange # 表示要使用的Exchange名称定义
     content-type: application/json # 设置消息类型,本次为json,文本则设置“text/plain”
     binder: defaultRabbit # 设置要绑定的消息服务的具体设置(爆红不要管)

eureka:
 client: # 客户端进行Eureka注册的配置
  service-url:
   defaultZone: http://localhost:7001/eureka
 instance:
  lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
  lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
  instance-id: send-8801.com # 在信息列表时显示主机名称
  prefer-ip-address: true   # 访问的路径变为IP地址

3.编写service,下面仅展示实现类:

import org.lzl.springcloud.service.IMessageProvider;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import javax.annotation.Resource;
import java.util.UUID;

//注意这里不需要写@Service,因为该service是跟rabbitmq打交道的
@EnableBinding(Source.class)//定义消息的推送管道
public class MessageProviderImpl implements IMessageProvider {

  @Resource
  private MessageChannel output;

  @Override
  public String send() {
    String serial = UUID.randomUUID().toString();
    output.send(MessageBuilder.withPayload(serial).build());
    System.out.println("*****serial:"+serial);
    return null;
  }
}

4.编写controller

import org.lzl.springcloud.service.IMessageProvider;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

@RestController
public class SendMessageController {
  @Resource
  private IMessageProvider messageProvider;

  @GetMapping(value = "/sendMessage")
  public String sendMessage(){
    return messageProvider.send();
  }
}

案例之消息驱动消费者

1.写pom,加上下面的依赖

	<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

2.编写yml,和生产者唯一的区别在于,下面是input

server:
 port: 8802

spring:
 application:
  name: cloud-stream-consumer
 rabbitmq:
  host: 192.168.43.76
  port: 5672
  username: guest
  password: guest
 cloud:
  stream:
   binders: # 在此处配置要绑定的rabbitmq的服务信息;
    defaultRabbit: # 表示定义的名称,用于于binding整合
     type: rabbit # 消息组件类型
#     environment: # 设置rabbitmq的相关的环境配置
#      spring:
#       rabbitmq:
#        host: localhost
#        port: 5672
#        username: guest
#        password: guest
   bindings: # 服务的整合处理
    input: # 这个名字是一个通道的名称
     destination: studyExchange # 表示要使用的Exchange名称定义
     content-type: application/json # 设置消息类型,本次为对象json,如果是文本则设置“text/plain”
     binder: defaultRabbit # 设置要绑定的消息服务的具体设置

eureka:
 client: # 客户端进行Eureka注册的配置
  service-url:
   defaultZone: http://localhost:7001/eureka
 instance:
  lease-renewal-interval-in-seconds: 2 # 设置心跳的时间间隔(默认是30秒)
  lease-expiration-duration-in-seconds: 5 # 如果现在超过了5秒的间隔(默认是90秒)
  instance-id: receive-8802.com # 在信息列表时显示主机名称
  prefer-ip-address: true   # 访问的路径变为IP地址

3.编写controller,该controller不向外界暴露端口,起到实时监控消息管道的作用!

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
  @Value("${server.port}")
  private String serverPort;

  @StreamListener(Sink.INPUT)//只要8801发送消息,8802就会接收到8801的消息
  public void input(Message<String> message){
    System.out.println("消费者1号--------》接收到的消息:"+message.getPayload()+"\t port: "+serverPort);
  }

}

测试

启动rabbitMQ和上面的两个项目,访问http://localhost:8801/sendMessage
在消费者的控制台中就会出现下面的订单流水号:

补充说明

我们打开rabbitmq的监控界面:发现默认是帮我们分组的

想要自定义分组只需要在消费者的yml文件中加上下面的一行:

如果有多个消费者,为了避免出现重复消费的问题,应将组名设置成一样的。一个组的成员轮循消费,不同组的成员进行相同的消费。

到此这篇关于SpringCloud Stream介绍的文章就介绍到这了,更多相关SpringCloud Stream介绍内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • spring-cloud-stream结合kafka使用详解

    1.pom文件导入依赖 <!-- kafka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-binder-kafka</artifactId> </dependency> 2.application.yml文件配置 spring: cloud: stream: kafka: bind

  • Spring Cloud Stream微服务消息框架原理及实例解析

    随着近些年微服务在国内的盛行,消息驱动被提到的越来越多.主要原因是系统被拆分成多个模块后,一个业务往往需要在多个服务间相互调用,不管是采用HTTP还是RPC都是同步的,不可避免快等慢的情况发生,系统性能上很容易遇到瓶颈.在这样的背景下,将业务中实时性要求不是特别高且非主干的部分放到消息队列中是很好的选择,达到了异步解耦的效果. 目前消息队列有很多优秀的中间件,目前使用较多的主要有 RabbitMQ,Kafka,RocketMQ 等,这些中间件各有优势,有的对 AMQP(应用层标准高级消息队列协议

  • Spring Cloud Stream如何实现服务之间的通讯

    Spring Cloud Stream Srping cloud Bus的底层实现就是Spring Cloud Stream,Spring Cloud Stream的目的是用于构建基于消息驱动(或事件驱动)的微服务架构.Spring Cloud Stream本身对Spring Messaging.Spring Integration.Spring Boot Actuator.Spring Boot Externalized Configuration等模块进行封装(整合)和扩展,下面我们实现两个

  • SpringCloud Stream消息驱动实例详解

    1. 消息驱动概述 1.1 是什么 在实际应用中有很多消息中间件,比如现在企业里常用的有ActiveMQ.RabbitMQ.RocketMQ.Kafka等,学习所有这些消息中间件无疑需要大量时间经历成本,那有没有一种技术,使我们不再需要关注具体的消息中间件的细节,而只需要用一种适配绑定的方式,自动的在各种消息中间件内切换呢?消息驱动就是这样的技术,它能 屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型. SpringCloud Stream是一个构件消息驱动微服务的框架.应用程序通过i

  • Spring Cloud Stream异常处理过程解析

    应用处理 当消费者在处理接收到的消息时,有可能会由于某些原因而抛出异常.若希望对抛出来的异常进行处理的话,就需要采取一些异常处理手段,异常处理的方式可分为三种:应用层面的处理.系统层面的处理以及通过RetryTemplate进行处理. 本小节先来介绍较为常用的应用层面的异常处理方式,该方式又细分为局部处理和全局处理. 局部处理 Stream相关的配置内容如下: spring: cloud: stream: rocketmq: binder: name-server: 192.168.190.12

  • Spring Cloud Stream分区分组原理图解

    消息分组 通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上.默认情况下,当生产者发出一条消息到绑定通道上,这条消息会产生多个副本被每个消费者实例接收和处理,但是有些业务场景之下,我们希望生产者产生的消息只被其中一个实例消费,这个时候我们需要为这些消费者设置消费组来实现这样的功能. 当把消费者复制一份,发现2个都能收到消息 2个消费者都加入同一个消费者 发现只有一个能收到 消息分区 有一些场

  • 详解Spring Cloud Stream使用延迟消息实现定时任务(RabbitMQ)

    我们在使用一些开源调度系统(比如:elastic-job等)的时候,对于任务的执行时间通常都是有规律性的,可能是每隔半小时执行一次,或者每天凌晨一点执行一次.然而实际业务中还存在另外一种定时任务,它可能需要一些触发条件才开始定时,比如:编写博文时候,设置2小时之后发送.对于这些开始时间不确定的定时任务,我们也可以通过Spring Cloud Stream来很好的处理. 为了实现开始时间不确定的定时任务触发,我们将引入延迟消息的使用.RabbitMQ中提供了关于延迟消息的插件,所以本文就来具体介绍

  • SpringCloud Stream使用解析

    SpringCloudStream 官方定义Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用通过inputs和outputs来与Spring Cloud Stream中binder对象交互.通过我们配置来binding(绑定),而Spring Cloud Stream中的binder对象负责与消息中间件交互.所以,我们只需要搞清楚如何与Spring Cloud Stream 交互就可以方便使用消息驱动的方式. 通过使用Spring Integration来连接消息代

  • SpringCloud Stream 整合RabbitMQ的基本步骤

    目录 一.项目介绍 二.生产者 三.消费者 四.验证 在postman 访问生产者接口: 本篇简单介绍SpringCloud Stream 整合RabbitMQ基本步骤: 引入SpringCloud 引入SpringCloud Stream相关依赖 定义绑定接口: 消息生产者(Output…Binding) .消息消费者(Input…Binding) @EnableBinding 在对应类上进行定义 @StreamListener 在对应方法上创建监听用来消费消息 调用output的send()

  • 最新SpringCloud Stream消息驱动讲解

    目录 SpringCloud Stream消息驱动 1.SpringCloud Stream概述 1.1.设计思想 1.2.标准的流程套路 1.3.编码API和常用注解 2.消息驱动之生产者(output) 2.1.新建模块cloud-stream-rabbitmq-provider8801 2.2.引入pom.xml配置文件 2.3.YAML配置文件 2.4.生产者启动类 2.5.业务实现 2.6.启动测试 3.消息驱动之消费者(input) 3.1.新建cloud-stream-rabbit

  • Springcloud Stream消息驱动工具使用介绍

    目录 springcloud Stream 什么是springcloud Stream 什么是Binder 为什么使用Stream Stream使用案例 前置知识 Stream处理消息的架构 Stream常用注解 消息生产者8801模块搭建 消息消费者8802模块搭建 Stream带来的问题 重复消费问题 自定义分组 持久化问题 springcloud Stream 什么是springcloud Stream   现在市面上有很多的消息中间件,每一个公司使用的都有所不同,为了减少学习的成本,sp

  • Springcloud整合stream,rabbitmq实现消息驱动功能

    springcloud整合stream,rabbitmq实现消息驱动功能 1.代码实现: 创建项目stream 添加依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.6.2</version> <relativePath/>

  • 深入理解JDK8中Stream使用

    概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询.也可以使用 Stream API 来并行执行操作.简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式. 特点: 不是数据结构,不会保存数据. 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中.(保留意见:毕竟peek方法可以修改流中元素)

  • Spring Cloud Stream消息驱动组件使用方法介绍

    目录 1.Stream解决的痛点问题 2.Stream重要概念 3.传统MQ模型与Stream消息驱动模型 4.Stream消息通信方式及编程模型 4.1.Stream消息通信方式 4.2.Stream编程注解 4.3.Stream消息驱动之开发生产者端 4.4.Stream消息驱动之开发消费者端 5.Stream高级之自定义消息通道 6.Stream高级之消息分组 MQ:消息队列/消息中间件/消息代理,产品有很多,ActiveMQ RabbitMQ RocketMQ Kafka 1.Strea

  • .Net Core实现第三方QQ扫码登录

    目录 效果展示: 核心实现 展示二维码 解析扫码结果 登录视图 登录授权 配置Cookie认证策略 创建用户登录标识 用户退出登录 代码开源 效果展示: 核心实现 展示二维码 public static (Stream, string) GetLoginQrCode() { var uri = new Uri(QrCodeUrl); var request = new HttpRequestMessage(HttpMethod.Get, uri); var cookieContainer = n

  • SpringCloud turbine监控实现过程解析

    这篇文章主要介绍了SpringCloud turbine监控实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w

随机推荐