Eureka接入HDFS:分布式文件系统的服务发现实践
大数据领域中 Eureka 与分布式文件系统的集成先说一个我实际遇到的场景。去年在维护一套大数据平台时集群里的节点数量从最初十几个涨到了一百多个HDFS 的 NameNode 和 DataNode 信息靠静态配置文件分发每次扩容都要手动改配置再重启客户端。最痛苦的是某天一台 DataNode 宕机监控上显示进程没了可客户端还在往那个节点上写数据等超时之后才切走整整影响了半小时的任务。当时的运维同事开玩笑说要是这套文件系统像微服务那样能自动发现可用节点就好了。后来我认真调研了一圈发现把 Eureka 这种注册中心接入分布式文件系统的调度链路确实是一条值得走通的路。这篇文章就把我踩过的坑、调试过的参数、最终落地的设计方案完整梳理一遍。适合正在维护中大型 Hadoop 集群、或者想把微服务治理经验迁移到大数据基础设施里的朋友参考。不管是纯粹做数据平台的还是做基础架构的都应该能从这套思路里找到一些可以抄作业的部分。1. 为什么分布式文件系统需要一颗注册中心的大脑1.1 静态配置在规模面前必然失灵HDFS 这类分布式文件系统天然存在中心节点 大量工作节点的架构。NameNode 管理元数据DataNode 存真实数据块。早期小集群阶段让客户端直接读取一份写死的地址列表完全可行反正就那十几台机器。但规模一大问题马上暴露。首先是变更频繁。扩容、缩容、坏盘下线、滚动升级每天都有节点状态在变。靠人去维护一份静态列表要么漏更新要么更新后客户端不重试旧缓存。其次是客户端感知能力弱。客户端拿到的是一个固定地址列表它不知道某个 DataNode 当前是否存活、负载是否过高、网络是否分区。只要列表里有这个地址它就会尝试连接失败后再用超时来兜底。这个超时窗口非常致命在大数据任务动辄跑几个小时的场景下每一次错误连接都会造成任务重试甚至失败。做过微服务的人看到这里应该已经反应过来了这不就是服务注册与发现要解决的问题吗。Eureka 的定位恰恰就是给一堆不断变化的服务实例维护一份实时状态清单并让调用方能快速感知变化。把同样思路放进分布式文件系统里就能把原先静态的、容易过期的那份节点清单变成动态的、实时心跳维持的活清单。1.2 Eureka 在治理分布式基础设施上的天然优势Eureka 虽然出身于微服务领域但它处理问题的模型和数据节点注册场景的吻合度很高。它会维护一份注册表里面包含服务名、实例 IP、端口、状态、元数据。客户端可以从这份注册表里拿到完整的服务实例信息并且支持按需过滤掉 DOWN 状态的实例。这个模型放到大数据场景里可以原样平移。比如说我可以把 HDFS 集群里的每个节点按角色注册成服务NameNode 注册成hdfs-namenode服务各 DataNode 注册成hdfs-datanode服务。每个注册实例的元数据里带上机架信息、磁盘容量、写带宽、所属副本组等标签。客户端在发起数据写入前先去 Eureka 拉一次可用节点列表再根据元数据做路由而不是依赖一份过期的静态文件。这个思路不仅在 HDFS 上适用像 HBase RegionServer、Kafka Broker、ES 节点这类有状态分布式组件理论上都可以用同样的方式接入。还有一个很多人忽略的优势Eureka 的客户端缓存机制。Eureka Client 启动后会在本地维护一份注册表缓存并定期从 Server 增量拉取变更。这意味着即使 Eureka Server 短暂不可用已启动的客户端依然能靠本地缓存继续工作不会因为注册中心抖动就直接影响数据读写。这一点对大数据任务这种长时运行、看重连续性的工作负载来说比某些强一致注册中心更合适。2. 集成方案的整体设计角色映射与注册模型2.1 组件职责划分在设计集成方案前要先想清楚每一个组件在里面扮演什么角色否则硬接只会把系统搞得更复杂。我最终落地的模型是这样的Eureka Server独立部署三个节点承担全部节点状态的注册和心跳维护对外提供查询接口NameNode作为受管角色注册到 Eureka注册为hdfs-namenode元数据中声明 active/standby 状态DataNode同样作为受管角色注册注册为hdfs-datanode元数据中上报机架、数据目录剩余空间、块服务状态HDFS 客户端在释放读写请求前先向 Eureka 工作区获取实时节点清单将节点状态参与路由判断管理监控端订阅 Eureka 的事件流把节点上下线事件实时上报给告警系统替代原先定期扫描健康端口的老办法。2.2 服务命名与元数据设计服务命名看起来很简单但实际影响很大。命名规则要统一不然监控和权限管理会混乱。我这边定的规则是角色名.集群名比如hdfs-namenode.prod表示生产集群的 NameNodehdfs-datanode.prod表示生产集群的 DataNode。这样按服务名过滤时不会跨集群串掉排查问题时也更直观。元数据字段是这次设计里比较关键的部分。单个 DataNode 注册时至少要带上这几项元数据键含义用途rack机架编号机架感知副本放置策略参考disk_used已用空间GB容量均衡路由disk_total总空间GB判断剩余容量是否充足block_count当前块数量负载评估参考version节点版本滚动升级时过滤新老版本status自定义运行状态补充 Eureka 心跳状态之外的业务状态这些信息全部放进 Eureka 的 instance metadata 里。客户端拉取注册表时一次性拿到不用再额外调用其他接口。要注意 metadata 在 Eureka 中有大小限制别塞太多东西只保留路由决策真正需要的字段。2.3 为什么刻意绕开 ZooKeeper聊到这里肯定会有人问Hadoop 生态本身用 ZK 做 NameNode HA为什么不直接把 ZK 扩展成统一的服务发现层非要再引一套 Eureka我的答案比较直接ZK 的强一致模型和频繁写场景不适合大规模服务发现。DataNode 数量上百台之后心跳信息如果全部通过 ZK 写入ZNODE 数量会急剧膨胀事务日志增长很快而且 ZK 的读路径太重客户端每次获取节点列表都要走一次分布式读。Eureka 的设计是 AP 模型牺牲强一致换高可用心跳走纯内存更新客户端有本地缓存和增量拉取整体开销小得多。对于节点状态这种允许短暂不一致、但不能长时间不可用的信息Eureka 明显更合适。当然这也意味着你要接受一个副作用从 Eureka 拿到的节点列表可能不是绝对最新的。一个 DataNode 挂了之后可能要等几个心跳周期才能被标记为 DOWN。这个滞后在有本地重试机制的前提下可以接受。我的态度是Eureka 负责我知道有谁至于谁一定活着还需要配合客户端探测来确认。3. 把 NameNode 和 DataNode 搬进 Eureka实操细节3.1 节点注册的工程实现真正动手实现时我采用的是嵌入式 Eureka Client在每个数据节点上单独启动一个注册线程不走全量 Spring Cloud 那套重框架。原因很简单DataNode 上跑着的是 Java 进程但附属模块越轻越好我不想为了注册功能引入一堆依赖。Eureka Client 本身是纯 Java 库直接放在节点附属代码里即可。核心注册逻辑类似这样// 节点注册服务核心逻辑 public class NodeRegistrar { private final EurekaClient eurekaClient; public void registerDataNode(DataNodeInfo info) { InstanceInfo instance InstanceInfo.Builder.newBuilder() .setAppName(hdfs-datanode.prod) .setInstanceId(info.getHostname() : info.getPort()) .setHostName(info.getHostname()) .setPort(info.getPort()) .setDataCenterInfo(new MyDataCenterInfo(DataCenterInfo.Name.MyOwn)) .setMetadata(ImmutableMap.of( rack, info.getRack(), disk_used, String.valueOf(info.getDiskUsedGb()), disk_total, String.valueOf(info.getDiskTotalGb()), block_count, String.valueOf(info.getBlockCount()), status, active )) .build(); eurekaClient.register(instance); } public void updateHeartbeat(boolean healthy) { // 心跳状态随健康检查结果联动定期执行 eurekaClient.heartbeat(); } }关键点是注册后必须定期发送心跳。Eureka 默认心跳间隔是 30 秒但对于大数据节点的存活感知这个间隔太长了。我把eureka.lease.renewalInterval调整为 10 秒eureka.lease.duration调整为 30 秒。这样做的好处是一个节点异常下线后最多 30 秒内就能在注册中心里被标记为 DOWN客户端随后就能避开它。代价是 Eureka Server 收到的心跳请求量变为原来三倍三台 Server 完全扛得住我测过轻微压力。3.2 客户端侧如何拿到实时节点清单客户端侧我写了一个轻量的HdfsDiscoveryClient职责就是定期从 Eureka 拉取注册表按角色过滤出需要的节点列表并且监听变更时间戳本地缓存一份最新的可用节点池。// 客户端服务发现逻辑 public class HdfsDiscoveryClient { private volatile ListDataNodeEndpoint availableNodes; public ListDataNodeEndpoint getAvailableDataNodes() { Applications apps eurekaClient.getApplications(); ListInstanceInfo instances apps.getInstances(hdfs-datanode.prod); return instances.stream() .filter(i - InstanceStatus.UP.equals(i.getStatus())) .map(this::toEndpoint) .collect(Collectors.toList()); } }这里有一个隐蔽但重要的细节Eureka 客户端默认有缓存刷新间隔如果不动配置改动可能要 30 秒甚至更久才能被感知到。我在客户端把eureka.client.registryFetchIntervalSeconds从默认 30 秒调整为 5 秒配合服务端的增量拉取接口节点状态变化在 5 到 10 秒内就能反映到本地缓存中。这个值不能再低了否则每个客户端每秒钟都在轮询注册中心几百个客户端同时拉数据会把 Eureka Server 的网卡打满。3.3 用元数据实现机架感知路由HDFS 原本的副本放置策略是靠节点自己上报机架信息到 NameNodeNameNode 再根据副本因子选择不同机架。接入 Eureka 后我把机架信息放进了注册实例的元数据里这样客户端在选节点时能直接参考机架信息减少跨机架的随机选择。比如写一个三副本文件时客户端提前从 Eureka 拿到的节点池按机架分组然后每组挑一台。相比原先随机挑节点再交给 NameNode 调度的方式这种预选能显著降低数据跨机架传输的概率。实测一个写入密集型任务在混挂拓扑下耗时缩短了大概 18%。这个收益不完全来自 Eureka但它确实为路由决策提供了更丰富的信息来源。还有一点额外价值因为元数据里带上了磁盘剩余空间客户端在挑选目标节点时能主动避开磁盘使用率超过 90% 的节点避免任务写入到快要写满的磁盘然后中途失败。原先这个判断靠 NameNode 在调度的最后一刻做现在提前到客户端侧就能过滤等于多了一道保护层。4. 集成之后的排障日记心跳、缓存与自我保护4.1 自我保护模式差点让我误判全局上线后的第二周我遇到一个诡异现象明明有一台 DataNode 已经宕机半小时了可 Eureka Server 上它的状态还是 UP客户端也一直往它那发写入请求。第一反应是心跳配置没生效排查半天发现代码没问题最后定位到是 Eureka 的自我保护模式在起作用。自我保护模式是 Eureka Server 的一个内置机制当它在短时间内接收到的心跳数量低于期望阈值的 85% 时会认为网络分区故障导致客户端心跳无法送达而不是服务端实例集体下线于是它会把所有实例的状态暂时冻结过期实例不会被清理。初衷是防止网络分区时误杀大量存活节点但在我这种数据节点数量波动大的场景下个别节点宕机后服务器收到的总心跳数掉了一定比例触发了自我保护导致那个 DOWN 状态迟迟不更新。解决方式很直接在 Eureka Server 上关闭自我保护。生产环境心跳抖动远小于微服务场景因为 DataNode 是常驻进程不会像 Web 实例那样随时弹性伸缩所以自我保护在这里弊大于利。配置上把enableSelfPreservationfalse同时在客户端把registryFetchIntervalSeconds调低让状态变更能更快传递。4.2 缓存刷新延迟引起的路由失效另一个坑出在客户端缓存上。我最初用 Eureka 默认配置做客户端拉取测试一个节点下线后客户端花了将近 30 秒才从缓存里剔除它。对普通微服务来说 30 秒还可以接受但大数据任务里 30 秒可能已经写入了几十 GB 数据到错误节点上。我把缓存刷新间隔调整成 5 秒后问题缓解了不少但还没完。单个 JVM 上可能有多个任务线程同时调用getAvailableDataNodes()如果不做本地缓存每秒几百次 Eureka 请求会让 Server 压力陡增。做了缓存后又发现缓存更新和任务执行存在并发问题最后只好在客户端做一个双缓冲池一个current列表供读取一个candidate列表供更新每 5 秒轮到更新时先将candidate完整替换再把引用指向它。写代码五分钟想明白怎么做用了两个晚上。4.3 心跳参数和网络超时的取舍心跳参数上面提过我最终采用的是 10 秒发送、30 秒过期。这个组合不是拍脑袋定的我做了三轮压测。第一轮用默认 30 秒发送、90 秒过期节点故障感知太慢故障转移时间要两分钟以上。第二轮改成 5 秒发送、15 秒过期感知倒是快但高频心跳在高 GC 场景导致节点线程卡顿反而产生误报。第三轮 10 秒发送、30 秒过期故障转移时间基本稳定在 25 到 35 秒且心跳开销不影响正常 IO这才上线。网络超时这一块我也要提醒一句。Eureka 默认的eureka.client.readTimeout是 8 秒connectTimeout是 5 秒这些值偏保守。数据节点的机房网络偶尔会有微突发拥堵一旦心跳请求或注册表拉取超时客户端会误认为 Eureka Server 不可用造成不必要的告警。我把读超时放宽到 15 秒连接超时放宽到 10 秒实测误报降了至少七成。5. 故障演练与容量评估这套集成方案到底稳不稳5.1 场景一NameNode 主备切换设计这套集成方案时我就在想NameNode 主备切换能不能也让 Eureka 感知到。实际做下来是可行的而且效果比预期好。在 NameNode 主备切换过程中原先处于 Standby 的节点会演变成 Active这个状态写进实例元数据。客户端通过 Eureka 的增量更新拿到新状态就开始用新 Active 节点处理请求了。演练时我手动 kill 掉 Active NameNode从进程退出的那一刻到客户端完全切换到新 Active耗时 22 秒。对比原先依赖 ZK 通知和客户端轮询的叠加延迟大概快了 40%。而且因为元数据里有明确的状态标志客户端不会在切换窗口期同时向两个节点发写请求避免了一部分 split-brain 带来的脏数据风险。5.2 场景二单台 DataNode 的优雅下线再演示一个日常场景下线一台 DataNode 做硬件维护。上线前本来可以在 Eureka 里先把实例状态置为 OUT_OF_SERVICE让客户端主动避开它再执行下线。实际演练中我故意先 kill 进程验证自动感知从进程退出到客户端路由完全绕开该节点大约 30 秒期间新写入的数据没有写到这台机器上已写入的数据块由 HDFS 的副本机制自动补齐。这个结果验证了之前的参数设计。随后我又测了优雅下线流程先调用eurekaClient.deregister()反注册等到再无新请求到达该节点时再停进程。整体切换时间从 30 秒压到一两秒内节点上不会出现残留的待同步数据块。事实证明只要把 Eureka 的反注册流程纳入运维手册日常滚动升级可以做到几乎无感知。5.3 Eureka Server 本身的容量评估最后聊一下 Server 端容量。三台 Eureka ServerCPU 是 8 核 16GB。集群规模在 150 个节点时每 10 秒的心跳请求总量约 15 次每秒注册表拉取请求在 30 个客户端同时每 5 秒拉一次时约 6 次每秒总体压力极低。即便放大到 500 节点、100 个客户端负载也只是翻几倍离瓶颈还很远。真正可能成为瓶颈的倒是网卡带宽因为注册表数据是按应用维度整体返回的即便客户端只关心 DataNode也要收到整个 Eureka 注册的快照数据。解决方式是给 Eureka 增加虚拟分片不同的角色注册到不同 Server 集群数据量按角色切分。6. 集成之外的经验复盘和扩展空间回头看这个集成项目我认为最有价值的地方不是多了一套配置而是把服务发现这个微服务里的老概念真正应用到了有状态基础设施里。过去做大数据平台总有一种思维惯性觉得 HDFS、HBase 这些组件已经自带节点管理机制不需要额外加注册中心。但真实场景下自带机制解决的是文件系统内部怎么知道数据存哪里而 Eureka 解决的是外部客户端怎么动态知道该访问谁两者关注层面不同完全可以叠加而不是互相取代。如果你想在实际环境里复刻这套方案我的建议是分三步走先拿一个测试集群做节点注册和基本心跳把 Eureka 的参数调通再接入客户端路由把读写请求逐步切到自动发现模式最后才考虑和现有监控系统、告警平台联动。不要一上来就追求全量切换毕竟分布式文件系统最怕的就是因小失大调度链路上任何一跳不稳定都可能放大成数据写入故障。如果你已经在用微服务那套体系管理大数据集群也可以考虑把 Eureka 替换成 Nacos 或者 Consul核心注册模型不变就是换一个注册中心实现。我个人留着 Eureka 的原因还是它简单直接时间耗尽少出问题容易排查。最后的最后分享一个小技巧给每个节点注册实例的instanceId中带上集群名和机架号比如prod-node03-rackA排查问题的时候光看 ID 就知道这台机器在哪个集群、在哪里省掉了反复翻配置的麻烦。这套命名规范我从第一个版本坚持到现在越到后期越觉得值。

