1、Spring Cloud Stream 官方函数式编程模型完全指南

Spring Cloud Stream应用与自定义RocketMQ Binder:编程模型 前言: 本文作者张天,节选自笔者与其合著的《Spring Cloud微服务架构进阶》,即将在八月出版问世。本文将其中Spring Cloud Stream应用与自定义Rocketmq Binder的内容抽取出来,主要介绍Spring Cloud Stream的相关概念,并概述相关的编程模型。 概述 Spring Cloud Stream 简介 Spring Cloud Stream 是一... 阅读详情

📘 Spring Cloud Stream 官方函数式编程模型完全指南

作者:龙茶清欢 | 更新时间:2025年10月 | 基于 Spring Cloud Stream 4.x + Spring Boot 3.x


一、什么是 Spring Cloud Stream?

Spring Cloud Stream 是 Spring Cloud 家族中用于构建基于消息驱动的微服务的框架。它提供了一套统一的编程模型,使开发者能够以声明式、无耦合的方式连接到消息中间件(如 Kafka、RabbitMQ、Kinesis 等),实现生产者(Producer) 与 消费者(Consumer) 的开发,而无需关心底层消息代理的 API 差异。

✅ 核心目标:

  • 解耦业务逻辑与消息中间件:你的业务代码不依赖 Kafka 或 RabbitMQ 的具体客户端 API。
  • 简化消息驱动微服务开发:只需关注“输入”和“输出”,框架自动处理绑定、序列化、错误处理、重试等。
  • 支持多绑定器(Binder):一套代码可无缝切换 Kafka、RabbitMQ、Azure Event Hubs 等。
  • 内置云原生特性:支持自动重试、死信队列、消费组、分区、幂等性、监控等。

⚠️ 注意:Spring Cloud Stream 3.0+ 已全面弃用基于注解的 @Input/@Output/@StreamListener 模型,推荐使用函数式编程模型(Functional Model),本文将完全基于此模型进行讲解。


二、为什么需要 Spring Cloud Stream?解决什么问题?

在微服务架构中,服务间通信方式多样:

  • HTTP/REST(同步)
  • 消息队列(异步)

异步通信的优势:

  • 解耦服务
  • 削峰填谷
  • 异步处理耗时任务
  • 事件驱动架构(EDA)的基础

但直接使用 Kafka/RabbitMQ 客户端存在以下问题:

问题说明
❌ 代码耦合业务逻辑与 Kafka Producer/Consumer 代码混杂
❌ 多中间件支持难换成 RabbitMQ 需重写大量代码
❌ 配置复杂需手动管理连接、序列化、分区、消费组等
❌ 缺乏统一监控没有统一指标暴露(如消费延迟、吞吐量)

✅ Spring Cloud Stream 的价值:

价值说明
✅ 抽象绑定使用 Supplier、Function、Consumer 接口定义输入输出,不关心底层消息系统
✅ 自动绑定框架根据配置自动创建 Topic/Queue、绑定消费者、配置序列化
✅ 多 Binder 支持仅需改配置,即可切换 Kafka ↔ RabbitMQ
✅ 内建弹性自动重试、DLQ、分区感知、并发控制
✅ 与 Spring 生态集成自动集成 Actuator、Metrics、Logging、Config、Security
✅ 函数式编程无状态、可组合、易测试、符合现代 Java 设计理念

三、何时推荐使用 Spring Cloud Stream?

✅ 推荐使用场景:

场景说明
🔁 异步事件驱动架构(EDA)如订单创建后触发库存扣减、短信通知、积分奖励
📦 微服务间解耦通信服务 A 发布事件,服务 B 订阅,无需直接调用 HTTP API
🚀 高吞吐、削峰填谷如秒杀系统中,将请求入队,异步处理,避免雪崩
🔄 数据同步与 CDC如数据库变更(Debezium) → Kafka → 微服务更新缓存
📊 日志/指标收集微服务将日志发送到 Kafka,统一由 Logstash/Fluentd 处理
🧩 事件溯源(Event Sourcing)将聚合状态变更作为事件写入流,实现可回溯的系统状态

