当前位置: 首页 > article >正文

202521 | 远程调用 | 注册中心

远程调用

1. 核心方案全景图
远程调用方式
同步调用
异步调用
HTTP REST
gRPC
Dubbo
消息队列
事件驱动
2. 详细对比表(Java实现视角)
对比维度Spring Cloud OpenFeigngRPC-JavaApache DubboSpring Kafka
协议HTTP/1.1 (文本JSON)HTTP/2 (二进制Protobuf)自定义协议 (二进制)自定义协议 (二进制)
开发方式声明式接口 (@FeignClient)代码生成 (.proto文件)接口+注解 (@DubboService)注解驱动 (@KafkaListener)
性能中等 (~3k QPS)极高 (~18k QPS)高 (~15k QPS)高 (~12k QPS)
连接方式短连接 (每次请求新建)长连接 (多路复用)长连接持久化连接
服务发现集成Nacos/Eureka需额外集成注册中心内置注册中心支持无服务发现
Java生态支持完美集成Spring生态需手动配置Stub阿里系生态整合Spring原生支持
适用场景业务服务间常规调用高性能内部通信企业级RPC调用异步事件/日志收集
调试难度低 (Postman直接测试)中 (需grpcurl工具)中 (需Telnet调试)高 (需Kafka Tool辅助)
3. 性能关键指标(基于Java实现)
方案序列化速度网络开销吞吐量(QPS)平均延迟
OpenFeign (JSON)1x3,20050ms
gRPC (Protobuf)5x18,5008ms
Dubbo (Hessian2)3x15,00012ms
Kafka (Binary)4x12,00015ms
4. 选型决策树
极高
一般
需要跨语言?
选gRPC
性能要求?
选Dubbo/gRPC
选OpenFeign
是否异步?
选Kafka
5. Java开发者特别注意事项
  1. OpenFeign调优

    # application.yml优化示例
    feign:client:config:default:connectTimeout: 2000  # 连接超时(ms)readTimeout: 5000     # 读取超时(ms)loggerLevel: basic    # 日志级别
    
  2. gRPC资源释放

    // 必须手动关闭通道
    ManagedChannel channel = ManagedChannelBuilder.forTarget("service").build();
    try {stub = ServiceGrpc.newBlockingStub(channel);// 调用逻辑...
    } finally {channel.shutdown().awaitTermination(5, SECONDS);
    }
    
  3. Dubbo注解配置

    @DubboReference(version = "1.0.0", timeout = 3000)
    private OrderService orderService;
    
  4. Kafka消费组管理

    @KafkaListener(topics = "orders",groupId = "payment-group",concurrency = "3"  // 并发消费者数
    )
    public void processOrder(OrderEvent event) {}
    
6. 混合架构建议
HTTP REST
gRPC
OpenFeign
Dubbo
Kafka
Web前端
API网关
订单服务
用户服务
库存服务
审计服务

黄金法则

  • 对外API用HTTP REST(兼容性优先)
  • 内部服务用gRPC/Dubbo(性能优先)
  • 最终一致性用Kafka(可靠性优先)
  • 千万级QPS考虑RSocket(反应式流)

注册中心原理

一、核心架构模型
注册/心跳
订阅/拉取
调用
主动推送
服务提供者
注册中心
服务消费者
二、核心工作机制
  1. 服务注册(Service Registration)

    // Spring Cloud服务注册示例(自动触发)
    @SpringBootApplication
    @EnableDiscoveryClient // 关键注解
    public class PaymentApplication {public static void main(String[] args) {SpringApplication.run(PaymentApplication.class, args);}
    }
    
    • 注册流程
      1. 服务启动时向注册中心发送元数据(IP、端口、健康状态)
      2. 注册中心存储服务信息(内存/持久化存储)
      3. 返回注册成功响应
  2. 心跳保活(Heartbeat)

    # Nacos心跳配置示例
    spring:cloud:nacos:discovery:heart-beat-interval: 5000 # 心跳间隔(ms)heart-beat-timeout: 15000 # 超时时间
    
    • 定时发送心跳包(通常5-30秒)
    • 超过阈值未收到心跳则标记服务不可用
  3. 服务发现(Service Discovery)

    // OpenFeign动态发现示例
    @FeignClient(name = "inventory-service")
    public interface InventoryClient {@GetMapping("/stock/{sku}")Integer getStock(@PathVariable String sku);
    }
    
    • 发现模式
      • 客户端发现:消费者主动拉取列表(如Eureka)
      • 服务端发现:通过负载均衡器路由(如Nginx+Consul)
  4. 健康检查(Health Check)

    注册中心 服务实例 消费者 TCP/HTTP健康检查 返回状态码200 过滤掉不健康实例 注册中心 服务实例 消费者