相关新闻

游戏研发AI工具选型与自研:三大原则、全周期成本评估与落地避坑

游戏研发AI工具选型与自研:三大原则、全周期成本评估与落地避坑

“免费的才是最贵的”——这句话在游戏研发选AI工具这件事上,体现得淋漓尽致。我见过不止一个团队兴冲冲地接入免费AI绘图、免费代码补全插件,结果要么是素材版权出了问题,要么是工具突然停止服务,要么是数据喂给了别人&#xff0…

2026/10/13 14:07:01 阅读更多 →
离线JSON/XML格式化与数据比对:构建本地可复用的数据校验流水线

离线JSON/XML格式化与数据比对:构建本地可复用的数据校验流水线

简介:这是一套面向开发者与测试人员的JSON/XML处理工具集,主要解决接口调试、配置文件校验及数据差异排查中的格式混乱与比对困难问题。资源包含JSON格式化工具、XML格式化工具和JSON数据比对工具三大模块:格式化工具支持实时校验并显示错误行…

2026/10/13 14:07:01 阅读更多 →
ppt-master:用代码批量生成标准化PPT的工程化实践

ppt-master:用代码批量生成标准化PPT的工程化实践

1. 项目概述:这不是一个PPT模板库,而是一套可编程的幻灯片生成引擎“ppt-master”这个词最近在技术圈和内容创作社区里悄悄升温,但很多人第一反应是——“又一个PPT模板网站?”其实完全不是。我接触过十几个用它落地的项目&#x…