❌ 不推荐场景:

场景原因
✖️ 同步 API 调用如用户登录后立即返回 token → 用 REST 更合适
✖️ 低延迟金融交易消息中间件有网络延迟,不适合微秒级响应
✖️ 简单单体应用引入消息系统会增加运维复杂度
✖️ 需要复杂事务一致性消息最终一致性无法替代分布式事务(如 Seata)

💡 判断标准:如果你的服务需要“发布事件”或“消费事件”,且希望不绑定具体消息中间件,那么 Spring Cloud Stream 是绝佳选择。


四、核心概念(基于函数式模型)

1. Binding(绑定)

  • 消息通道(Channel)与消息中间件的 Topic/Queue 之间的逻辑连接。
  • 由 Spring Cloud Stream 自动创建和管理。
  • 通过 application.yml 配置绑定名称。

2. Binder(绑定器)

  • 实现 Spring Cloud Stream 与具体消息中间件的适配层。
  • 官方支持:Kafka、RabbitMQ、Redis、Kinesis、AWS SNS/SQS、Google Pub/Sub 等。
  • 你只需引入对应 Binder 依赖,框架自动配置。

3. Function(函数)

✅ 官方推荐的唯一编程模型!

Spring Cloud Stream 3.0+ 推荐使用 Java 8+ 的 java.util.function 接口来定义消息处理逻辑:

接口用途示例
Supplier<T>生产者:主动发出消息Supplier<Orders> → 发送订单事件
Function<Input, Output>处理器:接收并转换消息Function<Order, Shipment> → 订单转发货单
Consumer<T>消费者:接收并处理消息Consumer<Order> → 订单到账后发短信

🚫 不再使用 @StreamListener、@Input、@Output 注解!

4. Destination(目标)

  • 消息的发布/订阅目标,如 Kafka 的 Topic、RabbitMQ 的 Exchange/Queue。
  • 在配置中通过 spring.cloud.stream.bindings.<bindingName>.destination 指定。

5. Group(消费组)

  • 多个实例订阅同一个 Topic 时,属于同一 Group 的实例只会有一个消费每条消息(负载均衡)。
  • 类似 Kafka Consumer Group。

6. Content-Type(内容类型)

  • 消息序列化格式,如 application/json、application/xml、application/octet-stream。
  • 框架自动处理 JSON 序列化(默认使用 Jackson)。

五、函数式编程模型详解(核心!)

✅ 函数式模型三大类型

1. Supplier(生产者)

用于主动推送消息到消息系统。

@Bean
public Supplier<Orders> orderSupplier() {
    return () -> {
        Orders order = new Orders(UUID.randomUUID().toString(), "iPhone 15", 9999L);
        System.out.println("➡️ 发送订单: " + order);
        return order;
    };
}

✅ 框架会自动调用这个 Supplier,周期性或事件触发(如定时器)发送消息。

2. Function(处理器)

用于接收消息 → 处理 → 输出新消息,形成流处理链。

@Bean
public Function<Order, Shipment> processOrder() {
    return order -> {
        System.out.println("📥 收到订单: " + order);
        Shipment shipment = new Shipment(order.orderId(), order.productName(), "待发货");
        System.out.println("📦 转换为发货单: " + shipment);
        return shipment;
    };
}

✅ 输入:Order → 输出:Shipment
✅ 框架自动处理输入/输出绑定,无需注解!

3. Consumer(消费者)

用于接收消息并处理,不返回值(副作用操作)。

@Bean
public Consumer<Order> consumeOrder() {
    return order -> {
        System.out.println("📩 消费订单: " + order);
        // 发送短信、更新库存、写日志等
        orderService.process(order);
    };
}

✅ 适用于“只消费不转发”的场景,如日志收集、通知发送。


六、完整实战示例:电商订单事件流

📦 场景描述:

  1. 订单服务(Producer)发布 OrderCreatedEvent
  2. 库存服务(Processor)消费订单,扣除库存,发布 InventoryUpdatedEvent
  3. 通知服务(Consumer)消费库存更新,发送短信通知

✅ 项目结构

