Dubbo整合Spring服务注册与暴露机制深度解析
1. 从一次线上服务找不到Provider说起很多同学第一次接触分布式服务框架时都会遇到一个很迷惑的现象本地写好了服务实现类Spring 容器也启动了日志里没报任何错但消费者端就是调用不到报No provider available。这个问题十有八九出在服务注册和暴露这一环。Dubbo 整合 Spring 之后服务的注册与暴露并不是靠你手动new一个对象然后调个方法就完事了它背后是一整套围绕 Spring 容器生命周期展开的机制。这篇内容就围绕 Dubbo 整合 Spring 后服务是怎么一步步被注册到注册中心、又是怎么暴露出去供消费者调用的这条主线来讲。我会把整个链路上的关键节点拆开包括 Spring 的扩展点是怎么被 Dubbo 利用的、服务 Bean 是怎么被扫描和处理的、注册中心里到底写了什么、暴露的时机为什么很关键。适合已经用过 Dubbo 但对其内部机制一知半解的同学也适合正在排查服务注册相关问题的开发者。看完之后你至少能搞清楚一件事为什么你的服务没暴露出去以及该从哪个环节去查。2. Dubbo 与 Spring 整合的入口那些被忽略的扩展点2.1 为什么 Dubbo 要深度绑定 Spring 的生命周期Dubbo 本身是一个独立的 RPC 框架理论上不依赖 Spring 也能跑。但实际项目里几乎都是和 Spring 一起用原因很简单Spring 负责管理对象的创建、依赖注入和生命周期而 Dubbo 的服务实现类、配置、注册中心连接这些资源天然适合交给 Spring 来托管。如果 Dubbo 自己再搞一套容器就会和 Spring 的 Bean 管理产生冲突比如同一个服务实现类被创建两次、依赖注入失效等问题。所以 Dubbo 选择了一条更聪明的路它不抢 Spring 的活而是通过 Spring 提供的扩展点把自己嵌进 Spring 的启动流程里。这样服务实现类依然是普通的 Spring Bean依赖注入照常工作而 Dubbo 只在合适的时机介入完成服务的注册和暴露。理解这一点是理解后面所有机制的前提。2.2 三个核心扩展点的分工Dubbo 整合 Spring 主要依赖三个扩展点它们各自负责不同的阶段扩展点触发时机主要职责BeanDefinitionRegistryPostProcessorBean 定义注册阶段扫描注解、解析配置把服务定义注册成 BeanDefinitionBeanPostProcessorBean 实例化前后对标注了服务注解的 Bean 进行包装生成代理或引用ApplicationListener容器刷新完成事件触发服务的注册与暴露连接注册中心这三个扩展点的执行顺序是固定的Spring 在启动时会先执行BeanDefinitionRegistryPostProcessor再执行BeanPostProcessor最后在容器刷新完成后发布事件。Dubbo 正是踩着这个节奏把服务注册和暴露安排在了最后一步。很多同学服务没暴露就是因为没搞清楚这个顺序以为 Bean 一创建就应该注册了实际上要等到容器完全启动。2.3 注解驱动与 XML 配置的差异早期 Dubbo 项目大多用 XML 配置dubbo:service标签一写服务就暴露了。现在主流是注解驱动DubboService或者老版本的Service标注在实现类上。这两种方式在注册和暴露的最终结果上是一样的但触发路径不同。XML 方式下Dubbo 自定义的命名空间解析器会在解析配置文件时直接把服务配置转换成ServiceBean的 BeanDefinition注册到容器里。而注解方式下需要一个扫描器去遍历指定包路径找到带注解的类再为它们生成对应的 BeanDefinition。这个扫描动作就发生在BeanDefinitionRegistryPostProcessor阶段。如果你注解方式下服务没注册上第一个要查的就是扫描包路径配对了没有以及注解有没有写对。3. 服务 Bean 的注册从注解到 BeanDefinition 的完整链路3.1 扫描器是怎么找到你的服务实现类的注解驱动下Dubbo 提供了一个类似ComponentScan的扫描机制。它会在BeanDefinitionRegistryPostProcessor的回调里根据你配置的包路径用类路径扫描工具去遍历所有 class 文件。每扫到一个类就检查它上面有没有 Dubbo 的服务注解。这里有个容易踩的坑扫描的包路径如果写得太宽会把一些不该被当作服务的类也扫进来写得太窄又漏掉真正的服务实现类。更隐蔽的问题是如果你的服务实现类是通过动态代理或者工厂方法生成的扫描器可能根本看不到注解因为注解不在最终的类上。这种情况就得改用编程式注册或者 XML 配置。扫描到目标类之后Dubbo 会为它构建一个ServiceBean的 BeanDefinition。注意这里注册的不是你的服务实现类本身而是一个ServiceBean你的实现类会作为它的一个属性被引用进去。这个设计很关键因为ServiceBean承担了后续注册和暴露的全部逻辑它相当于一个包装器。3.2 ServiceBean 的继承体系透露了什么ServiceBean这个类不是凭空冒出来的它继承自ServiceConfig而ServiceConfig才是真正承载服务配置和暴露逻辑的核心类。这个继承关系说明了一件事ServiceBean本质上是一个被 Spring 管理的ServiceConfig它既有 Spring Bean 的生命周期特性又有 Dubbo 服务配置的能力。ServiceConfig里有一堆关键属性比如interface、ref、registry、protocol、export等。其中ref指向真正的服务实现类实例export决定这个服务是否要暴露。很多同学服务没暴露就是因为某个环节把export设成了 false或者ref没注入进来导致空指针被吞掉了。ServiceBean还实现了InitializingBean、DisposableBean、ApplicationListener等接口。这意味着它在 Bean 初始化完成后会执行afterPropertiesSet在容器关闭时会执行destroy在容器刷新完成时会收到事件通知。服务的注册和暴露就发生在这些回调里。3.3 依赖注入阶段埋下的伏笔在 Bean 的依赖注入阶段ServiceBean的ref属性会被注入真正的服务实现类实例。这个注入过程是标准的 Spring 依赖注入但有一个细节值得注意如果服务实现类本身还依赖其他 Bean这些依赖也会在这一阶段被解析和注入。这里有个经典的循环依赖问题。假设服务 A 依赖服务 B服务 B 又依赖服务 A在普通 Spring 场景下可能通过三级缓存解决但 Dubbo 的ServiceBean包装了一层之后循环依赖的处理会变得更复杂。实际项目中如果遇到启动时死锁或者栈溢出可以往这个方向排查。我的经验是尽量避免服务实现类之间直接互相依赖实在需要的话用Lazy或者把公共逻辑抽到独立的 Bean 里。4. 服务暴露的时机为什么容器刷新完成才是关键节点4.1 暴露动作为什么不能提前服务暴露的核心动作包括启动本地服务端口、连接注册中心、把服务信息写入注册中心。这三件事里连接注册中心和写注册中心都依赖网络而启动本地端口依赖协议配置。如果这些动作在 Bean 初始化阶段就执行会有一个致命问题此时 Spring 容器还没完全启动其他 Bean 可能还没准备好服务实现类依赖的资源可能不可用。更实际的问题是如果服务暴露过程中需要用到其他 Bean而这些 Bean 还没初始化完就会拿到不完整的对象。Dubbo 把暴露时机放在容器刷新完成事件里就是为了确保所有 Bean 都已经就绪依赖注入全部完成这时候再暴露服务才是安全的。这个设计思路和 Spring 自己的ContextRefreshedEvent用法是一致的。4.2 暴露流程的三个阶段服务暴露的完整流程可以拆成三个阶段每个阶段都有明确的职责本地暴露在本地启动一个服务端口使用配置的协议比如 Dubbo 协议默认端口 20880。这一步不涉及注册中心纯粹是让服务能在本地被调用。本地暴露的意义在于同一个 JVM 内的消费者可以直接走本地调用省去网络开销。远程暴露把服务信息注册到注册中心让远程消费者能发现这个服务。注册的信息包括服务接口全限定名、版本号、分组、协议、IP、端口等。注册中心收到这些信息后会通知订阅了该服务的消费者。注册中心连接在暴露之前Dubbo 需要先和注册中心建立连接。如果注册中心连不上暴露会失败。这里有个细节Dubbo 默认会重试注册重试次数和间隔可以配置。如果注册中心临时不可用服务暴露会阻塞一段时间这段时间内应用启动会被拖慢。4.3 暴露过程中的异常处理暴露过程中最常见的异常是端口被占用和注册中心连接失败。端口被占用通常是因为上一个应用实例还没完全关闭或者配置的端口和别的服务冲突。注册中心连接失败可能是网络问题也可能是注册中心地址配错了。Dubbo 对这两类异常的处理策略不同。端口占用会直接抛异常导致应用启动失败因为本地端口是服务暴露的基础起不来就没法提供服务。注册中心连接失败则取决于配置如果配置了checkfalseDubbo 会跳过检查继续启动但服务实际上没有注册成功消费者依然找不到。很多同学遇到服务启动了但消费者调不到的情况就是这里配了checkfalse但没意识到注册其实失败了。提示生产环境建议把注册中心检查打开让问题在启动阶段就暴露出来而不是等到消费者调用时才报错。5. 注册中心里到底写了什么服务信息的结构5.1 注册信息的核心字段服务注册到注册中心后注册中心里存的到底是什么这个问题很多人没深究过。以常见的注册中心为例一个服务注册后会生成一个类似树形或者键值对的结构核心字段包括服务接口全限定名比如com.example.DemoService这是服务的唯一标识。版本号用于区分同一接口的不同版本灰度发布时常用。分组用于逻辑隔离不同分组之间互不可见。协议比如 dubbo、rest、hessian 等决定消费者用什么方式调用。IP 和端口服务提供者的实际地址。权重用于负载均衡权重越高被选中的概率越大。超时时间服务级别的超时配置。这些字段组合起来构成了一个完整的服务地址。消费者订阅服务时就是根据接口名、版本号、分组这些条件去注册中心匹配拿到地址列表后缓存在本地再根据负载均衡策略选一个地址发起调用。5.2 注册中心的节点类型注册中心里的节点通常分几类服务节点、消费者节点、配置节点、路由节点。服务节点记录提供者信息消费者节点记录订阅关系配置节点存动态配置路由节点存路由规则。服务暴露时主要写的是服务节点同时会触发消费者节点的更新通知。这里有个容易混淆的点服务暴露写的是提供者信息但消费者订阅后注册中心会把提供者列表推送给消费者。如果提供者列表为空消费者就会报No provider available。所以排查这个问题时要先确认注册中心里到底有没有提供者节点再看消费者有没有正确订阅。5.3 注册信息的动态更新服务注册不是一次性的运行过程中如果服务提供者的权重变了、或者有新的提供者上线注册中心里的信息会动态更新。Dubbo 通过注册中心的通知机制把这些变更推送给消费者。消费者收到通知后更新本地的地址列表。这个机制带来一个好处服务扩容时新实例注册后消费者能很快感知到流量会自动分摊过去。但也有一个坑如果注册中心的通知延迟比较大消费者感知新实例会有滞后这段时间内新实例可能收不到流量。所以做压测或者扩容时要留出足够的预热时间。6. 本地暴露与远程暴露的区别别把两者搞混6.1 本地暴露解决的是什么问题本地暴露这个概念很多同学第一次听到会懵既然都要暴露了为什么还分本地和远程本地暴露的核心目的是让同一个 JVM 内的服务调用不走网络。比如一个应用里服务 A 调服务 B如果 B 已经在本 JVM 里暴露了A 就可以直接通过本地引用调用 B省去序列化和网络传输的开销。本地暴露的实现方式是在 JVM 内维护一个服务映射表key 是服务接口加版本加分组value 是服务实现类的引用。消费者调用时先查这个映射表命中就走本地调用没命中才走远程。这个机制在单体应用拆分成微服务的过渡阶段特别有用可以逐步把本地调用改成远程调用降低改造风险。6.2 远程暴露的完整链路远程暴露才是我们通常说的服务暴露。它的链路更长先启动本地服务端口然后把服务信息注册到注册中心最后等待消费者连接。远程暴露依赖网络所以对网络配置、防火墙、端口开放这些基础设施有要求。远程暴露时Dubbo 会根据配置的协议启动对应的服务端。以 Dubbo 协议为例它会启动一个 Netty 服务端监听配置的端口。消费者连接上来后通过 Dubbo 协议进行通信。如果协议配的是 REST那启动的就是一个 HTTP 服务端。不同协议的暴露方式不同但注册到注册中心的信息结构是类似的。6.3 两种暴露的配置开关Dubbo 里控制本地暴露和远程暴露的配置项是scope取值可以是local、remote、none。默认是remote也就是只做远程暴露。如果配成local就只做本地暴露不注册到注册中心。如果配成none就都不暴露这个服务只能被本地直接引用不能通过 Dubbo 调用。实际项目中scope配错的概率不高但有一个场景容易出问题单元测试时如果不想连注册中心可以把scope配成local但忘了改回来就打包上线了结果服务没注册线上消费者调不到。这种问题排查起来很费时间因为本地测试一切正常。7. 排查服务注册与暴露问题的实战思路7.1 从日志入手定位卡点Dubbo 在服务注册和暴露的每个关键节点都会打日志。启动时如果看到Export dubbo service开头的日志说明服务开始暴露了。如果看到Register dubbo service开头的日志说明开始往注册中心注册了。如果这两条日志都没出现说明暴露流程根本没触发问题出在更前面的环节比如扫描没扫到、export配成了 false。如果日志停在某一步不动了比如卡在注册中心连接上那就要查注册中心地址和网络。Dubbo 默认的连接超时是 3 秒重试次数是 3 次如果注册中心不可用启动会卡十几秒然后报错。这个时间可以通过配置调整但不建议调得太短否则网络抖动时容易误判。7.2 用注册中心客户端直接查节点日志只能告诉你流程走到哪了要确认注册中心里到底有没有数据最直接的办法是用注册中心自带的客户端或者命令行工具去查。比如查某个服务接口下的提供者列表如果列表为空说明注册没成功如果有数据但消费者还是调不到那问题可能在消费者端的订阅或者网络。查节点时要注意版本号和分组这两个字段是服务匹配的关键。如果提供者注册的是1.0.0版本消费者订阅的是2.0.0那肯定匹配不上。分组也是同理提供者在group-a消费者在group-b互相看不见。7.3 常见问题对照表现象可能原因排查方向启动无暴露日志扫描包路径不对、注解缺失、exportfalse检查配置和注解暴露日志有但注册失败注册中心地址错、网络不通、checkfalse 掩盖了错误查注册中心连接和配置注册成功但消费者调不到版本/分组不匹配、消费者未订阅、网络隔离对比提供者和消费者配置启动卡住很久注册中心连接超时重试检查注册中心可用性本地能调远程不能调scope 配成了 local检查 scope 配置这张表基本覆盖了服务注册和暴露环节八成以上的问题。实际排查时按这个顺序走一遍大部分问题都能定位到。7.4 一个容易被忽略的细节服务实现类的代理如果服务实现类上用了 Spring 的Transactional或者Async这类注解Spring 会为它生成一个代理对象。Dubbo 在暴露服务时ref指向的是这个代理对象而不是原始对象。这本身没问题但如果代理方式选的是 JDK 动态代理而服务接口没有实现任何接口就会报错。解决办法是把代理方式改成 CGLIB或者确保服务实现类实现了接口。这个坑在整合 Spring 和 Dubbo 时特别常见因为单独用 Spring 时可能没注意加上 Dubbo 之后就暴露出来了。我的建议是服务实现类尽量都实现接口这样既符合面向接口编程的原则也能避免代理相关的坑。8. 几个提升稳定性的配置经验服务注册和暴露这块有几个配置项对稳定性影响很大但默认值不一定适合所有场景。第一个是注册中心的连接超时和重试次数默认值偏保守在网络不稳定的环境里可以适当调大避免启动时因为短暂抖动就失败。第二个是服务的export和register开关这两个开关要配合使用export控制是否暴露register控制是否注册如果只想本地暴露不注册就把register设为 false。第三个是服务暴露的线程池配置。服务暴露时会启动服务端服务端需要线程池来处理请求。默认的线程池大小是 200对于高并发场景可能不够可以根据实际压测结果调整。但也不是越大越好线程太多会导致上下文切换开销增加反而降低吞吐。我的经验是从 200 开始根据压测的 QPS 和响应时间逐步调整找到拐点。还有一个经验是关于服务版本的。生产环境建议给每个服务都显式指定版本号不要依赖默认值。因为默认版本是0.0.0如果多个服务都用默认版本一旦接口有变更消费者可能调到旧版本的服务上。显式指定版本号后升级时可以通过版本号做灰度先让一部分消费者用新版本观察没问题再全量切换。最后说一个关于注册中心选型的事。不同的注册中心在一致性、可用性、推送延迟上表现不同选择时要结合自己的场景。如果对服务发现的一致性要求高选强一致的注册中心如果对可用性要求高选最终一致的。这个选择没有绝对的好坏只有适不适合。我在实际项目里踩过的坑是一开始选了某个注册中心后来业务量上来了发现推送延迟变大消费者感知新实例变慢扩容效果打折扣最后换了另一个才解决。所以选型时最好做一下压测看看推送延迟在预期负载下是什么水平。