2026/10/13 14:07:01 阅读更多 →

最新新闻

压电喷墨打印头的工作动态特性

压电喷墨打印头的工作动态特性

压电喷墨打印头的运行动力学期刊:《物理报告》(Physics Reports) 491 (2010) 77‑177 作者:赫尔曼维肖夫(Herman Wijshoff) 奥塞技术有限公司(Oc Technologies B.V.),荷兰芬洛,邮政信…

2026/10/13 15:03:33 阅读更多 →
基于openclaw实现自定义mcp/skill(第二章)

基于openclaw实现自定义mcp/skill(第二章)

代码本身在这里是做任务的,只负责被openclaw调度其中自己需要开发:MCP、Skill概念是什么在本项目中的角色Skill给 OpenClaw Agent 看的一组 Markdown 脚本,让它知道“什么时候、用什么参数、按什么流程做恶意充值检测”纯文档编排&#xff0…

2026/10/13 15:03:33 阅读更多 →
[脚本]保持屏幕常亮

[脚本]保持屏幕常亮

KeepAwake.ps1 # KeepAwake.ps1 # 防止屏幕自动关闭,并阻止系统自动睡眠# 仅在类型尚未加载时定义,避免重复运行时报错 if (-not ([System.Management.Automation.PSTypeName]SleepPrevent).Type) {Add-Type " using System; using System.Runtime.…