三、数据一致性实现
注册中心类型一致性协议特点
NacosAP模式(Distro)
CP模式(Raft)
支持模式切换
ZookeeperZAB协议强一致(CP),写性能较低
Eureka自研协议最终一致(AP),高可用
ConsulRaft协议强一致,支持多数据中心
四、Java生态实现原理
  1. Nacos注册流程

    // NacosServiceRegistry核心逻辑
    public void register(Registration registration) {namingService.registerInstance(registration.getServiceId(), registration.getHost(), registration.getPort());
    }
    
  2. 服务发现核心类图

    DiscoveryClient
    +getInstances()
    +getServices()
    NacosDiscoveryClient
    +namingService
  3. 客户端缓存机制

    // Ribbon服务列表缓存
    public class ServerListUpdater {private volatile List<Server> cachedServers;private ScheduledFuture<?> scheduledFuture;
    }
    
五、生产环境关键配置
  1. 高可用配置

    # Nacos集群配置
    spring:cloud:nacos:discovery:server-addr: 192.168.1.1:8848,192.168.1.2:8848,192.168.1.3:8848
    
  2. 自我保护配置

    # Eureka配置示例
    eureka.server.enable-self-preservation=true
    eureka.server.renewal-percent-threshold=0.85
    
  3. 元数据扩展

    // 自定义元数据
    @Bean
    public NacosDiscoveryProperties nacosProperties() {NacosDiscoveryProperties props = new NacosDiscoveryProperties();props.getMetadata().put("zone", "hangzhou");return props;
    }
    
六、典型问题解决方案
  1. 注册延迟问题

    • 现象:服务启动后无法立即被发现

    • 解决:调整心跳间隔

      spring.cloud.nacos.discovery.heart-beat-interval: 3000
      
  2. 数据不一致问题

    • 现象:消费者看到过期实例列表

    • 解决

      // 强制刷新缓存
      @Scheduled(fixedRate = 30000)
      public void refreshCache() {discoveryClient.getInstances("payment-service");
      }
      
  3. 网络分区问题

    • 现象:注册中心集群脑裂

    • 解决:启用Nacos CP模式

      curl -X PUT "http://127.0.0.1:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP"
      
七、性能优化建议
  1. 注册中心集群部署

    • 最少3节点(满足Raft协议要求)
    • 跨机房容灾部署
  2. 客户端优化

    # 减少不必要的全量拉取
    spring.cloud.nacos.discovery.watch.enabled=false
    
  3. 服务分级存储

    注册中心
    杭州集群
    上海集群
    支付服务
    库存服务

设计原则

  • 注册中心本身必须是无状态的
  • 客户端需要缓存服务列表
  • 必须实现最终一致性
  • 生产环境必须启用访问鉴权

Nacos注册中心

1. 核心功能
  • 服务注册:微服务启动时自动注册到Nacos
  • 服务发现:通过服务名动态查找可用实例
  • 健康检测:自动剔除故障节点
2. 快速使用
  1. 添加依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 配置注册中心
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848  # Nacos地址
  1. 启用服务发现
@SpringBootApplication
@EnableDiscoveryClient  // 关键注解
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
3. 服务调用方式
  • RestTemplate(需加@LoadBalanced注解)
  • OpenFeign(推荐)
@FeignClient(name = "user-service")
public interface UserClient {@GetMapping("/user/{id}")String getUser(@PathVariable Long id);
}
4. 控制台操作
  • 访问地址:http://127.0.0.1:8848/nacos
  • 默认账号:nacos/nacos
  • 核心功能:
    • 查看服务列表
    • 手动上下线实例
    • 调整实例权重
