阿里二面:使用 Nacos 做注册中心怎么做优雅发布?

发布时间:2026/10/29 5:34:01

阿里二面:使用 Nacos 做注册中心怎么做优雅发布? 今天来聊一聊使用 Nacos 做注册中心怎么做优雅发布。跟其他的注册中心一样Nacos 作为注册中心的使用如下图Service Provider 启动后注册到 Nacos ServerService Consumer 则从 Nacos Server 拉取服务列表根据一定算法选择一个 Service Provider 来发送请求。1.优雅要求对于优雅发布要求是 Service Provider 上线注册到 Nacos后服务能够正常地接收和处理请求而 Service Provider 停服后则不会再收到请求。这就有两个要求优雅上线Service Provider 发布完成之前Service Consumer 不应该从服务列表中拉取到这个服务地址优雅下线Service Provider 下线后Service Consumer 不会从服务列表中拉取到这个服务地址。解决了这两个问题优雅发布就可以做到了。2.搭建环境搭建环境是为了看 Nacos 日志通过日志找到对应的源代码。本文搭建的环境如下图2.1 启动 provider启动 springboot-provider 的应用注册到 Nacos启动日志如下2023-06-11 18:58:10,120 [main] [INFO] com.alibaba.nacos.client.naming - [BEAT] adding beat: BeatInfo{port8083, ip192.168.31.94, weight1.0, serviceNameDEFAULT_GROUPspringboot-provider, clusterDEFAULT, metadata{management.endpoints.web.base-path/actuator, management.port18082, preserved.register.sourceSPRING_CLOUD, management.address127.0.0.1}, scheduledfalse, period5000, stoppedfalse} to beat map. 2023-06-11 18:58:10,121 [main] [INFO] com.alibaba.nacos.client.naming - [REGISTER-SERVICE] public registering service DEFAULT_GROUPspringboot-provider with instance: Instance{instanceIdnull, ip192.168.31.94, port8083, weight1.0, healthytrue, enabledtrue, ephemeraltrue, clusterNameDEFAULT, serviceNamenull, metadata{management.endpoints.web.base-path/actuator, management.port18082, preserved.register.sourceSPRING_CLOUD, management.address127.0.0.1}} 2023-06-11 18:58:10,133 [main] [INFO] com.alibaba.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP springboot-provider 192.168.31.94:8083 register finished 2023-06-11 18:58:10,221 [main] [INFO] org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 18082 (http) 2023-06-11 18:58:10,222 [main] [INFO] org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler [http-nio-127.0.0.1-18082] 2023-06-11 18:58:10,223 [main] [INFO] org.apache.catalina.core.StandardService - Starting service [Tomcat] 2023-06-11 18:58:10,223 [main] [INFO] org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.21] 2023-06-11 18:58:10,239 [main] [INFO] org.apache.catalina.core.ContainerBase.[Tomcat-1].[localhost].[/] - Initializing Spring embedded WebApplicationContext 2023-06-11 18:58:10,239 [main] [INFO] org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 99 ms 2023-06-11 18:58:10,268 [main] [INFO] org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver - Exposing 22 endpoint(s) beneath base path /actuator 2023-06-11 18:58:10,336 [main] [INFO] org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler [http-nio-127.0.0.1-18082] 2023-06-11 18:58:10,340 [main] [INFO] org.springframework.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 18082 (http) with context path 2023-06-11 18:58:10,342 [main] [INFO] boot.Application - Started Application in 7.051 seconds (JVM running for 7.874) 2023-06-11 18:58:10,358 [main] [INFO] com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-39.105.183.91_8848] [subscribe] springboot-provider.propertiesDEFAULT_GROUP 2023-06-11 18:58:10,359 [main] [INFO] com.alibaba.nacos.client.config.impl.CacheData - [fixed-39.105.183.91_8848] [add-listener] ok, tenant, dataIdspringboot-provider.properties, groupDEFAULT_GROUP, cnt1 2023-06-11 18:58:10,359 [main] [INFO] com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-39.105.183.91_8848] [subscribe] springboot-provider-dev.propertiesDEFAULT_GROUP 2023-06-11 18:58:10,359 [main] [INFO] com.alibaba.nacos.client.config.impl.CacheData - [fixed-39.105.183.91_8848] [add-listener] ok, tenant, dataIdspringboot-provider-dev.properties, groupDEFAULT_GROUP, cnt1 2023-06-11 18:58:10,360 [main] [INFO] com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-39.105.183.91_8848] [subscribe] springboot-providerDEFAULT_GROUP 2023-06-11 18:58:10,360 [main] [INFO] com.alibaba.nacos.client.config.impl.CacheData - [fixed-39.105.183.91_8848] [add-listener] ok, tenant, dataIdspringboot-provider, groupDEFAULT_GROUP, cnt1 2023-06-11 18:58:10,639 [RMI TCP Connection(1)-192.168.31.94] [INFO] org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet dispatcherServlet 2023-06-11 18:58:10,839 [com.alibaba.nacos.client.naming.updater] [INFO] com.alibaba.nacos.client.naming - [BEAT] adding beat: BeatInfo{port8083, ip192.168.31.94, weight1.0, serviceNameDEFAULT_GROUPspringboot-provider, clusterDEFAULT, metadata{management.endpoints.web.base-path/actuator, management.port18082, preserved.register.sourceSPRING_CLOUD, management.address127.0.0.1}, scheduledfalse, period5000, stoppedfalse} to beat map. 2023-06-11 18:58:10,840 [com.alibaba.nacos.client.naming.updater] [INFO] com.alibaba.nacos.client.naming - modified ips(1) service: DEFAULT_GROUPspringboot-providerDEFAULT - [{instanceId:192.168.31.94#8083#DEFAULT#DEFAULT_GROUPspringboot-provider,ip:192.168.31.94,port:8083,weight:1.0,healthy:true,enabled:true,ephemeral:true,clusterName:DEFAULT,serviceName:DEFAULT_GROUPspringboot-provider,metadata:{management.endpoints.web.base-path:/actuator,management.port:18082,preserved.register.source:SPRING_CLOUD,management.address:127.0.0.1},ipDeleteTimeout:30000,instanceHeartBeatInterval:5000,instanceHeartBeatTimeOut:15000}] 2023-06-11 18:58:10,841 [com.alibaba.nacos.client.naming.updater] [INFO] com.alibaba.nacos.client.naming - current ips:(1) service: DEFAULT_GROUPspringboot-providerDEFAULT - [{instanceId:192.168.31.94#8083#DEFAULT#DEFAULT_GROUPspringboot-provider,ip:192.168.31.94,port:8083,weight:1.0,healthy:true,enabled:true,ephemeral:true,clusterName:DEFAULT,serviceName:DEFAULT_GROUPspringboot-provider,metadata:{management.endpoints.web.base-path:/actuator,management.port:18082,preserved.register.source:SPRING_CLOUD,management.address:127.0.0.1},ipDeleteTimeout:30000,instanceHeartBeatInterval:5000,instanceHeartBeatTimeOut:15000}]我们再看下 Nacos 的日志这里看的文件 naming-server.log日志如下2023-06-11 18:58:09,723 INFO Client connection 192.168.31.94:51885#true connect 2023-06-11 18:58:10,105 INFO Client change for service Service{namespacepublic, groupDEFAULT_GROUP, namespringboot-provider, ephemeraltrue, revision1}, 192.168.31.94:8083#true 2023-06-11 18:58:18,204 INFO Client connection 192.168.31.94:60850#true disconnect, remove instances and subscribersspringboot-provider 启动成功后从Nacos 管理后台可以看到下图2.2 provider 下线服务下线后Nacos 日志如下2023-06-11 19:01:03,375 INFO Client connection 192.168.31.94:51885#true disconnect, remove instances and subscribers 2023-06-11 19:01:05,048 INFO [AUTO-DELETE-IP] service: Service{namespacepublic, groupDEFAULT_GROUP, namespringboot-provider, ephemeraltrue, revision2}, ip: {ip:192.168.31.94,port:8083,healthy:false,cluster:DEFAULT,extendDatum:{management.endpoints.web.base-path:/actuator,management.port:18082,preserved.register.source:SPRING_CLOUD,management.address:127.0.0.1,customInstanceId:192.168.31.94#8083#DEFAULT#DEFAULT_GROUPspringboot-provider},lastHeartBeatTime:1686481231604,metadataId:192.168.31.94:8083:DEFAULT} 2023-06-11 19:01:05,048 INFO Client remove for service Service{namespacepublic, groupDEFAULT_GROUP, namespringboot-provider, ephemeraltrue, revision2}, 192.168.31.94:8083#true 2023-06-11 19:01:08,379 INFO Client connection 192.168.31.94:8083#true disconnect, remove instances and subscribers2.3 服务调用在 springboot-consumer 上跑一个单元测试的用例用 FeignClient 调用下面的方法FeignClient(value springboot-provider, configuration FeignMultipartSupportConfig.class) public interface FeignAsEurekaClient { PostMapping(/employee/save) String saveEmployeebyName(RequestBody Employee employee); }日志如下2023-06-11 19:15:47,694 [main] [INFO] org.springframework.test.context.transaction.TransactionContext - Began transaction (1) for test context [DefaultTestContext5bf0d49 testClass TestFeignAsEurekaClient, testInstance boot.service.TestFeignAsEurekaClient10683d9d, testMethod testPostEmployByFeignTestFeignAsEurekaClient, testException [null], mergedContextConfiguration [WebMergedContextConfiguration5b7a5baa testClass TestFeignAsEurekaClient, locations {}, classes {class boot.Application, class boot.Application}, contextInitializerClasses [], activeProfiles {}, propertySourceLocations {}, propertySourceProperties {org.springframework.boot.test.context.SpringBootTestContextBootstrappertrue, server.port0}, contextCustomizers set[org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer166fa74d, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer588df31b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer0, org.springframework.boot.test.web.client.TestRestTemplateContextCustomizer7fad8c79, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer10b48321], resourceBasePath src/main/webapp, contextLoader org.springframework.boot.test.context.SpringBootContextLoader, parent [null]], attributes map[org.springframework.test.context.web.ServletTestExecutionListener.activateListener - false]]; transaction manager [org.springframework.jdbc.datasource.DataSourceTransactionManager693676d]; rollback [true] 2023-06-11 19:15:47,941 [main] [INFO] com.netflix.config.ChainedDynamicProperty - Flipping property: springboot-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit 2147483647 2023-06-11 19:15:47,962 [main] [INFO] com.netflix.loadbalancer.BaseLoadBalancer - Client: springboot-provider instantiated a LoadBalancer: DynamicServerListLoadBalancer:{NFLoadBalancer:namespringboot-provider,current list of Servers[],Load balancer statsZone stats: {},Server stats: []}ServerList:null 2023-06-11 19:15:47,969 [main] [INFO] com.netflix.loadbalancer.DynamicServerListLoadBalancer - Using serverListUpdater PollingServerListUpdater 2023-06-11 19:15:48,064 [main] [INFO] com.netflix.config.ChainedDynamicProperty - Flipping property: springboot-provider.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit 2147483647 2023-06-11 19:15:48,064 [main] [INFO] com.netflix.loadbalancer.DynamicServerListLoadBalancer - DynamicServerListLoadBalancer for client springboot-provider initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:namespringboot-provider,current list of Servers[192.168.31.94:8083],Load balancer statsZone stats: {unknown[Zone:unknown; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;] },Server stats: [[Server:192.168.31.94:8083; Zone:UNKNOWN; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0] ]}ServerList:com.alibaba.cloud.nacos.ribbon.NacosServerList24d998ba注意这里使用了 OpenFeign其中用到了 Ribbon 做负载均衡那就需要考虑到 Ribbon 刷新本地服务列表的时间从源代码中看刷新周期是 30s。如下图Ribbon 刷新缓存的逻辑参考下面代码public synchronized void start(final UpdateAction updateAction) { if (isActive.compareAndSet(false, true)) { final Runnable wrapperRunnable new Runnable() { Override public void run() { //... } }; scheduledFuture getRefreshExecutor().scheduleWithFixedDelay( wrapperRunnable, initialDelayMs, refreshIntervalMs,//这里定义的是30s TimeUnit.MILLISECONDS ); }//... }3.优雅发布前面第一节提到过优雅发布有两个要求优雅上线和优雅下线。Service Consumer 初始化时会从 Nacos Server 获取服务列表并更新本地缓存同时会向 Nacos Server 订阅服务列表如果 Nacos Server 上的服务列表发生变化会主动通知 Service Consumer。之后会定时默认间隔 1s 拉取服务列表并更新本地缓存。代码如下//NacosNamingService 类 public ListInstance selectInstances(String serviceName, String groupName, ListString clusters, boolean healthy, boolean subscribe) throws NacosException { ServiceInfo serviceInfo; String clusterString StringUtils.join(clusters, ,); if (subscribe) { serviceInfo serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString); if (null serviceInfo) { serviceInfo clientProxy.subscribe(serviceName, groupName, clusterString); } } else { serviceInfo clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false); } return selectInstances(serviceInfo, healthy); }在订阅的代码中加入了定时更新服务列表的代码如下//NamingClientProxyDelegate 类 public ServiceInfo subscribe(String serviceName, String groupName, String clusters) throws NacosException { NAMING_LOGGER.info([SUBSCRIBE-SERVICE] service:{}, group:{}, clusters:{} , serviceName, groupName, clusters); String serviceNameWithGroup NamingUtils.getGroupedName(serviceName, groupName); String serviceKey ServiceInfo.getKey(serviceNameWithGroup, clusters); serviceInfoUpdateService.scheduleUpdateIfAbsent(serviceName, groupName, clusters); ServiceInfo result serviceInfoHolder.getServiceInfoMap().get(serviceKey); if (null result || !isSubscribed(serviceName, groupName, clusters)) { result grpcClientProxy.subscribe(serviceName, groupName, clusters); } serviceInfoHolder.processServiceInfo(result); return result; }Nacos Server 会定时每隔 5s检查 Service Provider 是否健康根据心跳来检查如果 15s 默认可以配置没有收到心跳则会把服务置为不健康并且通知 Service Consumer。代码如下//UnhealthyInstanceChecker 类 public void doCheck(Client client, Service service, HealthCheckInstancePublishInfo instance) { if (instance.isHealthy() isUnhealthy(service, instance)) { changeHealthyStatus(client, service, instance); } } private void changeHealthyStatus(Client client, Service service, HealthCheckInstancePublishInfo instance) { instance.setHealthy(false); NotifyCenter.publishEvent(new ServiceEvent.ServiceChangedEvent(service)); NotifyCenter.publishEvent(new ClientEvent.ClientChangedEvent(client)); NotifyCenter.publishEvent(new HealthStateChangeTraceEvent(System.currentTimeMillis(), service.getNamespace(), service.getGroup(), service.getName(), instance.getIp(), instance.getPort(), false, client_beat)); }3.1 优雅上线优雅上线存在的问题主要在于 Service Provider 注册到 Nacos 后服务还没有完成初始化请求已经到来。这种情况主要原因是 Service Provider 启动后立刻注册 Naocs而本身提供的接口可能还没有初始化完成。这种情况的解决方法是关闭自动注册spring.cloud.nacos.discovery.registerEnabledfalse在服务初始化后使用代码手动注册代码如下Properties setting8 new Properties(); String serverIp8 127.0.0.1:8848; setting8.put(PropertyKeyConst.SERVER_ADDR, serverIp8); setting8.put(PropertyKeyConst.USERNAME, nacos); setting8.put(PropertyKeyConst.PASSWORD, nacos); NamingService inaming8 NacosFactory.createNamingService(setting7); inaming8.registerInstance(springboot-provider, 192.168.31.94, 8083);3.2 优雅下线对于正常下线Nacos Server 收到 Provider 发送的下线请求后会通知订阅的 Server Consumer而且 Consumer 也会每隔 1s 去更新本地服务列表这个过程已经非常接近优雅下线了。而对于异常下线Nacos Server 采用心跳检测机制来更新服务列表。心跳周期是 5sNacos Server 如果 15s 没收到心跳就才会将实例设置为不健康。3.2.1 正常停服正常下线的情况下最优雅的方式是先向 Nacos Server 发送下线通知发送通知一段时间比如 5s后再停服。比如增加一个 API 接口服务下线之前增加 preStopHook 函数调用这个 API 接口来实现下线。API 接口示例代码如下GetMapping(value /nacos/deregisterInstance) public String deregisterInstance() { Properties prop new Properties(); prop.setProperty(serverAddr, localhost); prop.put(PropertyKeyConst.NAMESPACE, test); NacosNamingService client new NacosNamingService(prop); client.deregisterInstance(springboot-provider, 192.168.31.94, 8083); return success; }在使用 Ribbon 的场景也需要考虑 Ribbon 更新本地缓存服务列表的机制手动下线后可以再等待 30s 后关闭服务。3.2.1 服务故障对于服务故障的情况Nacos Server 需要采用心跳来检测服务在线如果 15s 没收到心跳才会将实例设置为不健康在 30s 没收到心跳才会把这个服务从列表中删除。这个时间可以做优化设置spring.cloud.nacos.discovery.metadata.preserved.heart.beat.interval1000 #心跳间隔5s-1s spring.cloud.nacos.discovery.metadata.preserved.heart.beat.timeout3000 #超时时间15s-3s spring.cloud.nacos.discovery.metadata.preserved.ip.delete.timeout5000 #删除时间30s-5s但是Service Provider 故障情况下即使做优化配置也是很难让 Service Consumer 无感知。极端情况下可能 Provider 部分服务已经不能正常提供了但还是会向 Nacos Server 发送心跳这种情况可以采用服务本身的健康检查来通知 Nacos Server 服务下线。4 总结无论是哪一款注册中心优雅发布要解决的问题都是优雅上线和优雅下线。本文结合 Nacos 的原理讲解了 Nacos 的优雅发布希望对你有所帮助。2026年最新版百万八股面试宝典《Java》《大模型》《大并发》《大数据》本题库由资深讲师联合大厂面试官精心打造专为高级IT岗位设计【220万字八股文面试宝典领取】面试突击体系相关Java企业架构体系相关AI大模型相关HR 面试软技能设计模式相关并发编程相关网络IO与Netty相关互联网三高项目相关亿级流量多级缓存相关数据结构算法相关分布式相关分布式锁相关分布式ID相关核心源码相关大厂线上故障分析相关Docker相关Dubbo相关ElasticSearch相关GoLang相关Java基础核心JVM核心相关JVM调优底层相关Kafka相关Kubernetes相关Linux相关MongoDB相关MQ相关MySQL相关MyBatis相关MyBatisPlus相关Postgresql相关RabbitMQ相关RocketMQ相关Redis相关ShardingSphere相关Shiro相关SkyWalking相关Solr相关Spring 相关SpringBoot相关SpringCloud相关SpringMVC源码相关SpringSecurity相关Spring WebFlux相关领域驱动设计DDD相关任务调度Airflow相关Zookeeper相关HDFS面试题MapReduce面试题Yarn面试题Hive相关SQL面试题相关Scala面试题Spark面试题Flink相关Doris相关Tomcat源码相关网络安全相关运维/云原生相关
延伸阅读

更多相关文章

2026/10/29 5:34:01

手把手教你使用Nacos配置中心!

Nacos整合了注册中心和配置中心,使用起来非常方便,这篇文章主要介绍Nacos配置中心的使用。新建配置启动Nacos服务后,进入注册中心配置页面,如下图:点击上图中红框里面的加号,进入新建配置页面,如…

2026/10/29 5:29:01

go-echarts opts.XAxis 实战避坑指南:时间/分类/数值轴配置要点

1. 这不是一份“API文档搬运工”指南,而是一线开发者用血泪踩坑后整理的 opts.XAxis 实战手册 你是不是也经历过这样的时刻:在 Go 项目里接入 go-echarts,想把时间序列数据按天展示,结果 X 轴上一堆重复的“2024-01-01”&#xf…

2026/10/29 5:29:01

AI Agent社交平台失控案例分析及稳健设计指南

1. 项目背景与现象观察最近在AI Agent领域出现了一个值得关注的现象:名为Moltbook的AI Agent社交平台在短短三天内出现了明显的失控情况。作为一个长期关注AI交互系统的开发者,我第一时间对这个案例进行了技术分析。Moltbook最初定位为"AI Agent的社…

2026/10/29 6:49:05

marketingskills:重建真实用户连接的实操能力

1. 这不是“学营销”,而是重建你和真实用户之间的连接能力“marketingskills”这个词,最近在招聘平台、自由职业接单页面、甚至小红书笔记标题里高频出现,但它绝不是指背熟4P理论、能画SWOT矩阵、会写朋友圈文案就完事了。我带过37个从零起步…

2026/10/29 6:49:05

OpenCV图像仿射变换原理与实战指南

1. 图像仿射变换基础概念解析在计算机视觉和图像处理领域,仿射变换是最基础也最重要的几何变换之一。简单来说,仿射变换就是保持图像中直线和平行线关系的线性变换,它包含了平移、旋转、缩放和剪切等基本操作。作为图像处理工程师&#xff0c…

2026/10/29 6:49:05

marketingskills:5个可练习的营销能力模块

1. 这不是“学营销”,而是重建你和钱的关系“marketingskills”——这个词最近在招聘平台、自由职业接单站、甚至朋友圈晒学习计划的截图里高频出现,但它根本不是什么新概念,更不是某家培训机构刚编出来的课程名。它就是市场能力的缩写&#…

2026/10/29 6:49:05

Prompt-Tuning小样本微调:模板、标签词与过拟合控制

简介:《Prompt-Tuning:深度解读一种全新的微调范式》是一份面向NLP研究者、算法工程师与大模型学习者的综述型PDF,围绕少样本、零样本场景下如何用提示替代传统Fine-tuning展开,重点回应预训练与下游任务目标差异大、微调易过拟合…

2026/10/29 6:49:05

营销能力不是灵感,而是可拆解的四大实战模块

1. 这不是“营销课”,而是一套可拆解、可验证、可复用的实战能力系统“marketingskills”这个词,乍看像英文课程名,但放在当下内容爆炸、流量碎片、用户注意力以秒计价的环境里,它根本不是什么抽象概念,而是你发一条朋…

2026/10/29 6:44:05

Ponytail:前端UI状态快照与协作诊断工具详解

1. 项目概述:从“ponytail”热词切入,我们到底在讨论什么?最近刷技术社区、设计论坛甚至短视频平台,频繁撞见“ponytail”这个词——它既不是马尾辫的直译,也不是某个新晋网红的ID,而是一个正在快速聚拢真实…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