【第37章】Spring Cloud之Spring Cloud Stream分布式消息队列

文章目录

  • 前言
  • 一、准备
    • [1. 专业术语](#1. 专业术语)
    • [2. 版本关系](#2. 版本关系)
    • [3. 引入依赖](#3. 引入依赖)
  • 二、核心服务
    • [1. 生产者](#1. 生产者)
      • [1.1 生产者配置](#1.1 生产者配置)
      • [1.2 核心代码](#1.2 核心代码)
    • [2. 消费者](#2. 消费者)
      • [2.1 消费者配置](#2.1 消费者配置)
      • [2.2 核心代码](#2.2 核心代码)
  • 三、单元测试
    • [1. 请求](#1. 请求)
    • [2. 结果](#2. 结果)
    • [3. 控制台](#3. 控制台)
  • 总结

前言

Spring Cloud Stream是一个框架,用于构建与共享消息传递系统连接的高度可扩展的事件驱动微服务。

入门篇请参考java中使用rabbitmq

接下来我们模拟场景:中秋节,商家给消费者发放大礼包,消费者凭收到信息提示核对中秋大礼包。


一、准备

1. 专业术语

  • 目的地绑定器(Binders):负责提供与外部消息系统集成的组件。

  • 目标绑定(Bindings):外部消息传递系统和最终用户提供的应用程序代码(生产者/消费者)之间的桥梁。

  • 消息(Message):生产者和消费者用于与目的地绑定器(以及通过外部消息系统与其他应用程序)通信的规范数据结构。

2. 版本关系

Spring Cloud Stream Spring Cloud Spring Boot
4.0.x 2022.0.x aka Kilburn 3.0.x
3.2.x 2021.0.x aka Jubilee 2.6.x, 2.7.x (Starting with 2021.0.3 of Spring Cloud)
3.1.x 2020.0.x aka Ilford 2.4.x, 2.5.x (Starting with 2020.0.3 of Spring Cloud)

3. 引入依赖

我们这里直接使用spring-cloud的starter

java 复制代码
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-stream-rabbit -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

二、核心服务

后端服务我们分为生产者(商家)和消费者(客户)

1. 生产者

1.1 生产者配置

yaml 复制代码
spring:
  application:
    name: provider-service
  rabbitmq:
    host: 192.168.145.128
    port: 5672
    username: guest
    password: guest
    virtualHost: cloud
  cloud:
    stream:
      binders:
        rabbit1:
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: 192.168.145.128
                port: 5672
                username: guest
                password: guest
                vhost: cloud
      bindings:
        send-out-0:
          destination: zhongqiu
          binder: rabbit1

1.2 核心代码

java 复制代码
package org.example.nacos.provider.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Create by zjg on 2024/9/17
 */
@RestController
@RequestMapping("/producer")
public class ProducerController {
    private final Logger logger = LoggerFactory.getLogger(TestController.class);
    @Autowired
    private StreamBridge streamBridge;
    @RequestMapping("/send")
    public String send(@RequestParam("number") int number,@RequestParam("message") String message){
        logger.debug("本次发放"+number+"中秋大礼包");
        AtomicInteger count = new AtomicInteger(0);
        for (int i = 0; i < number; i++) {
            streamBridge.send("send-out-0",count.incrementAndGet()+" "+message);
        }
        return "SUCCESS";
    }
}

2. 消费者

2.1 消费者配置

yaml 复制代码
spring:
  application:
    name: consumer-service
  rabbitmq:
    host: 192.168.145.128
    port: 5672
    username: guest
    password: guest
    virtualHost: cloud
  cloud:
    stream:
      binders:
        rabbit1:
          type: rabbit
          environment:
            spring:
              rabbitmq:
                host: 192.168.145.128
                port: 5672
                username: guest
                password: guest
                vhost: cloud
      bindings:
        receive-in-0:
          destination: zhongqiu
          binder: rabbit1
          group: custom
      function:
        definition: receive;

2.2 核心代码

java 复制代码
package org.example.nacos.consumer.amqp;

import org.example.nacos.consumer.controller.TestController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.function.Consumer;

/**
 * Create by zjg on 2024/9/17
 */
@Configuration
public class RabbitMQConsumer {
    private final Logger logger = LoggerFactory.getLogger(TestController.class);

    @Value("${server.port}")
    private int port;

    @Bean
    public Consumer<String> receive() {
        return s -> logger.info(port+":Data received..." + s);
    }
}

三、单元测试

1. 请求

2. 结果

生产者

bash 复制代码
2024-09-17 17:43:34.762 [TID: N/A] DEBUG 11124 [provider-service] [nio-9001-exec-5] o.e.n.p.controller.TestController       :23 : 本次发放10中秋大礼包

消费者

bash 复制代码
2024-09-17 17:49:53.160 [TID:N/A]  INFO 12756 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9003:Data received...2 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.257 [TID:N/A]  INFO 12756 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9003:Data received...4 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.260 [TID:N/A]  INFO 12756 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9003:Data received...6 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.262 [TID:N/A]  INFO 12756 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9003:Data received...9 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。

2024-09-17 17:49:53.159 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...1 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.161 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...3 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.258 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...5 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.260 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...7 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.262 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...8 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。
2024-09-17 17:49:53.264 [TID: N/A]  INFO 12436 [consumer-service] [ongqiu.custom-1] o.e.n.c.controller.TestController       :23 : 9004:Data received...10 花好月圆,阖家欢乐,恭喜您获得中秋月饼大礼包一份。

3. 控制台




总结

回到顶部
官方网站
官方文档
项目源码
官方案例

在这里祝大家,中秋快乐,阖家幸福,万事如意!

写了有一年了,我记得发布出去了,不晓得为啥在草稿箱,补发。

相关推荐
阿拉斯攀登26 分钟前
Spring Cloud Gateway 的内置路由过滤器使用
spring cloud·微服务·gateway
摇滚侠5 小时前
2025最新 SpringCloud 教程,Nacos-配置中心-数据隔离-动态切换环境,笔记18
java·笔记·spring cloud
q***06296 小时前
springcloud-eureka与gateway简易搭建
spring cloud·eureka·gateway
摇滚侠7 小时前
2025最新 SpringCloud 教程,Nacos-注册中心 @LoadBalanced 注解式负载均衡,笔记11
笔记·spring cloud·负载均衡
努力发光的程序员7 小时前
互联网大厂Java面试场景:微服务与Spring Cloud技术点解析
spring cloud·grafana·prometheus·微服务架构·jwt·api网关·jaeger
草原印象7 小时前
Spring Cloud、Spring Cloud Alibaba微服务实战
spring·spring cloud·微服务
摇滚侠18 小时前
2025最新 SpringCloud 教程,负载均衡 API 测试,笔记10
笔记·spring cloud·负载均衡
百***618719 小时前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel
Li_7695321 天前
10分钟快速入手Spring Cloud Config
java·spring·spring cloud
q***71851 天前
Java进阶-SpringCloud设计模式-工厂模式的设计与详解
java·spring cloud·设计模式