kratos.New() panic 因未注册配置源,须在 main() 开头调用 conf.Load() 并传入 config.Provider;proto 编译需放 api/ 目录、装齐插件、用 float32/float64;HTTP 404 因未注册路由或漏传 httpSrv;gRPC Unavailable 因未创建或未注入 grpc.Server。

kratos.New() 会 panic,不是框架有问题,而是你没配好基础依赖——90% 的启动失败都卡在这一步。
kratos.New() panic: no config provider registered 怎么修
这个错误不是配置文件写错了,是根本没注册配置源。kratos.New() 启动时会主动调用 conf.Load(),但如果你没提前注册 provider,它就直接 panic,连错误提示都不给你具体路径。
- 必须在 main() 开头就调用
conf.Load(),不能等到 kratos.New() 之后 -
conf.Load()必须传入至少一个config.Provider,比如config.NewFile("configs/app.yaml") - 别指望环境变量自动生效:
os.Getenv("CONFIG_PATH")得自己拼进config.NewFile(),kratos 不解析 $CONFIG_PATH - 如果 configs/app.yaml 不存在,
conf.Load()会返回 error,要显式检查,否则后续 panic 更难定位
make api 编译 device.proto 失败的三个硬伤点
Protobuf 是 Kratos 的契约起点,但编译失败几乎不报具体语法行号,只甩个 “failed to generate”,实际就卡在三处最常被忽略的位置。
-
.proto文件必须放在api/目录下(不是proto/、internal/proto或根目录),且 package 声明必须是package api; - 缺任一插件都会静默失败:
protoc-gen-go+protoc-gen-go-grpc+protoc-gen-go-http/v2全得装齐;单独装protoc-gen-go只生成*.pb.go,不生成 HTTP 路由和 gRPC Server 注册函数 - 字段类型写
float是非法的,proto3 不支持;必须明确写成float32或float64;syntax = "proto3";必须顶格,缩进或空行前置都会让 protoc 拒绝解析
服务跑起来了,但 curl http://localhost:8000/v1/device/list 404
HTTP 接口 404 但 gRPC 能连上,说明服务进程活着,只是路由没挂上去——Kratos 不自动扫描 handler,全靠手动注册。
立即学习“go语言免费学习笔记(深入)”;
- 确认
internal/server/http.go里调用了v1.RegisterDeviceHTTPServer()(函数名取决于你 proto 里的 service 名) - 确认
api/v1/device_http.pb.go已生成(即make api成功),否则RegisterDeviceHTTPServer根本不存在 - 路径前缀默认是
/v1,由device_http.proto里option (google.api.http) = { get: "/v1/device/list" };控制;写成get: "/device/list"就会变成/device/list,但 Kratos 模板默认带/v1 - HTTP server 实例必须传进
kratos.New(kratos.Server(httpSrv, grpcSrv)),漏传httpSrv就等于没启 HTTP 服务
service.Register() 报 rpc error: code = Unavailable desc = connection closed
这个错误不是网络不通,是你本进程里压根没跑起 gRPC server。service.Register() 是向本地内存中的 grpc.Server 实例注册,不是发请求。
- 检查是否调用了
grpc.NewServer()并赋值给变量(比如gs := grpc.NewServer()) - 确认该
grpc.Server实例已加入kratos.New()的kratos.Server()参数列表 - 如果项目只用 HTTP,完全不需要
service.Register();删掉它,HTTP 路由照常工作 - gRPC 监听地址别写
localhost:9000,某些容器或 CI 环境解析失败;改用:9000更稳妥
最常被跳过的其实是 paths=source_relative 这个 protoc 参数——漏了它,生成的 *.pb.go 会塞进错包路径,导致 import 冲突、Register 方法找不到,但错误信息里半个字都不提。


















