kratos.New() 启动 panic 的根本原因只有三个:没加载配置、没创建 server 实例、没将 server 实例传入 Server 参数列表;conf.Load() 必须在 main() 第一行显式调用并传入 config.Provider,grpc.NewServer() 和 http.NewServer() 必须非 nil 且一并传入。

kratos.New() 启动 panic:缺配置、缺 server、没传参
kratos.New() 一执行就 panic,不是代码写错了,是基础三件事漏了:没加载配置、没创建 grpc.Server 实例、没把实例传进 kratos.New() 的 Server 参数列表。
最典型的错误信息是 panic: no config provider registered——它不提示路径,也不说缺哪个文件,只告诉你“连配置源都没注册”,根本走不到后续逻辑。
-
conf.Load()必须在main()第一行调用,不能等日志初始化完或 flag 解析后再做 -
conf.Load()必须显式传入至少一个config.Provider,比如config.NewFile("configs/app.yaml");别指望os.Getenv("CONFIG_PATH")能被自动解析 - 如果
configs/app.yaml不存在,c.Load()会返回error,必须检查,否则后续 panic 更难追
service.Register() 报 rpc error: code = Unavailable
这个错误和网络不通无关,而是 service 注册时发现本进程里压根没有运行中的 grpc.Server 实例。
service.Register() 是向本进程内已启动的 grpc.Server 注册服务,不是发请求给远程服务。失败说明你没创建它,或者创建了但没传给 kratos.New()。
- 确认是否调用了
grpc.NewServer(),且返回值非nil(例如 consul 初始化失败时,consul.New()可能返回nil + error,只判error会漏掉实例) - 确认
grpc.Server实例已加入kratos.New(kratos.Server(httpSrv, grpcSrv))的参数列表;漏传grpcSrv就等于没启 gRPC - gRPC 监听地址别写
localhost:9000:某些容器或 CI 环境下localhost解析失败,改用0.0.0.0:9000 - 如果项目压根不用 gRPC,就别调
service.Register()——HTTP 路由完全独立,不需要它也能跑通 REST 接口
proto 编译后没有 RegisterXXXServiceServer 方法
生成的 xxx.pb.go 里找不到 RegisterXXXServiceServer,说明 protobuf 编译漏了 Kratos 必需的插件。
Kratos 的 gRPC 服务注册函数(如 RegisterDeviceServiceServer)不是 protoc-gen-go 生成的,必须用 protoc-gen-go-grpc(v2 版本)和 protoc-gen-go-http 两个插件一起生成。
- 单独装
protoc-gen-go只生成*.pb.go,不生成 gRPC Server 注册函数和 HTTP 映射逻辑 - 推荐用
kratos proto server api/xxx/v1/xxx.proto -t internal/service,它会自动调用正确插件组合 - 检查
go.mod中是否引入了google.golang.org/grpc/cmd/protoc-gen-go-grpc和github.com/go-kratos/kratos/v2/cmd/protoc-gen-go-http
grpcurl 测试失败:Failed to list services: server does not support the reflection API
执行 grpcurl -plaintext localhost:9000 list 报这个错,不是 client 写错了,是服务端没开反射支持。
Kratos v2.7+ 默认不启用 gRPC 反射,必须手动加。
- 在
internal/server/grpc.go创建*grpc.Server时,传入grpc.ReflectionProvider(reflection.GRPCServerReflector(srv)) - 不想开反射?改用
-proto指定本地.proto文件:grpcurl -plaintext -proto api/helloworld/v1/helloworld.proto localhost:9000 helloworld.v1.Greeter/SayHello - 发带 body 的请求要用
-d,注意 JSON key 必须严格匹配 proto 字段名(如name而非Name),嵌套 message 要展开写:-d '{"name": "kratos"}' - 本地调试建议先用直连地址(如
127.0.0.1:9000),排除服务发现或注册中心干扰
真正容易被忽略的是:Kratos 的 gRPC 启动依赖配置加载顺序、server 实例生命周期绑定、以及 proto 生成插件的严格组合。这三环只要断一环,就会在看似无关的位置报出难以定位的 panic 或 unavailable 错误。


















