所有 notable 变更记录如下。格式参考 Keep a Changelog。
- fix(lifecycle): 恢复 GoBackground void 签名满足 lifecycle.App 接口——v0.7.9 的 #186 签名回归导致 kitex/hertz RunServer 编译断裂;error 语义保留为新增 TryGoBackground(nacos 延迟注册与测试迁移)。
- 5 单修复:beforeServe panic 隔离(#201)、ReadyFatalOverride 三态(#202)、WithReadyTimeout(0) 归一(#203)、drain 超时告警 running 计数(#205)、WithShutdownTimeout(0) 归一(#206);地板对齐 pkg v0.47.0/core v0.15.1。
- Go 1.26 现代化:healthz.go sort.Slice→slices.SortFunc、计数循环→range N;全模块依赖地板对齐 concurrency v0.34.1。纯等价重构+地板追平,行为零变更。
- Go 1.26 现代化:healthz.go sort.Slice→slices.SortFunc、计数循环→range N;全模块依赖地板对齐 concurrency v0.34.1。纯等价重构+地板追平,行为零变更。
- Go 1.26 现代化:healthz.go sort.Slice→slices.SortFunc、计数循环→range N;全模块依赖地板对齐 concurrency v0.34.1。纯等价重构+地板追平,行为零变更。
- 全仓 issue 清零(#177-#183):drainClosers 收敛 closer 执行引擎(#177)、runCloserWithBudget 与 core/lifecycle 对齐性钉住(#178)、waitWithTimeout 单源「wg.Wait 带超时放弃」(#179)、nacos Init 拆函数拆文件(#180)、mergeTeardownErrs 收敛关停错误并入(#181)、panic→error 四出口收编 pkg/errors.Recovered(#182)、WorkerManager.Wait 并发注册竞态修复(#183);Go 地板 1.26.0 + pkg v0.45.0/logx v0.10.0/metrics v0.3.0/registry v0.5.15/registry/nacos v0.1.14/registry/nacosimpl v0.2.0 地板对齐
关联问题单:bootstrap#177、bootstrap#178、bootstrap#179、bootstrap#180、bootstrap#181、bootstrap#182、bootstrap#183。
- 全仓 issue 清零(#177-#183):drainClosers 收敛 closer 执行引擎(#177)、runCloserWithBudget 与 core/lifecycle 对齐性钉住(#178)、waitWithTimeout 单源「wg.Wait 带超时放弃」(#179)、nacos Init 拆函数拆文件(#180)、mergeTeardownErrs 收敛关停错误并入(#181)、panic→error 四出口收编 pkg/errors.Recovered(#182)、WorkerManager.Wait 并发注册竞态修复(#183);Go 地板 1.26.0 + pkg v0.45.0/logx v0.10.0/metrics v0.3.0/registry v0.5.15/registry/nacos v0.1.14/registry/nacosimpl v0.2.0 地板对齐
关联问题单:bootstrap#177、bootstrap#178、bootstrap#179、bootstrap#180、bootstrap#181、bootstrap#182、bootstrap#183。
- 全仓 issue 清零(#177-#183):drainClosers 收敛 closer 执行引擎(#177)、runCloserWithBudget 与 core/lifecycle 对齐性钉住(#178)、waitWithTimeout 单源「wg.Wait 带超时放弃」(#179)、nacos Init 拆函数拆文件(#180)、mergeTeardownErrs 收敛关停错误并入(#181)、panic→error 四出口收编 pkg/errors.Recovered(#182)、WorkerManager.Wait 并发注册竞态修复(#183);Go 地板 1.26.0 + pkg v0.45.0/logx v0.10.0/metrics v0.3.0/registry v0.5.15/registry/nacos v0.1.14/registry/nacosimpl v0.2.0 地板对齐
关联问题单:bootstrap#177、bootstrap#178、bootstrap#179、bootstrap#180、bootstrap#181、bootstrap#182、bootstrap#183。
-
- fix: WithShutdownHook 关闭钩子改为前置窗口——drain 之后、AddResource 资源关闭之前执行(flush/WAL 摘要/许可证类钩子的依赖资源仍在位),不再静默排到 app-lifecycle:wait 之后;ShutdownHookComponent 新增 Late 字段显式选择旧晚窗位置(#168)
-
- fix: 启动失败回滚(组件 Init 失败 / beforeServe 失败)的回滚期关停错误并入 Run 返回值("; rollback: " 附加,errors.Join 保持 errors.Is 可分流),不再只进日志(#169)
-
- build: 依赖地板对齐(floor sync,无代码变更)
-
- build: 依赖地板对齐(第二轮发版后 floor sync,无代码变更)
-
- build: 嵌套自依赖对齐——bootstrap v0.7.3(floor sync,无代码变更)
-
- build: 嵌套自依赖对齐——bootstrap v0.7.3(floor sync,无代码变更)
-
- build: 依赖地板对齐(floor sync,无代码变更)
-
- build: 依赖地板对齐(floor sync,无代码变更)
-
- build: 依赖地板对齐(floor sync,无代码变更)
-
- build: 依赖地板对齐(floor sync,无代码变更)
-
- fix: Run 关停后 userFn 晚到错误改为带界等待补收(2s grace),不再静默丢弃;界外如实声明(#141)
关联问题单:bootstrap#141。
- fix(app): closer panic 隔离——坏 Close 不再中断逆序停机链(#132)
- fix(bootstrapper): AddComponent 就地回填 ServiceNameAware(#131)
- feat(app): App.Fail 显式失败出口——ReadyFatal/Required 注册失败真正中止 Run(#133)
- fix(app): SetWaitTimeout(0)/AddResourceTimeout 与 shutdown 预算解耦(#134 #135)
- feat(nacos): Register 取消 best-effort 反注册 + PhaseAbandoned 阶段(#136)
关联问题单:bootstrap#131、bootstrap#132、bootstrap#133、bootstrap#134、bootstrap#135、bootstrap#136。
- build: 依赖地板对齐——本版把 oekit 依赖地板抬到各依赖当前最新已发布版本(matrix-tools/scripts/align_floors.py 维护轮)
- build: 依赖地板对齐——本版把 oekit 依赖地板抬到各依赖当前最新已发布版本(matrix-tools/scripts/align_floors.py 维护轮)
- build: 依赖地板对齐——本版把 oekit 依赖地板抬到各依赖当前最新已发布版本(matrix-tools/scripts/align_floors.py 维护轮)
- build: 父模块地板对齐(嵌套 go.mod 的父仓 require 跟随最新,audit 门禁项)
- build: 父模块地板对齐(嵌套 go.mod 的父仓 require 跟随最新,audit 门禁项)
- fix(worker): AddTicker 改完成驱动节拍 + CloseTimeout——慢任务不再背靠背补跑,Close 可超时放弃等待(#98)
- fix(worker): AddTicker 入口校验 interval>0(ErrInvalidInterval)——零/负值不再使周期任务 panic 后静默死亡(#101)
- fix(worker): AddTicker/AddOnce 在 Close 后返回错误(ErrManagerClosed)——静默吞注册关闭(#103)
- fix(app): closeAll 改「锁内拷贝、锁外执行」——closer 内回调 AddResource/SetWaitTimeout 不再死锁(#102)
- fix(app): close 阶段收敛循环——关停竞态窗口注册的 closer 也被执行,closeAll 期间 AddResource 反注册不再漏调(#99)
- fix(app): GoBackground 的 wg.Add 与 shutdown 期 wg.Wait 同锁全序化——WaitGroup 规则违例窗口关闭(#104)
- feat(app): AddResourceTimeout——逐资源关停预算(预算隔离 + 父 ctx 取消传播),Manager 用户不再手写适配层(#75)
- test(nacos): NNSComponent.ReadyTimeout 字段优先级回归——组件字段压过进程级全局(#100)
- feat(healthz): Degraded(err) 三态语义对齐 hertz/health——软依赖降级不触发 503、Result.Degraded 字段;与 hertz/health 的规范与差异文档化(#140)
- fix(nacos): Required=true 注册失败 RequestShutdown——强依赖 fail-fast 贯穿注册面(nns#77)
- fix(obs): 空 Endpoint 也装本地 provider+全局传播器——obs.WithTracing 与直接 tracing.Init 语义对齐(tracing#60)
关联问题单:bootstrap#75、bootstrap#98、bootstrap#99、bootstrap#100、bootstrap#101、bootstrap#102、bootstrap#103、bootstrap#104。
- fix(worker): AddTicker 改完成驱动节拍 + CloseTimeout——慢任务不再背靠背补跑,Close 可超时放弃等待(#98)
- fix(worker): AddTicker 入口校验 interval>0(ErrInvalidInterval)——零/负值不再使周期任务 panic 后静默死亡(#101)
- fix(worker): AddTicker/AddOnce 在 Close 后返回错误(ErrManagerClosed)——静默吞注册关闭(#103)
- fix(app): closeAll 改「锁内拷贝、锁外执行」——closer 内回调 AddResource/SetWaitTimeout 不再死锁(#102)
- fix(app): close 阶段收敛循环——关停竞态窗口注册的 closer 也被执行,closeAll 期间 AddResource 反注册不再漏调(#99)
- fix(app): GoBackground 的 wg.Add 与 shutdown 期 wg.Wait 同锁全序化——WaitGroup 规则违例窗口关闭(#104)
- feat(app): AddResourceTimeout——逐资源关停预算(预算隔离 + 父 ctx 取消传播),Manager 用户不再手写适配层(#75)
- test(nacos): NNSComponent.ReadyTimeout 字段优先级回归——组件字段压过进程级全局(#100)
- feat(healthz): Degraded(err) 三态语义对齐 hertz/health——软依赖降级不触发 503、Result.Degraded 字段;与 hertz/health 的规范与差异文档化(#140)
- fix(nacos): Required=true 注册失败 RequestShutdown——强依赖 fail-fast 贯穿注册面(nns#77)
- fix(obs): 空 Endpoint 也装本地 provider+全局传播器——obs.WithTracing 与直接 tracing.Init 语义对齐(tracing#60)
关联问题单:bootstrap#75、bootstrap#98、bootstrap#99、bootstrap#100、bootstrap#101、bootstrap#102、bootstrap#103、bootstrap#104。
- fix(worker): AddTicker 改完成驱动节拍 + CloseTimeout——慢任务不再背靠背补跑,Close 可超时放弃等待(#98)
- fix(worker): AddTicker 入口校验 interval>0(ErrInvalidInterval)——零/负值不再使周期任务 panic 后静默死亡(#101)
- fix(worker): AddTicker/AddOnce 在 Close 后返回错误(ErrManagerClosed)——静默吞注册关闭(#103)
- fix(app): closeAll 改「锁内拷贝、锁外执行」——closer 内回调 AddResource/SetWaitTimeout 不再死锁(#102)
- fix(app): close 阶段收敛循环——关停竞态窗口注册的 closer 也被执行,closeAll 期间 AddResource 反注册不再漏调(#99)
- fix(app): GoBackground 的 wg.Add 与 shutdown 期 wg.Wait 同锁全序化——WaitGroup 规则违例窗口关闭(#104)
- feat(app): AddResourceTimeout——逐资源关停预算(预算隔离 + 父 ctx 取消传播),Manager 用户不再手写适配层(#75)
- test(nacos): NNSComponent.ReadyTimeout 字段优先级回归——组件字段压过进程级全局(#100)
- feat(healthz): Degraded(err) 三态语义对齐 hertz/health——软依赖降级不触发 503、Result.Degraded 字段;与 hertz/health 的规范与差异文档化(#140)
- fix(nacos): Required=true 注册失败 RequestShutdown——强依赖 fail-fast 贯穿注册面(nns#77)
- fix(obs): 空 Endpoint 也装本地 provider+全局传播器——obs.WithTracing 与直接 tracing.Init 语义对齐(tracing#60)
关联问题单:bootstrap#75、bootstrap#98、bootstrap#99、bootstrap#100、bootstrap#101、bootstrap#102、bootstrap#103、bootstrap#104。
- build: 矩阵依赖地板对齐(第二轮发版后置·终圈)
- build: 矩阵依赖地板对齐(第二轮发版后置·终圈)
- build: 矩阵依赖地板对齐(第二轮发版后置·终圈)
- build: 矩阵依赖地板对齐(第二轮发版后置·收敛圈)
- build: 矩阵依赖地板对齐(第二轮发版后置·收敛圈)
- build: 矩阵依赖地板对齐(第二轮发版后置·收敛圈)
- build: 矩阵依赖地板对齐(第二轮发版后置)
- build: 矩阵依赖地板对齐(第二轮发版后置)
- build: 矩阵依赖地板对齐(第二轮发版后置)
- build: 矩阵依赖地板对齐(第二轮发版后置)
- build: 矩阵依赖地板对齐(维护轮 #233)
- build: 矩阵依赖地板对齐(维护轮 #233)
- build: 矩阵依赖地板对齐(维护轮 #233)
- build: 矩阵依赖地板对齐(维护轮 #233)
- BREAKING fix(app): 关停错误上抛——资源关闭失败时退出码不再为 0(#80)——
closeAll对 closer 错误只logger.Error后继续,错误进不了 lifecycle.Manager 的 shutdownErrs;Run只返回 runErr——资源关闭失败(DB flush 未落盘、连接未优雅断开)时进程退出码仍为 0,滚动发版门禁 / K8s preStop 对账把「带着未落盘数据退出」判成成功,数据丢失在部署链路上不可见。修法:closeAll 聚合错误(带资源名,errors.Is 可辨)→ app-lifecycle:close job 返回→ shutdownErrs → Run 末尾上抛(runErr 优先,关停错误 join 附加)。升级可见:依赖『rr==nil 即干净关停」的消费方(如欠面把 AddResource 错误当告警的场景)退出码会变——这正是本修复的目的;需旧行为请在 closer 内部自行容错 - docs(nacos):
WithReadyTimeout作用域按实现修正为进程级全局(#76)——doc 曾宣称「须在 WithNNS 之前应用、仅作用于同一 Bootstrapper」,实现是包级 atomic(顺序无关、后写覆盖先写),同文件两处注释互相矛盾。按真实行为修正(进程全局、任何 Bootstrapper 的 NNS 组件 Init 时读取);多 Bootstrapper 场景需 per-作用域时用组件字段 NNSComponent.ReadyTimeout。行为零改变,只修文档(与 #74 的 WithReadyFatal 全局选项同一款式)
关联问题单:bootstrap#76、bootstrap#80。
- build: 矩阵依赖地板对齐(维护轮 #233)
- build: 把父仓 bootstrap v0.6.8 与 logx v0.8.2、registry v0.5.3、registry/nacos v0.1.3、registry/nacosimpl v0.1.4 的地板带进已发布产物(bootstrap/nacos、bootstrap/obs 原快照嵌的是更旧的父仓与跨仓地板,消费方拿不到最新内容)(bootstrap#70)
关联问题单:bootstrap#70。
- build: 把父仓 bootstrap v0.6.8 与 logx v0.8.2、registry v0.5.3、registry/nacos v0.1.3、registry/nacosimpl v0.1.4 的地板带进已发布产物(bootstrap/nacos、bootstrap/obs 原快照嵌的是更旧的父仓与跨仓地板,消费方拿不到最新内容)(bootstrap#70)
关联问题单:bootstrap#70。
- 抬嵌套模块地板 github.com/oekit/registry/nacosimpl v0.1.0 → v0.1.1(oekit/oekit#104)
- 抬嵌套模块地板 github.com/oekit/registry/nacosimpl v0.1.0 → v0.1.1(oekit/oekit#104)
- 抬嵌套模块地板 github.com/oekit/registry/nacosimpl v0.1.0 → v0.1.1(oekit/oekit#104)
- build: 矩阵内依赖地板
nnsv0.5.4 → v0.5.5(嵌套模块 nacos 跟随;本版不含 API 变更)
- build: 矩阵内依赖地板
nnsv0.5.4 → v0.5.5(嵌套模块 nacos 跟随;本版不含 API 变更)
- build: 矩阵内依赖地板
nnsv0.5.4 → v0.5.5(嵌套模块 nacos 跟随;本版不含 API 变更)
- build: 矩阵内依赖地板
tracingv0.3.1 → v0.3.2(嵌套模块 obs 跟随;本版不含 API 变更)
- build: 矩阵内依赖地板
tracingv0.3.1 → v0.3.2(嵌套模块 obs 跟随;本版不含 API 变更)
- build: 父模块依赖地板 v0.6.4 → v0.6.5(跟随 bootstrap v0.6.5;父模块地板不得落后最新 tag)
- build: 父模块依赖地板 v0.6.4 → v0.6.5(跟随 bootstrap v0.6.5;父模块地板不得落后最新 tag)
- feat(nacos): 就绪门漏接的可观测性——看门狗超时打 ERROR 点明「服务不会注册到注册中心」(WithReadyTimeout 可调)+ NNSComponent.RegistrationState() 暴露注册阶段(#33)
- feat(nacos): 就绪门漏接的可观测性——看门狗超时打 ERROR 点明「服务不会注册到注册中心」(WithReadyTimeout 可调)+ NNSComponent.RegistrationState() 暴露注册阶段(#33)
- build: 父模块依赖地板 v0.6.3 → v0.6.4(跟随 bootstrap v0.6.4;父模块地板不得落后最新 tag)
- build: 父模块依赖地板 v0.6.3 → v0.6.4(跟随 bootstrap v0.6.4;父模块地板不得落后最新 tag)
- Go 最低版本地板 1.25.0 → 1.24.0(#33):12 个 indirect pin 同步降级到 nns/registry 已在用的 ≤1.24 组合(otel v1.41.0、grpc v1.80.0、client_golang v1.23.2、x/crypto v0.48.0 等);实测 tidy 保持 1.24.0(未被依赖顶回),真实 go1.24.0 工具链下 build+vet+test 全绿
- Go 最低版本地板 1.25.0 → 1.24.0(#33):12 个 indirect pin 同步降级到 nns/registry 已在用的 ≤1.24 组合(otel v1.41.0、grpc v1.80.0、client_golang v1.23.2、x/crypto v0.48.0 等);实测 tidy 保持 1.24.0(未被依赖顶回),真实 go1.24.0 工具链下 build+vet+test 全绿
- build: 跟随 bootstrap v0.6.3 发版(父模块地板 v0.6.2 → v0.6.3)
- build: 跟随 bootstrap v0.6.3 发版(父模块地板 v0.6.2 → v0.6.3)
- build: 矩阵内依赖地板对齐(align_floors 不动点):concurrency v0.5.4 → v0.17.0、logx v0.6.0 → v0.7.0
- docs(healthz): 包文档示例签名修正——Handle(ctx) 传参 + c.Data 直写(#4:RequestContext 恰好实现 context.Context 传 c 能编译但超时语义错;c.JSON 会双重编码 body)
- fix(deps): logx 地板 v0.5.0 → v0.6.0(零代码改动);嵌套 nacos/obs 同步
- chore(deps): 父模块地板 bootstrap v0.6.1 → v0.6.2(audit 嵌套地板门禁首发抓漏,matrix-tools#6)
- chore(deps): 父模块地板 bootstrap v0.6.1 → v0.6.2(audit 嵌套地板门禁首发抓漏,matrix-tools#6)
- chore(deps): 全部 oekit 依赖地板对齐最新
- chore(deps): 全部 oekit 依赖地板对齐最新
- feat!:
WithNNS注册延迟到App.Ready()之后——修复「注册先于 server 监听、反注册后于 server 关闭」双序错误,关停序 nns-deregister → server.Shutdown 对齐 kratos Stop
App.Ready()/App.ReadyChan()/App.IsReady()就绪门:配合 bootstrap/nacos v0.3.0 延迟注册, 服务须在 server 就绪后调用app.Ready()才会进入注册中心(推荐经 hertz/kitexRunServer的WithOnReady触发)。幂等、并发安全
- feat(bootstrapper):
WithBeforeServe(fn func() error)——组件初始化后、 userFn 前的启动钩子(失败中止启动)。覆盖零断点重启的 listener fd 收养 / pid 文件交接等「必须在引擎 serve 之前」的场景 (#3)
- bootstrap v0.5.3 地板跟随
- bootstrap v0.5.3、nns v0.3.5 地板跟随
- concurrency 地板 v0.5.4
- concurrency 地板 v0.5.4
- concurrency 地板 v0.5.2 → v0.5.4;嵌套 nacos/obs 同步
- fix(deps): core 转直接依赖(obs.go 迁移 core/lifecycle 后的 tidy 归位,CI tidy 门禁);bootstrap 地板 v0.5.2
- fix(deps): bootstrap 地板 v0.5.1 → v0.5.2(lifecycle 迁移版)
- fix(lifecycle): nns.go 迁移 logx/shutdown → core/lifecycle
- fix(lifecycle): 迁移 logx/shutdown(v0.5.0 起废弃)→ core/lifecycle.Manager——类型别名等价,仅 import 与构造符号替换;嵌套 nacos/obs 同步迁移;修复 CI staticcheck SA1019;go.mod 新增 core 直接依赖
- fix(deps): 嵌套模块地板全量对齐最新——bootstrap v0.5.1、logx v0.5.0、metrics v0.1.6、tracing v0.2.1;go 维持 1.26.0(tracing/OTel 生态传导)
- fix(deps): 嵌套模块地板全量对齐最新——bootstrap v0.5.1、core v0.6.0、logx v0.5.0、nns v0.3.4、registry v0.3.1;go 维持 1.25.0(nacos-sdk 图要求)
- fix(deps): 内部依赖地板 concurrency v0.1.5 → v0.5.2、logx v0.1.9 → v0.5.0;go 最低版本降至 1.24.0(自然落点)
仓库结构重置后的首个版本(历史与旧版本号 v0.1.0–v0.4.2 已清空重做,从 v0.5.0 起算)。
github.com/oekit/bootstrap # package bootstrap(模块根)
├── healthz/ # package healthz — 健康检查
├── nacos/ # 嵌套 module github.com/oekit/bootstrap/nacos
└── obs/ # 嵌套 module github.com/oekit/bootstrap/obs
- 核心包提升到模块根:import 从
github.com/oekit/bootstrap/bootstrap改为github.com/oekit/bootstrap(包名仍为bootstrap) - healthz 路径同步:
github.com/oekit/bootstrap/bootstrap/healthz→github.com/oekit/bootstrap/healthz - 嵌套 module
nacos/obs依赖改为require github.com/oekit/bootstrap v0.5.0replace => ../(仓内联编;对外发布忽略 replace)
bootstrap.New(opts...)/Run(userFn)— 应用骨架(App ctx + AddResource + GoBackground)NewApp(mgr)— attach 模式(不接管信号/server,与宿主协作)(#1)ServiceNameAware/AddComponent— 组件动态注入healthz— 多 check 并发探测、总超时、panic 隔离nacos.WithNNS/obs.WithMetrics— 嵌套 module 函数选项
| 旧 | 新 |
|---|---|
github.com/oekit/bootstrap/bootstrap |
github.com/oekit/bootstrap |
github.com/oekit/bootstrap/bootstrap/healthz |
github.com/oekit/bootstrap/healthz |