【序列晋升】13 Spring Cloud Bus微服务架构中的消息总线

Spring Cloud Bus作为微服务架构中的关键组件,通过消息代理实现分布式系统中各节点的事件广播与状态同步,解决了传统微服务架构中配置刷新效率低下、系统级事件传播复杂等问题。它本质上是一个轻量级的事件总线,将Spring Boot Actuator的端点功能扩展到分布式环境中,使开发者能够通过统一的接口管理微服务集群的配置更新和状态变化。本文将从定义、背景、架构设计、解决的问题、关键特性、与同类产品的对比以及实际使用方法等方面,全面解析Spring Cloud Bus的技术原理与实践应用。

一、什么是Spring Cloud Bus?

Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于在微服务架构中实现消息总线功能。它通过整合Java的事件处理机制和消息中间件(如RabbitMQ、Kafka)的特性,将分布式系统的节点与轻量级消息系统连接起来,形成一个统一的消息广播通道。当某个微服务发生状态变化(如配置更新)或需要传递特定事件时,Spring Cloud Bus会将这些信息通过消息中间件广播到所有订阅该主题的服务节点,实现全局状态同步。

在微服务架构中,传统的配置管理方式通常需要逐个服务发送刷新指令,这在服务数量较多时变得效率低下且难以维护。Spring Cloud Bus通过消息代理的发布-订阅模型,简化了这一过程,只需向消息总线发送一次刷新请求,即可触发所有相关服务的配置更新 ,无需重启服务即可实现动态配置。这种机制不仅提高了系统的灵活性,还降低了运维复杂度。

二、Spring Cloud Bus的诞生背景

Spring Cloud Bus的诞生源于微服务架构演进过程中对分布式系统状态同步全局事件管理的需求。在单体应用中,配置更新或状态变化只需在单一实例内处理,但在微服务架构中,随着服务数量的增加和实例的动态扩展,如何高效地管理这些变化成为了一个挑战。

微服务架构的普及带来了以下问题:

  1. 配置管理困难:传统的配置方式需要在每个服务实例上单独更新,效率低下且容易出错。
  2. 事件传播复杂:系统级事件(如缓存失效、服务状态变更)需要手动通知每个服务实例,增加了耦合度。
  3. 状态同步不一致:微服务实例分布在不同节点上,难以保证配置或状态的实时同步。

Spring Cloud Bus应运而生,旨在解决这些微服务通信中的痛点 。它最初作为Spring Cloud Config的补充组件出现,通过消息代理的广播机制,使配置更新能够自动传播到所有微服务实例,无需逐个操作。随着微服务架构的成熟,Spring Cloud Bus的应用场景也扩展到了更广泛的系统事件管理领域。

三、Spring Cloud Bus的架构设计

Spring Cloud Bus的架构设计基于事件驱动消息代理两个核心概念,其整体架构可分为以下几个层次:

1. 消息中间件层

消息中间件是Spring Cloud Bus的基础,负责消息的传输与路由。目前支持的实现包括:

  • RabbitMQ:通过AMQP协议实现消息的可靠传输,支持持久化、确认机制等特性。
  • Kafka:通过发布-订阅模型实现高吞吐量的消息传播,适合大规模分布式系统。

消息中间件层负责消息的存储、传输和路由,确保事件能够被正确地广播到所有订阅的服务。

2. Spring Cloud Bus核心层

核心层负责将Spring Boot Actuator的端点功能扩展到分布式环境。它通过消息代理将本地事件转化为分布式事件,实现跨节点的状态同步。核心组件包括:

  • AbstractBusEndpoint:抽象基类,用于实现消息总线端点。
  • RefreshBusEndpoint:具体实现类,负责处理配置刷新事件。
  • EnvironmentBusEndpoint:处理环境变量变更的端点。

核心层将Spring的事件模型与消息代理的特性结合,使开发者能够以熟悉的方式操作分布式系统。

3. Spring Boot Actuator层

Actuator层提供了HTTP接口,用于触发和管理配置刷新等操作。Spring Cloud Bus通过扩展Actuator的端点功能,实现了分布式环境下的统一管理。关键端点包括:

  • /bus/refresh:触发所有订阅服务的配置刷新。
  • /bus/env:发送键值对更新,修改每个节点的Spring环境。
4. 微服务节点层

微服务节点层是Spring Cloud Bus的最终消费者,负责处理接收到的事件。每个节点都需要配置消息代理连接信息,并启用事件监听机制。

架构示意图如下:

+-------------------+      +-------------------+      +-------------------+
|   Microservice A  |      |   Microservice B  |      |   Microservice C  |
| (监听消息总线)    |      | (监听消息总线)    |      | (监听消息总线)    |
+-------------------+      +-------------------+      +-------------------+|                               |v                               v
+-------------------+      +-------------------+      +-------------------+
|   消息中间件      |      |   消息中间件      |      |   消息中间件      |
| (如RabbitMQ/Kafka)|      | (如RabbitMQ/Kafka)|      | (如RabbitMQ/Kafka)|
+-------------------+      +-------------------+      +-------------------+|                               |v                               v
+-------------------+      +-------------------+      +-------------------+
|   Config Server   |      |   Bus Client A    |      |   Bus Client B    |
| (触发配置刷新)    |      | (发布自定义事件)  |      | (处理接收到事件)  |
+-------------------+      +-------------------+      +-------------------+

这种分层架构使得Spring Cloud Bus能够灵活地与不同消息中间件集成,同时保持与Spring Boot生态的兼容性。

四、Spring Cloud Bus解决的问题

Spring Cloud Bus主要解决以下问题:

1. 配置动态刷新

在微服务架构中,配置通常分散在多个服务实例中。传统方式需要逐个服务发送刷新指令,效率低下且容易遗漏 。Spring Cloud Bus通过消息代理的广播机制,使配置更新能够自动传播到所有订阅的服务,大大简化了配置管理流程。

2. 事件传播与状态同步

微服务之间需要传递系统级事件(如缓存失效、服务状态变更)以保持一致性。手动实现这些事件传播会增加系统的耦合度和复杂性。Spring Cloud Bus提供了一个统一的事件广播通道,使开发者能够以声明式的方式处理分布式事件。

3. 服务管理与监控

Spring Cloud Bus可以作为微服务集群的管理通道,用于触发服务重启、配置重载等操作。通过消息代理的广播机制,可以实现对整个集群的统一管理,简化运维流程。

4. 解耦服务通信

在微服务架构中,服务之间的直接通信会增加耦合度。Spring Cloud Bus通过消息代理的中介作用,使服务之间通过事件进行间接通信,降低系统的耦合度和复杂性。

五、Spring Cloud Bus的关键特性

Spring Cloud Bus具备以下关键特性:

1. 轻量级事件广播

Spring Cloud Bus基于Spring事件模型,提供轻量级的事件广播机制,无需复杂的消息路由规则即可实现服务间的状态同步。它通过消息代理的发布-订阅模型,将本地事件转化为分布式事件,实现跨节点的状态传播。

2. 与Spring Cloud Config无缝集成

Spring Cloud Bus是Spring Cloud Config的理想补充 ,解决了配置中心的动态刷新问题。当配置中心的配置发生变化时,Bus可以自动将变更广播到所有订阅的服务,实现配置的实时更新。

3. 支持多种消息中间件

Spring Cloud Bus支持多种消息中间件,包括RabbitMQ和Kafka。这种灵活性使得开发者可以根据实际需求选择最适合的消息代理 ,同时保持一致的编程模型。

4. 精准寻址与广播控制

通过destination参数,Spring Cloud Bus可以实现精准寻址,指定特定服务或实例接收事件。例如,destination=serviceA:**可以广播到所有serviceA实例,而destination=serviceA:8080则只发送到指定端口的实例。这种机制提供了灵活的事件传播控制。

5. 自定义消息转换器

Spring Cloud Bus支持通过实现MessageConverter接口扩展消息格式,默认使用JSON格式,但可以自定义为其他格式(如Properties) ,满足不同场景的需求。

6. 消息追踪与调试

通过配置spring.cloud bus.trace.enabled=true,可以启用消息追踪功能,记录消息的发送、接收和处理过程 ,便于调试和监控分布式系统中的事件传播。

