Spring Cloud Stream使用

Spring Cloud Stream作为事件驱动架构,它提供了对Kafka 、Rabbit的抽象封装,适用于需要 消息流管理、微服务通信 的场景。

1. 引入相关依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-kafka</artifactId>
    <version>3.1.0</version>
</dependency>
 <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
    <version>3.2.9</version>
  </dependency>

2. 配置 application.yml

  • kafka-steam流配置
yaml 复制代码
spring:
  cloud:
    stream:
      bindings:
        stream-output:
          destination: my-topic # 生产者发送的消息会发往这个主题
          contentType: application/json
        stream-input:
          destination: my-topic # 消费者从这个主题读取消息
          group: my-group      # 消费者组
          contentType: application/json
      kafka:
        binder:
          brokers: localhost:9092 # Kafka broker 地址
          autoCreateTopics: true  # 自动创建主题(如果 Kafka 上没有该主题时)
  • rabbit-steam流配置
yaml 复制代码
spring:
  cloud:
    stream:
      # 进行rabbit的相关绑定配置
      rabbit:
        bindings:
          stream-output:
            # 进行生产端端配置
            producer:
              #定义 RoutingKey 的表达式配置
              routing-key-expression: '''stream-key'''
          stream-input:
            # 进行消费端配置
            consumer:
              # 设置一个RoutingKey信息
              bindingRoutingKey: stream-key
      # 在此处配置要绑定的rabbitmq的服务信息;
      binders:
        # 表示定义的名称,用于于binding整合
        default-rabbit:
          # 消息组件类型
          type: rabbit
          # 设置rabbitmq的相关的环境配置
          environment:
            spring:
              rabbitmq:
                host: 127.0.0.1
                port: 5672
                username: guest
                password: guest
                virtual-host: /
      # 服务的整合处理
      bindings:
        # 设定通道的名称
        stream-output:
          # 设定Exchange名称定义
          destination: queue.stream.messages
          # 设定消息类型,对象类型,如果是文本则设置"text/plain"
          content-type: application/json
          # 设置要绑定的消息服务的定义名称
          binder: default-rabbit
          # 进行操作的分组,表示持久化
          group: stream-group
        # 设定通道的名称
        stream-input:
          # 设定Exchange名称定义
          destination: queue.stream.messages
          # 设定消息类型,对象类型,如果是文本则设置"text/plain"
          content-type: application/json
          # 设置要绑定的消息服务的定义名称
          binder: default-rabbit
          # 进行操作的分组,表示持久化
          group: stream-group

3. 定义生产者

通过定义一个输出通道(@Output)来实现生产者

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MessageProducer {

    @Autowired
    private StreamBridge streamBridge; // 用来发送消息
    
    //@Autowired
    //private MyProcessor myProcessor;

    @GetMapping("/send")
    public String sendMessage() {
        String message = "Hello from Spring Cloud Stream!";
        // 通过 StreamBridge 发送消息到 Kafka
        streamBridge.send("stream-output", MessageBuilder.withPayload(message).build());
		//myProcessor.output().send(MessageBuilder.withPayload(message).build());
        return "Message sent: " + message;
    }
}

4. 定义消费者

java 复制代码
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

@Component
@EnableBinding(MyProcessor.class)
//@EnableBinding(Sink.class)
public class MessageConsumer {

    // 定义消费通道并监听消息
    //@StreamListener(Sink.INPUT)
    @StreamListener(target = MyProcessor.INPUT)
    public void handleMessage(Message<String> message) {
        String receivedMessage = message.getPayload();
        System.out.println("Received message: " + receivedMessage);
    }
}

5. 定义绑定接口

java 复制代码
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.cloud.stream.annotation.Output;
import org.springframework.messaging.MessageChannel;

public interface MyProcessor {

    String OUTPUT = "stream-output";  // 生产者输出通道
    String INPUT = "stream-input";   // 消费者输入通道

    @Output(OUTPUT) 
    MessageChannel output();  // 生产者输出通道

    @Input(INPUT) 
    SubscribableChannel input();   // 消费者输入通道
}
相关推荐
Csvn5 小时前
Python 开发技巧 · logging 最佳实践 —— 告别 print,搭建工程级日志系统
后端·python
智码看视界5 小时前
Day19 Spring Boot启动优化:启动时间从8秒降到2秒
java·spring boot·后端·启动优化
IT_陈寒5 小时前
React中useEffect的依赖项把我坑惨了
前端·人工智能·后端
SQL-First布道者6 小时前
Spring JDBC Ultra 十边型战士
java·spring boot·后端·mysql·spring·mybatis
Dovis(誓平步青云)6 小时前
《精讲Spring Boot后端跑另一个端口:如何解决暴露服务器问题》
服务器·人工智能·spring boot·后端·生成对抗网络
进击的程序猿~6 小时前
Go Slice源码深度解析指南
开发语言·后端·golang
程序员爱钓鱼7 小时前
Rust 变量与不可变性:为什么默认不能修改变量?
前端·后端·rust
GoGeekBaird15 小时前
我开源了 BeeWeave,给 AI Agent 搭一个越用越懂你的知识创作台
后端·github
西门吹-禅17 小时前
java springboot N+1问题
java·开发语言·spring boot
weixin_BYSJ198718 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php