相关新闻

手动部署OpenTelemetry Collector:从配置到运维的实践指南

手动部署OpenTelemetry Collector:从配置到运维的实践指南

简介:基于C#编写的winform Socket通信示例,面向需要掌握网络编程的C#初学者,演示了服务端与多个客户端同时连接与数据交互的实现过程。压缩包内包含服务端与客户端两个独立工程,可对照学习服务端监听、客户端连接以及多客户端并发…

2026/10/15 0:05:58 阅读更多 →
SpringBoot整合knife4j实战:接口文档与在线调试完整指南

SpringBoot整合knife4j实战:接口文档与在线调试完整指南

1. 为什么接口文档这件事值得单独拎出来聊做后端开发的人都有一个共识:写接口不难,难的是让前端、测试、甚至未来的自己看懂接口。早些年大家用 Swagger 那一套,ApiOperation、ApiModel注解满天飞,UI 长得像上世纪的产物&#xff…

2026/10/15 0:05:58 阅读更多 →
openrig 实战:用 tmux 与 Node.js 编排 Claude Code 和 Codex 多代理工作流

openrig 实战:用 tmux 与 Node.js 编排 Claude Code 和 Codex 多代理工作流

1. openrig 到底想解决什么问题第一次看到 openrig 这个名字,加上关联的 Claude Code、Codex、Node.js、tmux 这几个词,我脑子里冒出来的判断是:这大概率是一个把多个 AI 编码工具统一编排起来的工程化脚手架。后来实际折腾了一圈&#xff0c…