六、Spring Cloud Bus与同类产品的对比

Spring Cloud Bus与Spring Cloud Stream是Spring Cloud生态中两个重要的消息处理组件,它们在设计目标和使用场景上有显著区别:

特性Spring Cloud BusSpring Cloud Stream
核心定位系统级广播(配置刷新、管理指令)业务级消息处理(订单事件、数据流)
依赖组件Actuator端点(如/bus/refreshBinder抽象层(支持Kafka/RabbitMQ等)
消息格式默认JSON,支持自定义扩展(如Properties)支持多种格式(JSON、Avro等),依赖Binder实现
路由控制通过destination参数实现精准寻址通过@StreamListener绑定通道,无内置广播机制
典型用例全局配置更新、服务状态同步订单处理、日志收集、事件驱动业务逻辑
集成复杂度简单,主要依赖自动配置和端点触发较高,需定义消息通道和绑定逻辑
消息可靠性基于消息代理的可靠性保证(如持久化、确认机制)支持消息持久化、重试等高级特性,可靠性更高

Spring Cloud Bus专注于系统级事件的广播,如配置更新、服务状态变更等,通常与Spring Boot Actuator和Spring Cloud Config结合使用。而Spring Cloud Stream则专注于业务级消息的生产与消费,提供更丰富的消息处理功能,如分区、消费组、消息持久化等。

除了Spring Cloud Stream外,Spring Cloud Bus还可以与Spring Cloud Function结合使用,实现更灵活的事件处理逻辑。但总体而言,Spring Cloud Bus在Spring Cloud生态中没有直接的竞品,它填补了微服务架构中系统级事件广播的空白。

七、Spring Cloud Bus的使用方法

1. 环境准备

在使用Spring Cloud Bus之前,需要确保以下环境已就绪:

  • 消息中间件:安装并配置RabbitMQ或Kafka。本文以RabbitMQ为例。
  • Spring Cloud Config:配置中心服务已部署并运行。
  • Spring Boot版本:Spring Boot 3.4.0+(Spring Cloud Bus 4.0.0要求) 。
2. 配置Spring Cloud Bus

在Spring Boot项目中,添加以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml中配置RabbitMQ连接信息和Bus相关设置:

server:port: 8080spring:application:name: config-clientindex: ${随机唯一值}  # 确保每个实例的applicationContext ID唯一rabbitmq:host: localhostport: 5672username: guestpassword: guestvirtual-host: /  # 如果使用非默认虚拟主机,需指定cloud:bus:enabled: truetrace:enabled: true  # 启用消息追踪config:uri: http://localhost:8888  # Config Server地址failFast: trueretry:initial-interval: 1000max-interval: 10000max-attempts: 5multiplier: 1.0
3. 配置刷新

要实现配置的动态刷新,需要在微服务中使用@RefreshScope注解标记需要刷新的Bean:

@RefreshScope
@RestController
public class ConfigController {@Value("${test foo}")private String testFoo;@GetMapping("/test")public String getTestFoo() {return testFoo;}
}

然后,可以通过以下方式触发配置刷新:

  • 向Config Server发送请求
curl -X POST http://localhost:8888/actuator/bus-refresh
  • 向微服务实例发送请求
curl -X POST http://localhost:8080/actuator/bus-refresh

无论向哪个端点发送请求,配置更新都会通过消息总线广播到所有订阅的服务

4. 自定义事件广播

Spring Cloud Bus不仅限于配置刷新,还可以用于广播自定义事件。以下是实现自定义事件广播的步骤:

  • 定义自定义事件
public class MyCustomEvent extends ApplicationEvent {private final String message;public MyCustomEvent(Object source, String message) {super(source);this.message = message;}public StringgetMessage() {return message;}
}
  • 创建事件发布者
@Component
public class EventPublisher {@Autowiredprivate ApplicationEventPublisher eventPublisher;public void publishEvent(String message) {eventPublisher.publishEvent(new MyCustomEvent(this, message));}
}
  • 创建事件监听器
@Component
public class EventListener {@EventListenerpublic void handleEvent(MyCustomEvent event) {System.out.println("Received event: " + event.getMessage());}
}
  • 通过HTTP接口触发事件
curl -X POST http://localhost:8080/actuator/bus事件
5. 高级配置

Spring Cloud Bus还支持一些高级配置,以满足不同场景的需求:

  • 消息持久化(RabbitMQ):
spring:rabbitmq:publisher-确认: true  # 启用消息确认机制delivery-mode: persistent  # 设置消息持久化
  • 消息追踪
spring:cloud:bus:trace:enabled: trueheaders: correlationId,destination
  • 安全性配置(RabbitMQ):
spring:rabbitmq:host: localhostport: 5672username: adminpassword: passwordvirtual-host: /my_vhost  # 限制访问特定虚拟主机
  • Kafka配置
spring:cloud:bus:enabled: truekafka:bootstrap-servers: localhost:9092topic: springCloudBussecurity:enabled: trueprotocol: SASL_SSLsasl:mechanism: PLAINusername: adminpassword: password

八、最佳实践与注意事项

1. 版本兼容性

Spring Cloud Bus的版本与Spring Boot和Spring Cloud整体版本密切相关。确保使用兼容的版本组合 ,避免因版本不匹配导致的功能异常。例如:

  • Spring Cloud Bus 4.0.0要求Spring Boot 3.4.0+和Java 17+ 。
  • Spring Cloud Alibaba 2021版本与Spring Cloud 2024.x不兼容,需等待新版本适配 。
2. 消息中间件选择

根据系统规模和性能需求选择合适的消息中间件:

  • RabbitMQ:适合中小规模系统,配置简单,支持消息持久化和确认机制。
  • Kafka:适合大规模系统,高吞吐量,但配置相对复杂。
3. 安全配置

在生产环境中,必须配置消息中间件的安全性,防止未授权访问和消息泄露:

  • RabbitMQ:创建独立用户,限制其虚拟主机访问权限,启用SSL加密。
  • Kafka:配置ACL权限控制,启用SSL加密,设置合适的分区和副本数。
4. 性能调优

根据系统负载和消息量进行性能调优:

  • 消息持久化:确保重要事件能够可靠传输,避免因网络故障导致消息丢失。
  • 消息确认机制:启用消息确认机制,确保消息被正确接收和处理。
  • 分区策略:对于Kafka,根据消息类型设置合适的分区策略,提高吞吐量。
  • QoS设置:对于RabbitMQ,设置合适的QoS参数,控制消息消费速率。
5. 监控与日志

配置完善的监控和日志系统,及时发现和处理消息总线中的问题

  • 启用消息追踪功能,记录消息的发送、接收和处理过程。
  • 集成Spring Cloud Sleuth,实现分布式链路追踪。
  • 配置完善的日志系统,记录消息处理的详细信息。

九、总结与展望

Spring Cloud Bus作为微服务架构中的消息总线组件,通过消息代理实现分布式系统中各节点的事件广播与状态同步,解决了传统微服务架构中配置刷新效率低下、系统级事件传播复杂等问题。它与Spring Cloud Config的无缝集成,使配置管理变得更加高效和灵活;与Spring Boot Actuator的结合,提供了统一的系统管理接口。

随着微服务架构的不断发展和云原生技术的普及,Spring Cloud Bus的应用场景也在不断扩展。未来,随着消息中间件技术的演进和Spring Cloud生态的完善,Spring Cloud Bus可能会支持更多类型的消息代理,提供更丰富的事件处理功能,更好地满足分布式系统的通信需求。

对于开发者而言,掌握Spring Cloud Bus的使用方法,能够提高微服务架构的灵活性和可维护性 ,简化配置管理和系统级事件传播的实现。同时,结合Spring Cloud Stream等其他组件,可以构建更加完善的分布式消息处理系统,满足业务发展的各种需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94175.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[激光原理与应用-314]:光学设计 - 光学系统设计与电子电路设计的相似或相同点

光学系统设计与电子电路设计虽分属不同工程领域&#xff0c;但在设计理念、方法论和工程实践中存在诸多相似或相同点。这些共性源于两者均需解决复杂系统的优化问题&#xff0c;并遵循工程设计的通用规律。以下是具体分析&#xff1a;一、设计流程的相似性需求分析与规格定义光…

Linux学习:信号的保存

目录1. 进程的异常终止与core dump标志位1.1 进程终止的方式1.2 core方案的作用与使用方式2. 信号的保存2.1 信号的阻塞2.2 操作系统中的sigset_t信号集类型2.3 进程PCB中修改block表的系统调用接口2.4 信号阻塞的相关问题验证1. 进程的异常终止与core dump标志位 1.1 进程终止…

数据分析编程第二步: 最简单的数据分析尝试

2.1 数据介绍有某公司的销售数据表 sales.csv 如下:第一行是标题&#xff0c;解释每一列存了什么东西。第二行开始每一行是一条数据&#xff0c;对应一个订单。这种数据有个专业的术语&#xff0c;叫结构化数据。这是现代数据处理中最常见的数据类型。整个表格的数据统称为一个…

UDP报文的数据结构

主要内容参照https://doc.embedfire.com/net/lwip/zh/latest/doc/chapter14/chapter14.html#id6&#xff0c;整理出来自用。 1. UDP 报文首部结构体&#xff08;udp_hdr&#xff09; 为清晰定义 UDP 报文首部的各个字段&#xff0c;LwIP 设计了udp_hdr结构体&#xff0c;其包含…

图论与最短路学习笔记

图论与最短路在数学建模中的应用 一、图论模型图 G(V,E)G(V,E)G(V,E) VVV&#xff1a;顶点集合EEE&#xff1a;边集合每条边 (u,v)(u,v)(u,v) 赋予权值 w(u,v)w(u,v)w(u,v)&#xff0c;可用 邻接矩阵 或 邻接表 表示。二、最短路问题的数学形式 目标&#xff1a;寻找从源点 sss…

第九节 Spring 基于构造函数的依赖注入

当容器调用带有一组参数的类构造函数时&#xff0c;基于构造函数的 DI 就完成了&#xff0c;其中每个参数代表一个对其他类的依赖。接下来&#xff0c;我们将通过示例来理解 Spring 基于构造函数的依赖注入。示例&#xff1a;下面的例子显示了一个类 TextEditor&#xff0c;只能…

【数据库】PostgreSQL详解:企业级关系型数据库

文章目录什么是PostgreSQL&#xff1f;核心特性1. 标准兼容性2. 扩展性3. 高级功能4. 可靠性数据类型1. 基本数据类型2. 高级数据类型基本操作1. 数据库操作2. 表操作3. 数据操作高级查询1. 连接查询2. 子查询3. 窗口函数JSON操作1. JSON数据类型2. JSON查询3. JSON索引全文搜索…

FFMPEG相关解密,打水印,合并,推流,

1&#xff1a;ffmepg进行打水印解密 前提ffmepg安装利用静态版就可以这个什么都有&#xff0c;不用再配置其他信息&#xff1a;&#xff08;这个利用ffmpeg终端命令是没问题的&#xff0c;但是如果要是再C中调用ffmpeg库那么还需要从新编译安装下&#xff09; 各个版本 Inde…

MySql知识梳理之DML语句

注意: 插入数据时&#xff0c;指定的字段顺序需要与值的顺序是一一对应的。 字符串和日期型数据应该包含在引号中。 插入的数据大小&#xff0c;应该在字段的规定范围内注意:修改语句的条件可以有&#xff0c;也可以没有&#xff0c;如果没有条件&#xff0c;则会修改整张表的所…

GaussDB GaussDB 数据库架构师修炼(十八)SQL引擎-SQL执行流程

1 SQL执行流程查询解析&#xff1a;词法分析、语法分析、 语义分析 查询重写&#xff1a;视图和规则展开、基于规则的查询优化 计划生成&#xff1a;路径搜索和枚举、选出最优执行计划 查询执行&#xff1a;基于优化器生成的物理执行计划对数据进行获取和计算2 解析器和优化器S…

grpc 1.45.2 在ubuntu中的编译

要在 Ubuntu 上编译 gRPC 1.45.2&#xff0c;需要按照以下步骤操作。以下指南基于 gRPC 官方文档和相关资源&#xff0c;确保环境配置正确并成功编译。请确保你有管理员权限&#xff08;sudo&#xff09;以安装依赖项和执行相关命令。 1. 准备环境 确保你的 Ubuntu 系统已安装…

lesson45:Linux基础入门指南:从内核到实践操作全解析

目录 一、Linux简介与核心概念 1.1 Linux的起源与发展 1.2 内核与发行版的关系 二、Linux内核版本解析 2.1 内核版本命名规则 2.2 2025年主流内核版本 三、主流Linux发行版对比 3.1 桌面用户首选 Ubuntu 24.04 LTS Linux Mint 22 3.2 技术爱好者之选 Fedora 41 Ar…

PCL点云库入门(第24讲)——PCL库点云特征之NARF特征描述 Normal Aligned Radial Feature(NARF)

一、算法原理 1、NARF 特征概述 NARF(Normal Aligned Radial Feature)是 2011 年由 Bastian Steder 等人在论文 《Point Feature Extraction on 3D Range Scans Taking into Account Object Boundaries》中提出的一种 稀疏局部 3D 特征描述子。 核心目标是提取具有“边界意…

使用 eventpp 构建跨 RT-Thread 与 ARM-Linux 的轻量级 Active Object(AO)事件驱动框架

0. 引言 本文展示一个实践路径&#xff1a;以轻量级 C 事件库 eventpp 为核心&#xff0c;设计并实现一个面向嵌入式的、可移植的 Active Object&#xff08;AO&#xff09;事件驱动架构。该架构满足以下目标&#xff1a; 跨平台兼容&#xff1a;单套代码在 RT-Thread&#xff…

【python实用小脚本-193】Python全能PDF小助手:剪切/合并/旋转/加密一条龙——再也不用开会员

Python全能PDF小助手&#xff1a;剪切/合并/旋转/加密一条龙——再也不用开会员 PDF编辑, 本地处理, 零会员费, 多功能脚本, 瑞士军刀 故事开场&#xff1a;一把瑞士军刀救了周五下班的你 周五 17:55&#xff0c;老板甩来一堆 PDF&#xff1a; “把第 3、7 页删掉”“再和合同合…

Ubuntu根分区扩容

目录 1.先查看/dev/sda 整块磁盘设备的分区占用情况&#xff1a; 2.在VMware中编辑虚拟机&#xff1a; 3.进入虚拟机&#xff0c;进入disk应用程序&#xff1a; 4.扩容文件系统 5.最后通过df-h lsblk或通过可视化GParted进行验证。 1.先查看/dev/sda 整块磁盘设备的分区占…

智慧城市SaaS平台/市政设施运行监测系统之空气质量监测系统、VOC气体监测系统、污水水质监测系统及环卫车辆定位调度系统架构内容

1. 空气质量监测系统1) 监测点管理 a) 监测点基本信息 支持记录空气质量监测点的名称、位置、类型、设备配置等信息。 b) 监测点分布地图 支持通过GIS地图展示监测点的分布情况&#xff0c;支持地图查询和导航。 2) 空气质量监测 a) 实时数据采集 支持实时采集空气质量数据&…

PiscCode迅速集成YOLO-Pose 实现姿态关键点轨迹跟踪应用

在计算机视觉领域&#xff0c;人体姿态检测与轨迹跟踪是很多应用场景的核心技术&#xff0c;例如运动分析、行为识别、智能监控等。本文将介绍如何在 PiscCode 平台上&#xff0c;利用 YOLO-Pose 模型进行姿态估计&#xff0c;并实现多人关键点轨迹跟踪。 一、什么是 PiscCode …

HTTP的状态码有哪些,并用例子说明一下

问题HTTP的状态码有哪些&#xff0c;并用例子说明一下我的回答HTTP状态码是服务器对客户端请求的响应码&#xff0c;它们按照不同的功能被分为五大类。我来介绍一下主要的状态码及其实际应用场景&#xff1a;1xx&#xff08;信息性状态码&#xff09;&#xff1a;表示请求已接收…

【51单片机】【protues仿真】基于51单片机宠物投食器系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示当前时间 2、按键设置时间&#xff0c;5个定时投喂时间​ 3、可以通过手动按键进行投喂食物 4、步进电机模拟投喂食物 二、使用步骤 基于51单片机的宠物自动投…