5. 生产建议
  • 集群部署(至少3节点)
  • 启用鉴权
  • 配置命名空间隔离环境(dev/test/prod)

:Nacos同时支持配置中心功能,可与服务发现配合使用

服务注册和服务发现

服务注册与服务发现核心机制

一、服务注册(Service Registration)

1. 核心概念
服务实例启动时将自己的网络地址(IP+Port)和元数据(版本、权重等)上报到注册中心。

2. 工作流程

服务实例 注册中心 存储层 发送注册请求(包含IP/Port/健康状态) 持久化实例信息 返回注册成功 定期发送心跳(维持活性) 服务实例 注册中心 存储层

3. Java实现示例

# application.yml配置
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848service: user-service  # 服务名ip: 192.168.1.100      # 实例IPport: 8080             # 实例端口
二、服务发现(Service Discovery)

1. 核心能力
消费者动态获取可用服务实例列表,并实现负载均衡调用。

2. 发现模式对比

类型原理代表组件
客户端发现消费者本地缓存服务列表Netflix Ribbon
服务端发现通过负载均衡器代理请求Nginx+Consul

3. Java调用示例

// OpenFeign动态发现
@FeignClient(name = "order-service") 
public interface OrderClient {@GetMapping("/orders/{id}")Order getOrder(@PathVariable Long id);
}// RestTemplate调用
@Bean
@LoadBalanced  // 开启负载均衡
public RestTemplate restTemplate() {return new RestTemplate();
}
三、核心设计原则
  1. 最终一致性

    • 允许短暂的数据不一致(如新实例注册后需要几秒才能被发现)
  2. 容错机制

    • 心跳检测自动剔除故障节点
    • 本地缓存服务列表(应对注册中心宕机)
  3. 负载均衡

    轮询
    随机
    权重
    消费者
    实例1
    实例2
    实例3

OpenFeign

1. 什么是OpenFeign?

OpenFeign是Spring Cloud提供的声明式HTTP客户端,只需定义接口就能自动实现服务调用,底层整合了Ribbon实现负载均衡。

2. 3步快速上手
步骤1:添加依赖
<!-- pom.xml -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
步骤2:启用Feign
@SpringBootApplication
@EnableFeignClients // 关键注解
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}
}
步骤3:定义调用接口
@FeignClient(name = "user-service") // 指定服务名
public interface UserClient {@GetMapping("/users/{id}")     // 映射服务端APIUser getUser(@PathVariable Long id);@PostMapping("/users")String createUser(@RequestBody User user);
}
3. 基础配置
# application.yml
feign:client:config:default:connectTimeout: 3000  # 连接超时(ms)readTimeout: 5000     # 读取超时(ms)loggerLevel: basic    # 日志级别(none/basic/full)
4. 三种调用方式
// 1. 自动注入使用(推荐)
@Autowired
private UserClient userClient;public void demo() {User user = userClient.getUser(1L);
}// 2. 动态构造请求(复杂场景)
@Autowired
private FeignClientFactory factory;public void dynamicCall() {UserClient client = factory.build(UserClient.class);client.createUser(new User(...));
}
5. 负载均衡原理
1. 查询注册中心
2. 轮询选择实例
3. 发送HTTP请求
消费者
user-service实例列表
实例1:192.168.1.1
6. 生产级技巧

日志调试

@Configuration
public class FeignConfig {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL; // 输出完整请求信息}
}

异常处理

@FeignClient(name = "user-service", fallback = UserFallback.class)
public interface UserClient {...}@Component
public class UserFallback implements UserClient {@Overridepublic User getUser(Long id) {return new User(0, "默认用户"); }
}
7. 性能优化
# 启用HTTP连接池
feign:httpclient:enabled: truemax-connections: 200   # 最大连接数max-connections-per-route: 50 # 单路由最大连接
8. 常见问题速查
问题现象解决方案
报错UnknownHostException检查服务名是否注册到注册中心
调用超时调整connectTimeout/readTimeout
参数传递错误使用@RequestParam/@PathVariable明确指定

:完整示例代码可参考Spring Cloud OpenFeign官方文档

相关文章:

202521 | 远程调用 | 注册中心

远程调用 1. 核心方案全景图 #mermaid-svg-f3oyP1p2P8a2lAuW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-f3oyP1p2P8a2lAuW .error-icon{fill:#552222;}#mermaid-svg-f3oyP1p2P8a2lAuW .error-text{fill:#55222…...

MySQL-SQL-DDL语句、表结构创建语句语法、表约束、表数据类型,表结构-查询SQL、修改SQL、删除SQL

一.SQL SQL&#xff1a;一门操作关系型数据库的编程语言&#xff0c;定义操作所有关系型数据库的统一标准 二. DDL-数据库 1. 查询所有数据库 命令&#xff1a;show databases; 2. 查询当前数据库 命令&#xff1a;select database(); 3. 创建数据库 命令&#xff1a;create da…...

网络钓鱼攻击的威胁和执法部门的作用(第一部分)

在当今的数字世界中&#xff0c;网络犯罪分子不断开发新技术来利用个人、企业和政府机构。 最普遍和最具破坏性的网络犯罪形式之一是网络钓鱼——一种社会工程手段&#xff0c;用于欺骗人们提供敏感信息&#xff0c;例如登录凭据、财务数据和个人详细信息。 随着网络钓鱼攻击…...

鸿蒙版(ArkTs) 贪吃蛇,包含无敌模式 最高分 暂停和继续功能

鸿蒙版(ArkTs) 贪吃蛇&#xff0c;包含无敌模式 最高分 暂停和继续功能; 效果图如下&#xff1a; 代码如下&#xff1a; // 所有import语句必须放在文件开头 import router from ohos.router; import promptAction from ohos.promptAction; // Add this import at the top wit…...

设计模式简述(十三)适配器模式

适配器模式 描述基本使用使用关于适配器关联不兼容类的方式如果原有抽象层是抽象类若原有抽象是接口使用 描述 适配器模式常用于系统已经上限稳定运行&#xff0c;但现有需求需要将两个不匹配的类放到一起工作时使用。 也就是说这是一个迭代阶段使用的模式。 这种模式&#x…...

4月6日随笔

一觉起来十点多 其实六点和九点分别醒过一次。 起来之后点了个侍卫草推荐的猪排饭&#xff0c;真的巨好吃&#xff0c;猪排很脆&#xff0c;溏心蛋也很香 但是因为酒店十二点半要退房&#xff0c;就匆匆吃完了猪排和一半米饭就走了 今天下午在科技楼写了一会作业&#xff0c…...

Spring Boot 3.4.3 和 Spring Security 6.4.2 实现基于内存和 MySQL 的用户认证

在 Web 应用开发中&#xff0c;用户认证是保障系统安全的基础需求。Spring Boot 3.4.3 结合 Spring Security 6.4.2 提供了强大的安全框架支持&#xff0c;可以轻松实现基于内存或数据库的用户认证功能。本文将详细介绍如何在 Spring Boot 3.4.3 中集成 Spring Security 6.4.2&…...

多款CANFD芯片单粒子效应对比分析

一、引言 随着航天、工业自动化等领域的快速发展&#xff0c;通信芯片在各种复杂环境下的可靠性变得至关重要。单粒子效应&#xff08;Single Event Effect,SEE&#xff09;是空间辐射环境中影响半导体器件性能的重要因素之一。CANFD&#xff08;Controller Area Network with…...

解决Win11耳机没有声音的问题

方法一&#xff1a;更新驱动程序&#xff08;有效&#xff09; 进入 “设置”&#xff08;快捷键&#xff1a;WinX&#xff09;&#xff0c;点击 “Windows 更新” → “高级选项” 点击 “可选更新” &#xff0c;然后点击 “驱动程序更新” 【注】&#xff1a;更新后可能会出…...

【spring02】Spring 管理 Bean-IOC,基于 XML 配置 bean