src/main/java/com/example/streamdemo/
├── OrderServiceApplication.java
├── config/
│   └── OrderBindings.java
├── model/
│   ├── Order.java
│   ├── InventoryUpdatedEvent.java
│   └── NotificationEvent.java
└── service/
    └── OrderService.java

1. 添加依赖(Maven)

<dependencies>
    <!-- Spring Boot Web(可选,用于健康检查) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Cloud Stream 核心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-stream-kafka</artifactId>
    </dependency>

    <!-- 可选:Actuator 监控 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- 可选:Lombok 简化 POJO -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

<!-- Spring Cloud 版本管理 -->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2023.0.2</version> <!-- 对应 Spring Boot 3.2.x -->
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

💡 使用 spring-cloud-starter-stream-kafka,你将自动获得 Kafka Binder。


2. 定义数据模型(POJO)

// Order.java
package com.example.streamdemo.model;

import lombok.Data;

@Data
public class Order {
    private String orderId;
    private String productName;
    private Long price;
}
// InventoryUpdatedEvent.java
package com.example.streamdemo.model;

import lombok.Data;

@Data
public class InventoryUpdatedEvent {
    private String orderId;
    private String productName;
    private boolean success;
}
// NotificationEvent.java
package com.example.streamdemo.model;

import lombok.Data;

@Data
public class NotificationEvent {
    private String orderId;
    private String message;
}

3. 主启动类 + 函数定义(核心!)

// OrderServiceApplication.java
package com.example.streamdemo;

import com.example.streamdemo.model.InventoryUpdatedEvent;
import com.example.streamdemo.model.NotificationEvent;
import com.example.streamdemo.model.Order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;

@SpringBootApplication
public class OrderServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceApplication.class, args);
    }

    // ==================== 1. 生产者:订单创建事件 ====================
    @Bean
    public Supplier<Order> orderSupplier() {
        return () -> {
            // 模拟定时生成订单(生产环境可由 REST API 触发)
            return new Order(
                "ORD-" + System.currentTimeMillis(),
                "iPhone 15 Pro",
                9999L
            );
        };
    }

    // ==================== 2. 处理器:库存扣减 ====================
    @Bean
    public Function<Order, InventoryUpdatedEvent> inventoryProcessor() {
        return order -> {
            System.out.println("📦 处理订单库存: " + order);
            // 模拟库存扣减逻辑
            boolean success = order.price() > 0; // 简化逻辑
            return new InventoryUpdatedEvent(
                order.orderId(),
                order.productName(),
                success
            );
        };
    }

    // ==================== 3. 消费者:发送通知 ====================
    @Bean
    public Consumer<InventoryUpdatedEvent> notificationConsumer() {
        return event -> {
            if (event.success()) {
                System.out.println("📩 发送通知: 订单 " + event.orderId() + " 库存更新成功");
                // 调用短信服务、邮件服务等
            } else {
                System.out.println("⚠️ 库存更新失败,订单: " + event.orderId());
            }
        };
    }
}

4. 配置文件(application.yml)

spring:
  cloud:
    stream:
      bindings:
        # 生产者:orderSupplier-out-0 → 发送到 topic: orders-created
        orderSupplier-out-0:
          destination: orders-created
          content-type: application/json

        # 处理器:inventoryProcessor-in-0 接收 orders-created,输出到 inventory-updated
        inventoryProcessor-in-0:
          destination: orders-created
          content-type: application/json
        inventoryProcessor-out-0:
          destination: inventory-updated
          content-type: application/json

        # 消费者:notificationConsumer-in-0 接收 inventory-updated
        notificationConsumer-in-0:
          destination: inventory-updated
          content-type: application/json

      kafka:
        binder:
          brokers: localhost:9092
          configuration:
            security:
              protocol: PLAINTEXT
            # 可选:自动创建 topic
            auto.create.topics.enable: true
            key.serializer: org.apache.kafka.common.serialization.StringSerializer
            value.serializer: org.springframework.kafka.support.serializer.JsonSerializer
            key.deserializer: org.apache.kafka.common.serialization.StringDeserializer
            value.deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
            spring.json.trusted.packages: com.example.streamdemo.model

  # Kafka 服务地址
  kafka:
    bootstrap-servers: localhost:9092

# Actuator 监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    health:
      enabled: true

✅ 命名规则:

  • Supplier → 输出通道:<functionName>-out-0
  • Function → 输入:<functionName>-in-0,输出:<functionName>-out-0
  • Consumer → 输入:<functionName>-in-0

✅ content-type: application/json:启用 Jackson 自动序列化/反序列化


5. 启动与验证

  1. 启动 Kafka(使用 Docker 或本地安装)
  2. 启动 Spring Boot 应用
  3. 查看日志:
➡️ 发送订单: Order(orderId=ORD-1717832109123, productName=iPhone 15 Pro, price=9999)
📦 处理订单库存: Order(orderId=ORD-1717832109123, productName=iPhone 15 Pro, price=9999)
📦 转换为库存事件: InventoryUpdatedEvent(orderId=ORD-1717832109123, productName=iPhone 15 Pro, success=true)
📩 发送通知: 订单 ORD-1717832109123 库存更新成功
  1. 使用 Kafka 工具查看 Topic:
kafka-console-consumer.sh --bootstrap-server localhost:9092 \
  --topic orders-created \
  --from-beginning \
  --property print.key=true \
  --property key.deserializer=org.apache.kafka.common.serialization.StringDeserializer \
  --property value.deserializer=org.springframework.kafka.support.serializer.JsonDeserializer

你会看到 JSON 格式的订单消息。


七、进阶功能

✅ 1. 多个输入/输出函数

@Bean
public Function<Flux<Order>, Flux<Shipment>> batchProcessor() {
    return orders -> orders
        .filter(order -> order.price() > 1000)
        .map(order -> new Shipment(order.orderId(), order.productName(), "已发货"));
}

支持 Reactor Flux / Mono,实现响应式流处理!

✅ 2. 自定义绑定名称(避免默认命名)

spring:
  cloud:
    stream:
      function:
        definition: orderSupplier;inventoryProcessor;notificationConsumer
      bindings:
        orderSupplier-out-0:
          destination: orders.created
        inventoryProcessor-in-0:
          destination: orders.created
        inventoryProcessor-out-0:
          destination: inventory.updated
        notificationConsumer-in-0:
          destination: inventory.updated

使用 function.definition 明确声明函数链,避免歧义。

✅ 3. 消费组(Consumer Group)

spring:
  cloud:
    stream:
      bindings:
        notificationConsumer-in-0:
          destination: inventory-updated
          group: notification-service-group  # 同组实例只有一人消费

多个实例部署时,确保同一组内只消费一次。

✅ 4. 错误处理与死信队列(DLQ)

spring:
  cloud:
    stream:
      kafka:
        binder:
          configuration:
            default:
              key:
                serializer: org.apache.kafka.common.serialization.StringSerializer
              value:
                serializer: org.springframework.kafka.support.serializer.JsonSerializer
        bindings:
          inventoryProcessor-in-0:
            consumer:
              enableDlq: true
              dlqName: inventory.dlq
              autoCreateTopics: true
              maxAttempts: 3
              backOffInitialInterval: 1000
              backOffMultiplier: 2.0

消费失败 3 次后,消息进入 inventory.dlq,便于人工排查。

✅ 5. 监控与指标(Actuator)

访问:http://localhost:8080/actuator/metrics
查看指标:

  • stream.inbound.<bindingName>.messages
  • stream.outbound.<bindingName>.messages
  • stream.consumer.latency

✅ 与 Prometheus + Grafana 集成,实现可观测性。


八、函数式模型 vs 注解模型对比

特性函数式模型(推荐)注解模型(已废弃)
编程范式函数式、无状态、可组合面向对象、注解驱动
可测试性✅ 极高(纯函数)❌ 低(依赖 Spring 上下文)
多绑定支持✅ 自动识别❌ 需手动配置 @Input/@Output
性能✅ 更轻量,无代理开销❌ 有反射和监听器开销
官方支持✅ 3.0+ 主推❌ 4.0+ 完全移除
多输入/输出✅ 支持(通过函数链)❌ 复杂且易错
与 Spring Boot 3 兼容✅ 完全支持❌ 不支持

🚨 重要提醒:Spring Cloud Stream 4.0 已完全移除 @StreamListener,旧项目必须迁移!


九、最佳实践

实践说明
✅ 使用 Supplier/Function/Consumer永远不要用 @StreamListener
✅ 配置 content-type: application/json确保自动序列化
✅ 设置 group 避免重复消费生产环境必须配置
✅ 使用 enableDlq: true避免消息丢失
✅ 所有 POJO 使用 @Data 或 record(Java 17+)便于序列化
✅ 测试时使用 TestChannelBinder单元测试无需 Kafka
✅ 用 FunctionDefinition 明确声明函数链避免绑定歧义
✅ 监控指标 + 日志追踪用 Sleuth + Zipkin 做链路追踪
✅ 使用 @ConfigurationProperties 管理配置避免硬编码

十、测试示例(单元测试)

@SpringBootTest
class OrderServiceApplicationTest {

    @Autowired
    private StreamBridge streamBridge;

    @Test
    void testOrderProduced() {
        Order order = new Order("ORD-123", "MacBook", 15000L);
        streamBridge.send("orderSupplier-out-0", order);

        // 可通过监听器或 Kafka 消费验证消息是否发出
        // 推荐使用 TestChannelBinder 替代真实 Kafka
    }
}

使用 spring-cloud-stream-test-support 提供内存绑定器,无需启动 Kafka。


十一、迁移指南(从注解到函数式)

如果你有旧项目使用 @StreamListener:

// ❌ 旧方式
@StreamListener("input")
public void handle(Order order) { ... }

→ ✅ 新方式:

@Bean
public Consumer<Order> handle() {
    return order -> { ... };
}

并配置:

spring:
  cloud:
    stream:
      function:
        definition: handle
      bindings:
        handle-in-0:
          destination: input

十二、官方文档与资源

资源链接
Spring Cloud Stream 官方文档https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/
GitHub 项目https://github.com/spring-cloud/spring-cloud-stream
Spring Initializr 模板https://start.spring.io/ → 选择 “Spring Cloud Stream” + “Kafka”
Spring Boot 3 + Stream 示例https://github.com/spring-cloud/spring-cloud-stream-samples

十三、总结:你应该选择 Spring Cloud Stream 吗?

你的需求推荐选择
✅ 你正在构建事件驱动的微服务✅ 强烈推荐
✅ 你希望避免绑定 Kafka/RabbitMQ 的具体 API✅ 必选
✅ 你希望统一处理消息序列化、重试、监控✅ 必选
✅ 你使用 Spring Boot 3.x✅ 必须使用函数式模型
✅ 你团队熟悉函数式编程✅ 更易上手
❌ 你需要强一致性事务❌ 用 Saga 模式 + 分布式事务
❌ 服务间调用是同步的❌ 用 OpenFeign / WebClient

✅ 最后建议

“不要为消息而用消息,而要为解耦和弹性而用消息。”

Spring Cloud Stream 不是“消息中间件”,而是消息驱动架构的抽象层。它让你聚焦业务逻辑,而不是消息协议。

立即行动:

  1. 在你的下一个异步微服务中,用 Function<Order, Shipment> 替代 KafkaTemplate.send()
  2. 用 Consumer<PaymentEvent> 替代 @KafkaListener
  3. 配置 group + dlq
  4. 监控 actuator/metrics

你将获得:更简洁、更可测试、更可移植、更云原生的代码!


🎯 附录:函数式模型命名规范速查表

函数类型输入绑定名输出绑定名
Supplier<T>无输入<functionName>-out-0
Function<I,O><functionName>-in-0<functionName>-out-0
Consumer<T><functionName>-in-0无输出

📌 默认绑定名:函数名 + -in-0 / -out-0

EGO_Plannerv2代码学习(一):栅格建图之V1 V2的区别 最近在尝试将高飞老师的集群规划器部署到真实无人机上跑一下,开这个新帖记录下学习过程中的问题和想法。 阅读详情

相关推荐

实战指南:从零搭建ROS2 + Cartographer 2D激光SLAM系统

本文详细介绍了如何从零开始搭建ROS2与Cartographer结合的2D激光SLAM系统,涵盖环境准备、激光雷达驱动配置、Cartographer安装与参数调优等关键步骤。通过实战案例和常见问题解决方案,帮助开发者快速掌握激光雷达建图技术,提升机器人自主导航能力。

weixin_29062255的博客 401

Spring Cloud Stream函数式编程整合消息中间件

通过Spring Cloud Stream函数式编程整合消息中间件,整合RabbitMQ和KafKa,其中本篇还会介绍Spring Cloud Stream多种发送消息的用法,以及Binding的多端合流。

怪咖@的博客 3219

故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理

摘要: Oracle Exadata一体机出现磁盘故障案例,存储节点故障灯未亮但磁盘已产生大量坏块,导致重平衡失败。文章强调了一体机硬件巡检需检查6个关键维度:节点messages日志、存储cell告警日志、CellCLI日志、ASM告警日志、ILOM日志及服务器信号灯。故障分析显示硬盘物理故障导致磁盘组冗余受损,自动修复流程受阻。文中详细记录了通过CellCLI工具排查损坏磁盘的过程,并提供了完整的故障处理流程和命令输出。文章同步发布于微信公众号"IT民工的龙马人生"和博客网站(www

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 1230

spring-cloud-stream版本升级,告别旧注解@EnableBinding,拥抱函数式编程

注意:这里的函数名未demoChannel,与yml中bingdings下的in前面一段对应。注释掉的代码和下面的匿名函数lamda写法等价。官方给的例子是kafka,rabbit,没有rocketmq的例子,轻度使用的情况下用rabbit的例子适配rocketmq也是可以的。网上的文章要么介绍旧代码,要么介绍新代码,没有介绍旧代码改造到新代码的过程。注意,这里的send多了一个参数,跟配置里的bingdings下的out对应。去掉启动类上的@EnableBinding(Source.class)注解。

gsls200808的专栏 3072

Rstudio安装org.Hs.eg.db

自己也是个小白,初次安装org.Hs.eg.db碰到好多问题,步骤总结如下: 第一,instal.packages()安装,不行则换 BiocManager::install() 第二,如BiocManager不成,说明不是最新版本,可按提示安装最新版 BiocManager::install(version = '3.13') #由于R版本较新,按照提示中的相关信息,安装最新版本的 第三,再次安装 BiocManager::install("org.Hs.eg.db") 第四,之后每个人.

ZH_DDong的博客 2万+

海康视觉平台VisionMaster实战入门:从通讯配置到工具应用

本文为海康VisionMaster视觉平台实战入门指南,详细介绍了从软件安装准备、与PLC等外部设备的通讯配置,到匹配定位、测量、畸变矫正等核心工具的应用方法。通过实战案例拆解,帮助工程师快速掌握如何搭建完整的机器视觉检测与引导定位系统,实现工业自动化项目落地。

weixin_29224309的博客 1006

SpringCloud Stream 没人用?

简介SpringCloud Stream 是一个用于构建与共享消息系统连接的高度可扩展的事件驱动微服务组件。它提供了一个灵活的编程模型,基于Spring Boot 建立独立的生产级 Spring 应用程序,并使用 Spring Integration 提供与消息代理的连接可以让我们在使用时几乎无需关心具体的消息队列实现。它屏蔽底层消息中间件的差异,降低切换成本,统一消息的...

艾小仙的专栏 2198

Python与PyCharm安装配置教程:从零搭建开发环境

编程入门的第一步是搭建开发环境,而Python解释器与IDE工具的选择常让新手困惑。Python作为解释型语言,负责将代码翻译为机器指令,而PyCharm作为集成开发环境,提供代码编辑、调试与项目管理功能,两者协同工作构成高效开发基础。环境变量PATH的配置是安装过程中的关键环节,正确处理可避免“python不是内部或外部命令”的常见错误。理解pip包管理机制,则能轻松安装第三方库并管理项目依赖。从下载官方安装包到运行第一个Hello World程序,再到利用虚拟环境隔离应用依赖,这套流程适用于Window

benben 683

SpringCloud-stream一体化MQ解决方案-函数式编程

中文文档英文文档介绍:Learn标签选择对应版本说明文档→overview→Programming Model (Producing and Consuming Messages ( Spring Cloud Function support))Learn标签选择对应版本说明文档​​overview​​2.1.1 Stream函数式编程参考资料部分的二、Java8内置的四大核心函数式接口如果不会泛型的话可以参考或者参考具体原理参照上面的文档,下面只介绍怎么使用。

qq_23095607的博客 1898

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

简洁易懂的车牌号识别Python实现(含代码)1、整体思路2、代码详解 1、整体思路 2、代码详解

qq_40784418的博客 9万+

2.0 电子凸轮 西门子1500电子凸轮使用研究1

本文研究了S7-1500T电子凸轮同步控制技术,通过仿真实验得出以下结论:1)通过比例系数可调整凸轮曲线形状;2)解除同步需调用从轴其他运动指令;3)详细阐述了凸轮同步的5个实施步骤。重点分析了三种同步类型(主值距离同步、动态参数同步和直接同步)的特点及应用场景,并探讨了缩放系数、偏移量等参数对凸轮曲线的影响。同时介绍了凸轮应用模式及常见异常处理方法,为工程应用提供了重要参考。

qq_34047402的博客 808

SpringCloudStream函数式编程Demo记录

SpringCloudStream实践Demo

yang_x_b的博客 391

HX711重量传感器原理图设计,已量产(压力传感器)

最近调通了一款针对家用、物联网场景的重量传感套件,核心用了 HX711 这颗经典的称重 AD 芯片,还加了用户最需要的 “一键校准” 功能 —— 之前帮朋友做家用米桶余量报警时,用户总吐槽校准步骤太繁琐,这次的方案把操作简化到只按一个键,试下来体验好了不少。正好拆解下这套硬件的设计逻辑,供做同类产品的朋友参考。

不脱发的程序猿 365

Spring Cloud Stream 3.1.x版本,弃用@StreamListener而采用函数式编程实现RocketMQ的接入

一、背景描述 自Spring Cloud 2020版本开始,Spring Cloud Stream的版本升级至3.1.0以上版本,目前最新版本为3.1.3。 自此版本开始@StreamListener上面就增加@Deprecated注解,不赞成使用,有可能接下来的版本会删除掉。下面就介绍下以函数式编程的方式代替StreamListener的方法 二、再叨叨几句为什么? 来自Spring的博客文章(https://spring.io/blog/2019/10/17/spring-cloud-stream-fu

bufegar0的博客 7352

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Cloud Stream详解

Spring Cloud Stream是一个用于构建 与 共享消息系统 连接的高度可扩展的 事件驱动微服务。通过Stream可以很轻松的整合RabbitMQ和Kafka,并且可以在两个消息中间件之间来回切换使用。一句话,屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型。.........

怪咖@的博客 1万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

基于 Spring Cloud Stream 函数式编程模型的架构升级聊天系统

本文介绍了使用Spring Cloud Stream重构消息广播模块的实践方案。传统RabbitMQ监听方式存在业务耦合、配置繁琐等问题,而Spring Cloud Stream提供了函数式编程模型、统一接口和自动序列化等优势。升级后,可通过声明式函数(如Consumer<ChatMessage>)处理消息,简化代码并提高扩展性。配置文件中通过定义输入/输出通道实现消息绑定,支持集群部署和自动重试机制。该方案不仅降低了与特定消息中间件的耦合度,还提升了系统的测试性和可维护性。

python15397的博客 917

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring Cloud Stream 结合rocketmq

官方网址:https://github.com/alibaba/spring-cloud-alibaba/wiki/RocketMQ你可以在这个地址上下载到相关示例项目,配置项等相关信息spring-cloud-stream 文档(这个地址似乎只有集合kafaka和rabbit的示例): https://docs.spring.io/spring-cloud-stream/docs/3.2.6/reference/html/spring-cloud-stream-rocketmq文档 :https://sp

我的技术博客 3285

spring cloud stream 3.1 @StreamListener 官方不建议使用了

零、前言 这又是学习尚硅谷 spring cloud中遇到的一个坑 因为之前有一个 所以这里索引从2开始 2、spring cloud stream 3.1 @StreamListener 官方不建议使用了 在使用stream 整合rabbitMQ的时候 突然发现新版本不建议使用@Binding(Source.class) 、@StreamListener(Sink.class) 查看了 [官方文档][https://docs.spring.io/spring-cloud-stream/docs/3.1.0

qq_35799668的博客 1万+

介绍Spring Cloud Stream

Spring Cloud Stream 通过“绑定器 + 消息通道”的抽象,简化了消息驱动微服务的开发,实现了与具体消息中间件的解耦。其函数式编程模型进一步提升了代码简洁性,结合分组、分区、错误处理等特性,使其成为构建高可用、可扩展消息系统的理想选择。

青鱼入云的博客 1059

3、Spring Cloud Stream + RocketMQ 高级消息特性完全指南

Spring Cloud Stream + RocketMQ 高级消息特性指南 本文全面介绍了如何利用Spring Cloud Stream 4.x和RocketMQ Binder实现高级消息特性,包括: 核心定位:Spring Cloud Stream作为消息通道抽象层,负责统一接口、自动绑定和集成监控,但不处理具体消息协议细节。 能力边界:详细对比了RocketMQ Binder对各种消息类型的支持情况,包括普通消息、顺序消息、延时消息、事务消息等。 实战方案: 普通消息:通过StreamBridge发

python15397的博客 983

kafka+spring cloud stream 发送接收消息

kafka+spring cloud stream 发送接收消息

技术交流,一起进步 1386

Spring Cloud Stream应用模型及配置详解

Spring Cloud Stream 是一个中间件中立的框架,通过输入和输出通道与消息中间件(如 Kafka 和 RabbitMQ)进行通信。其核心模块包括 Binder(负责与消息中间件交互)、Application(封装的消息机制)、@Input 和 @Output(标识输入输出通道)等。从消息层面,应用模型可细分为 Source(发布消息)、Channel(消息通道)、Binder(与消息平台交互)和 Sink(接收消息)。以 Kafka 为例,讲解配置详情。

giser@2011的博客 1465

spring cloud stream 使用rocket笔记

趁着打算重新找工作,刚好把之前的笔记整理整理,这篇笔记是当初在使用stream 连接rocketmq时的一些笔记 当时我们用的spring cloud stream 版本是3.1,当我去向往常一样去用注解绑定通道时@EnableBinding(),我的编译器亲切的告诉我这个注解已经被废弃了?way? Enables the binding of targets annotated with Input and Output to a broker, according to the list of inte

z357904947的博客 1105

Spring Cloud Stream-编程模型

声明和绑定频道 触发绑定@EnableBinding @Input和@Output 访问绑定通道 生产和消费消息 聚合 本文介绍Spring Cloud Stream的编程模型。Spring Cloud Stream提供了许多预定义的注释,用于声明绑定的输入和输出通道以及如何收听频道。 声明和绑定频道 触发绑定@EnableBinding 您可以将Spring应用程序转换为S...

u010277958的博客 595

Spring Cloud Stream rocketmq 函数式编程实现

spring cloud stream rocketmq 函数式编程

qq_30495285的博客 1278

Spring Cloud Stream 最佳实践指南

Spring Cloud Stream 是一个用于构建消息驱动微服务的框架,它基于 Spring Boot 和 Spring Integration,提供了一套中间件无关的编程模型。核心价值:Binder 抽象:应用代码与消息中间件(Kafka / RabbitMQ / Pulsar 等)解耦函数式编程模型风格的SupplierFunctionConsumer声明式配置:通过控制绑定、分区、消费者组、并发开箱即用。

J.Anson的博客 452
上一篇: 3、Java 后端开发者必学设计模式实战手册
下一篇: 2、Spring Cloud Stream 函数式模型中 Supplier 是如何“主动推送”消息的?
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值