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




总结

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

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

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

相关推荐
小郎君6582 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·spring cloud
jktantan2 天前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
胡写代码4 天前
把数据库连接搬进配置中心,服务起不来:spring.config.import 的 4 个必填项
spring cloud·微服务
SL_staff5 天前
私有化低代码不是减配版开发:JVS双模式建模如何重建IT交付信任
java·低代码·spring cloud
SL_staff6 天前
JVS-APS的7个刚性约束设计:从无限产能幻觉到可执行排产的工程实践
java·spring cloud·全栈
逃逸线LOF6 天前
Ribbon负载均衡原理(Irule组件、源码分析)
后端·spring cloud·ribbon
code_slave(码畜)7 天前
微服务架构落地:慢 SQL 治理与连接池调优 —— 守住数据库的最后一道防线
数据库·spring boot·sql·spring cloud·微服务·架构
2501_933923258 天前
SpringCloud:OpenFeign快速实现
java·后端·spring cloud·openfeign
逃逸线LOF8 天前
为什么需要Actuator进行静态检查
spring cloud·eureka
水无痕simon9 天前
3、工程重构
java·spring cloud·重构