2026/10/13 15:03:33 阅读更多 →
分享初级爬虫爬音频,图片

分享初级爬虫爬音频,图片

跪求大佬指点。#第一步,先安装requests库,如下。1.先在工作台找到终端,在输入pip install requests,即可安装requests库,以后类似可以安装其他#然后如上图写代码。如上会细分很多小步骤,上图中的代码修改,u…

2026/10/13 15:03:33 阅读更多 →
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层

Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层

一句话总结:当大模型 API 从「技术尝鲜」变成「生产基础设施」,Java 后端必须有自己的 LLM 网关层——不是简单转发,而是统一接入、Token 感知限流、智能降级、全链路审计与成本治理。一、为什么 Java 后端需要 LLM 网关2026 年的 AI 工程已经…

2026/10/13 15:03:33 阅读更多 →
NPU模型适配三要素:图优化、算子映射与内存调度

NPU模型适配三要素:图优化、算子映射与内存调度

1. 这不是“换个芯片就行”的事:NPU/TPU加速的真实门槛在哪里很多人看到“NPU/TPU硬件加速”这几个字,第一反应是——换块带AI核的板子,调个驱动,跑通一个ResNet50推理,就算搞定了。我最初也是这么想的。去年在某跨平台…

2026/10/13 15:02:33 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →