kratos启动必须显式创建并同时传入非nil的http.server和grpc.server实例,缺一则对应协议不可用;配置加载conf.load()须在main()第一行完成且注册provider,否则直接panic。

能,但必须显式创建并传入两个 Server 实例,缺一不可。 Kratos 不会自动帮你启 gRPC 或 HTTP 服务——它只负责把传进去的 http.Server 和 grpc.Server 一起跑起来。漏掉任一个,对应协议就完全不可用。
kratos.New() 必须同时传入 http.Server 和 grpc.Server
Kratos 启动逻辑不隐含任何默认 server,kratos.New() 的 kratos.Server(...) 参数是唯一入口。只传 http.NewServer(),gRPC 就不会监听;只传 grpc.NewServer(),HTTP 就 404。
- 必须在
main()里分别调用http.NewServer()和grpc.NewServer(),拿到两个非 nil 实例 - 两个实例都要传进
kratos.New(kratos.Server(httpSrv, grpcSrv)),顺序无关 - 如果用脚手架生成的代码,检查
cmd/server/main.go里是否同时存在httpSrv := http.NewServer(...)和grpcSrv := grpc.NewServer(...) - 别在
kratos.New()之后才创建 server —— 它启动时就会立即调用每个 server 的Start()方法
proto 文件要带 google.api.http 注解,且生成命令不能少插件
HTTP 接口不是靠单独写路由注册的,而是由 protoc-gen-go-http 从 proto 注解里解析出来的。没注解、没插件、没生成,HTTP 路由就不存在。
- proto 中每个 rpc 必须有
option (google.api.http) = { get: "/path" };或post: "/path"这类声明 - 生成命令必须包含
--go-http_out=paths=source_relative:. --go-grpc_out=paths=source_relative:. - 不能只用
--go_out(它只生成.pb.go,不生成 service stub 和 HTTP 映射) - 确保
third_party/googleapis路径已通过-I指定,否则google/api/annotations.proto找不到
service.Register() 失败?说明 grpc.Server 没跑起来或没传对
service.Register() 不是发网络请求,而是往本进程的 grpc.Server 实例里注册 handler。失败报 rpc error: code = Unavailable desc = connection closed,基本等于“根本没 server 可连”。
- 确认
grpc.NewServer()返回值非 nil(某些插件初始化失败时可能静默返回 nil) - 确认该实例确实传进了
kratos.New(kratos.Server(...))的参数列表 - 监听地址别写
localhost:9000:容器或 CI 环境下localhost解析常失败,改用0.0.0.0:9000 - 如果压根不用 gRPC,就删掉
service.Register()调用——HTTP 完全不受影响
最易被忽略的一点:配置加载必须在 kratos.New() 之前完成,且至少注册一个 config.Provider。否则 kratos.New() 会 panic 报 no config provider registered,这个错误不提示文件路径,也不说哪行出问题,纯靠你记得“第一行就得 c.Load()”。











