kratos.new() 启动 panic 的根本原因只有三个:未在 main() 开头调用 conf.load() 注册配置源、未创建 http/grpc.server 实例、未将实例传入 kratos.new() 的 server 参数列表;consul.new() 等构造函数返回 nil 时必须检查 error,否则传入 nil 会导致 panic。

kratos.New() 启动就 panic,90% 是配置、server、registry 三者没对齐,不是版本不兼容
kratos.New() 报 "no config provider registered" 怎么办
这不是版本问题,是 conf.Load() 没在 main() 第一行执行。Kratos 不自动注册任何配置源,kratos.New() 内部会立即尝试加载配置,没 provider 就直接 panic。
- 必须在
main()开头调用conf.Load(),传入至少一个config.Provider,比如config.NewFile("configs/app.yaml") - 别指望
os.Getenv("CONFIG_PATH")自动生效——得自己拼路径传进去 - 如果
app.yaml不存在,c.Load()返回 error,必须显式检查;忽略它会导致后续更难定位的 panic
service.Register() 报 "connection closed" 或 "rpc error: code = Unavailable" 怎么办
这和客户端版本无关,是本进程里缺 gRPC server 实例。Kratos 的 service.Register() 是向本地 grpc.Server 注册,不是发网络请求。
- 确认是否调用了
grpc.NewServer(),且返回值非 nil(比如 Consul 初始化失败时可能返回nil, err) - 确认该
grpc.Server实例已传入kratos.New(kratos.Server(httpSrv, grpcSrv))的Server参数列表 - 如果压根不用 gRPC,就别调
service.Register()——HTTP 路由完全独立,不需要它也能跑
proto 生成后缺 RegisterXXXServiceServer 方法怎么办
不是 Kratos 版本升级导致的兼容问题,是 protoc 插件链没配全。Kratos 的 gRPC 注册函数由 protoc-gen-go-grpc 生成,不是 protoc-gen-go。
- 必须安装
protoc-gen-go-grpc@v1.3.0+(v2 接口要求),旧版不兼容 - 命令中必须带
paths=source_relative,例如:protoc --go-grpc_out=paths=source_relative:. api/helloworld/v1/helloworld.proto - 生成后检查
.pb.go文件是否含RegisterXXXServiceServer和RegisterXXXHTTPServer,缺任一说明插件未生效
consul.New() 后 kratos.New() panic "invalid memory address" 怎么办
不是版本冲突,是 consul.New() 返回了 nil registry 却没检查 error。Kratos 对 nil registrar 零容忍。
- 错误写法:
reg, _ := consul.New(...)—— 忽略 error,reg可能为 nil - 正确做法:必须显式判断
if err != nil,且只要err != nil,reg一定为 nil(官方实现保证) - 建议把 registry 构造逻辑放在
wire.Build()的 provider 函数里,避免泄漏到main()
真正卡住人的从来不是“版本不兼容”,而是初始化顺序错位、插件缺失、nil 值未判、路径写死这些具体动作没做对。Kratos 的 panic 很安静,但每一条都指向一个明确的、可修复的代码位置。