2026/10/15 0:04:56 阅读更多 →

最新新闻

区间DP解“拿糖果”:从贪心误区到最优策略实战解析

区间DP解“拿糖果”:从贪心误区到最优策略实战解析

说实话,我第一次看到“拿糖果”这道题的时候,差点把它当成热身题给秒了。题面本身非常朴素:有 n 堆糖果排成一行,每堆糖果数量用一个整数数组表示,两个人轮流从最左端或最右端拿走一整堆,直到全部取完&…

2026/10/15 0:46:40 阅读更多 →
光通信技术突破:陶瓷封装与智能光功率控制解析

光通信技术突破:陶瓷封装与智能光功率控制解析

1. 光通信行业现状与易天定位光纤通信作为现代信息社会的基石,其市场规模在过去五年保持着年均12%的复合增长率。根据行业调研数据显示,2023年全球光模块出货量已突破1.8亿只,其中数据中心互连场景占比达到47%。在这个快速扩张的市场中&#…

2026/10/15 0:46:40 阅读更多 →
CEC2010到CEC2017:进化计算基准测试集完整指南与避坑经验

CEC2010到CEC2017:进化计算基准测试集完整指南与避坑经验

简介:面向进化计算与智能优化领域的研究者、工程师及高校学生,这份测试集汇总了CEC2010、CEC2013、CEC2014、CEC2015、CEC2017等历届单目标实参数优化竞赛的基准问题,可用于验证和对比各类新颖优化算法的寻优能力与收敛性能。压缩包内共516个…