文章目录 &#x1f30d;一. bean 创建顺序&#x1f30d;二. bean 对象的单例和多例❄️1. 机制❄️2. 使用细节 &#x1f30d;三. bean 的生命周期&#x1f30d;四. 配置 bean 的后置处理器 【这个比较难】&#x1f30d;五. 通过属性文件给 bean 注入值&#x1f30d;六. 基于 X…...

内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新

目录 1. NetBIOS 名称的网络协议在局域网中内网渗透中起到什么作用 2. 使用 UDP 端口耗尽技术强制所有 DNS 查找失败&#xff0c;这个技术如何应用在局域网内网渗透测试中 3. 在本地创建一个 HTTP 服务来伪造 WPAD 服务器 什么是 WPAD 服务器&#xff1f;这个服务器是干嘛的…...

el-tabs添加按钮增加点击禁止样式

前置文章 一、vue使用element-ui自定义样式思路分享【实操】 二、vue3&ts&el-tabs多个tab表单校验 现状确认 点击添加按钮&#xff0c;没有点击样式&#xff0c;用户感知不明显没有限制最大的tab添加数量&#xff0c;可以无限添加 调整目标&代码编写 调整目标…...

LINUX 5 vim cat zip unzip

dd u撤销 ctrlr取消撤销 q!刚才的操作不做保存 刚才是编辑模式 现在是可视化模式 多行注释...

PDFBox渲染生成pdf文档

使用PDFBox可以渲染生成pdf文档&#xff0c;并且自定义程度高&#xff0c;只是比较麻烦&#xff0c;pdf的内容位置都需要手动设置x&#xff08;横向&#xff09;和y&#xff08;纵向&#xff09;绝对位置&#xff0c;但是每个企业的单据都是不一样的&#xff0c;一般来说都会设…...

Batch Normalization:深度学习训练的加速引擎

引言 在深度学习的发展历程中&#xff0c;训练深度神经网络一直是一项极具挑战性的任务。随着网络层数的增加&#xff0c;梯度消失、梯度爆炸以及训练过程中的内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;问题愈发严重&#xff0c;极大地影响了模型的收敛…...

低空经济基础设施建设方向与展望

随着科技的不断进步&#xff0c;低空经济正逐渐成为推动国家经济发展的新引擎。低空经济&#xff0c;指的是在低空范围内进行的各种经济活动&#xff0c;包括但不限于无人机物流、空中交通管理、低空旅游、农业监测等。本文将探讨低空经济基础设施建设的方向与未来展望。 1. 低…...

如何保证RabbitMQ消息的可靠传输?

在这个图中&#xff0c;消息可能丢失的场景是1&#xff0c;2&#xff0c;3 1.在生产者将消息发送给RabbitMQ的时候&#xff0c;消息到底有没有正确的到达服务器呢&#xff0c;RabbitMQ提供了两种解决方案&#xff1a; a. 通过事务机制实现&#xff08;比较消耗性能&#xff0…...

Kotlin语言进阶:协程、Flow、Channel详解(二)

Kotlin语言进阶:协程、Flow、Channel详解(二) 一、Flow基础 1.1 什么是Flow Flow是Kotlin提供的用于处理异步数据流的解决方案,它建立在协程之上,具有以下特点: 冷流特性:只有在收集时才会开始发射数据背压处理:自动处理生产者和消费者速度不匹配的问题组合操作:提…...

Sentinel核心源码分析(上)

文章目录 前言一、客户端与Spring Boot整合二、SphU.entry2.1、构建责任链2.2、调用责任链2.2.1、NodeSelectorSlot2.2.2、ClusterBuilderSlot2.2.3、LogSlot2.2.4、StatisticSlot2.2.5、AuthoritySlot2.2.6、SystemSlot2.2.7、FlowSlot2.2.7.1、selectNodeByRequesterAndStrat…...

Systemd安全加密备份系统与智能通知

实训背景 你是一家金融科技公司的系统架构师&#xff0c;需为敏感数据设计一套安全备份系统&#xff0c;满足以下需求&#xff1a; 加密存储&#xff1a;自动解密插入的LUKS加密USB设备&#xff0c;挂载到安全目录。备份验证&#xff1a;备份完成后校验文件完整性&#xff0c…...

6.0 使用Qt+ OpenCV+Python加载图片

本例作为python图像处理的入门课程1,使用Qt+ OpenCV+Python加载图片。 主要有如下几个地方需要注意: 1. OpenCV 默认使用 BGR 格式,而 Qt 使用 RGB。显示前需要转换:cv2.cvtColor(img, cv2.COLOR_BGR2RGB),一般使用某个QLabel控件进行显示。 pic = cv2.cvtColor(pic, cv2.C…...

深度学习篇---网络分析(1)

文章目录 前言1. ImprovedResBlock&#xff08;改进的残差块&#xff09;结构组成卷积层1卷积层2跳跃连接&#xff08;Downsample&#xff09; 前向传播流程主路径跳跃路径残差连接 2. EnhancedCNN&#xff08;主模型&#xff09;2.1 初始特征提取层功能参数变化 2.2 残差块堆叠…...

【Mac 从 0 到 1 保姆级配置教程 11】- Mac 基础配置 Finder、触控板、常用快捷键等

文章目录 前言配置 Finder1. 把我们的家目录请出来2. 显示文件扩展名3. 展示隐藏文件4. 显示路径栏和状态栏5. 固定文件夹到工具栏 基础快捷键1. Finder 导航快捷键2. 文件操作快捷键3. 视图和显示快捷键4. 搜索和选择快捷键5. 实用技巧6. 关于文件创建 配置触控板1. 右键设置2…...

C++Primer - 动态内存管理

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

DeepSeek本地部署(Ollama)

1. Ollama 安装 Ollama 官网地址&#xff1a; https://ollama.com/安装包网盘地址: https://pan.baidu.com 2. Deepseek 部署 根据自己电脑配置和应用需求选择不同模型&#xff0c;配置不足会导致运行时候卡顿。 版本安装指令模型大小硬盘&#xff08;存储&#xff09;显卡…...

Amodal3R ,南洋理工推出的 3D 生成模型

Amodal3R 是一款先进的条件式 3D 生成模型&#xff0c;能够从部分可见的 2D 物体图像中推断并重建完整的 3D 结构与外观。该模型建立在基础的 3D 生成模型 TRELLIS 之上&#xff0c;通过引入掩码加权多头交叉注意力机制与遮挡感知注意力层&#xff0c;利用遮挡先验知识优化重建…...

第二期:深入理解 Spring Web MVC [特殊字符](核心注解 + 进阶开发)

前言&#xff1a; 欢迎来到 Spring Web MVC 深入学习 的第二期&#xff01;在第一期中&#xff0c;我们介绍了 Spring Web MVC 的基础知识&#xff0c;学习了如何 搭建开发环境、配置 Spring MVC、编写第一个应用&#xff0c;并初步了解了 控制器、视图解析、请求处理流程 等核…...

论伺服电机在轨道式巡检机器人中的优势及应用实践​

一、引言​ 1.1 研究背景与意义​ 在现代工业生产、电力系统、轨道交通等诸多领域&#xff0c;保障设施设备的安全稳定运行至关重要。轨道式巡检机器人作为一种高效、智能的巡检工具&#xff0c;正逐渐在这些领域崭露头角。它能够沿着预设轨道&#xff0c;对目标区域进行全方位…...

开源软件与自由软件:一场理念与实践的交锋

在科技的世界里&#xff0c;“开源软件”和“自由软件”这两个词几乎无人不知。很多人或许都听说过&#xff0c;它们的代码是公开的&#xff0c;可以供所有人查看、修改和使用。然而&#xff0c;若要细究它们之间的区别&#xff0c;恐怕不少朋友会觉得云里雾里。今天&#xff0…...

(51单片机)独立按键控制流水灯LED流向(独立按键教程)(LED使用教程)

源代码 如上图将7个文放在Keli5 中即可&#xff0c;然后烧录在单片机中就行了 烧录软件用的是STC-ISP&#xff0c;不知道怎么安装的可以去看江科大的视频&#xff1a; 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】https://www.bilibili.com/video/BV1Mb411e7re?…...