【第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. 控制台




总结

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

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

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

相关推荐
全栈开发圈2 小时前
新书速览|从零开始学Spring Cloud微服务架构
spring cloud·微服务·架构
sniper_fandc2 小时前
Spring Cloud系列—Seata分布式事务解决方案AT模式
spring cloud·seata
七夜zippoe2 小时前
Spring Cloud与Dubbo架构哲学对决
java·spring cloud·架构·dubbo·配置中心
SmartBrain3 小时前
AI智能体:MCP模型上下文管理设计及实现
人工智能·spring cloud·架构
Slow菜鸟5 小时前
Spring Cloud 教程(四) | OpenFeign 的作用
后端·spring·spring cloud
却话巴山夜雨时i7 小时前
互联网大厂Java面试:从Spring到微服务
spring cloud·微服务·oauth2·java面试·stream api
鬼先生_sir1 天前
SpringCloud-Sentinel(熔断降级 & 流量控制)
spring·spring cloud·sentinel
木子欢儿2 天前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
Devin~Y2 天前
高并发电商与AI智能客服场景下的Java面试实战:从Spring Boot到RAG与向量数据库落地
java·spring boot·redis·elasticsearch·spring cloud·kafka·rag
鬼先生_sir2 天前
Spring Cloud 微服务监控实战:SkyWalking + Prometheus+Grafana 全栈解决方案
运维·spring cloud·grafana·prometheus·skywalking