2026/10/15 0:45:39 阅读更多 →
Z源逆变器仿真建模与PWM控制策略详解

Z源逆变器仿真建模与PWM控制策略详解

1. Z源逆变器概述与仿真意义Z源逆变器作为电力电子领域的重要拓扑结构,近年来在新能源发电、电动汽车和工业驱动等领域展现出独特优势。与传统电压源型和电流源型逆变器不同,Z源网络通过独特的阻抗网络实现了升降压功能,同时避免了传统拓扑中…

2026/10/15 0:45:39 阅读更多 →
普通程序员有没有必要学习 Agent 开发?从零手写 ReAct Agent 到 LangGraph 实战

普通程序员有没有必要学习 Agent 开发?从零手写 ReAct Agent 到 LangGraph 实战

一、先说结论:有必要,而且窗口期就在当下 如果你是一个每天写 CRUD、调接口、改 Bug 的普通后端 / 前端 / 全栈程序员,看到「Agent」「智能体」这些词,第一反应很可能是:“这不就是调一下大模型 API 吗?跟我…

2026/10/15 0:45:39 阅读更多 →
深入理解 Claude Code:CLAUDE.md、Hooks、Skills、Subagents 全解析

深入理解 Claude Code:CLAUDE.md、Hooks、Skills、Subagents 全解析

1. 引言 Claude Code 是 Anthropic 推出的命令行 AI 编程助手,它不仅能理解自然语言指令,还能通过一系列机制实现高度可定制、可扩展的自动化编码工作流。对于想要真正驾驭 Claude Code 的开发者来说,仅仅会提问远远不够,理解其四…

2026/10/15 0:45:39 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →