kratos proto server 命令用于按Kratos分层约定生成含中间件链、健康检查、日志注入和配置绑定的完整gRPC服务模板,需指定-t参数指向internal/service,配合proto中google.api.http注解可自动生成HTTP路由,监听地址由kratos.yaml中server.grpc.addr控制。

直接用 kratos proto server 生成服务骨架,再补实现逻辑,比手写 grpc.Server 和注册逻辑快得多,也更符合 Kratos 的配置驱动和中间件治理设计。
kratos proto server 命令怎么用
这个命令不是简单生成一个 RegisterXXXServer 调用,而是按 Kratos 的分层约定,生成带中间件链、健康检查、日志注入、配置绑定的完整服务模板。
- 必须指定
-t参数指向internal/service(或你自定义的服务目录),否则生成到错误位置,kratos run找不到入口 - 生成的
service/xxx.go文件里,SayHello方法默认只返回空响应,你要在里面填业务逻辑,比如调用 DAO 或其他 service - 如果
.proto里用了google.api.http注解,kratos proto server会同时生成 HTTP 路由绑定代码,不用额外写http.ServeMux - 路径必须是相对项目根目录的,比如
api/helloworld/v1/greeter.proto,不能写成./api/...或绝对路径,否则生成失败并报错no such file or directory
gRPC 服务端监听地址在哪配
Kratos 不在 Go 代码里硬写监听地址,而是在 kratos.yaml 的 server.grpc.addr 字段控制,运行时加载,支持环境变量覆盖。
- 开发时常用
0.0.0.0:9000;生产建议绑定具体网卡 IP,避免暴露在公网 - 若改了
addr但服务没生效,先确认cmd/{project}/main.go中是否调用了kratos.WithServer(grpcServer),且grpcServer是从internal/server/grpc.go创建的——后者会读取kratos.yaml配置 - 不推荐用
grpc.NewServer手动创建,那样绕过了 Kratos 的拦截器、日志、metrics 等基础设施 - 想加 TLS?别改
grpc.NewServer,而在kratos.yaml加server.grpc.tls段,并确保internal/server/grpc.go调用了grpc.TLSConfig选项
客户端连不上服务?先看 endpoint 格式对不对
Kratos 客户端连接地址不是传统 127.0.0.1:9000,而是统一抽象为两种模式:直连 or 服务发现。格式错一个字符就会 panic 报 failed to resolve resolver。
- 直连模式写成
"127.0.0.1:9000",必须配grpc.WithInsecure()(开发用)或grpc.WithTransportCredentials(生产) - 服务发现模式必须是
"discovery:///helloworld"(注意三个斜杠),且需提前注入registry.Discovery实例,否则 Dial 时找不到 resolver - 常见低级错误:
"discovery://helloworld"少一个/,或写成"consul:///helloworld"(Kratos 不认consul://,只认discovery://) - 如果用
grpcurl测试,它不走 Kratos 的 resolver,得用真实地址:grpcurl -plaintext 127.0.0.1:9000 list
为什么加了中间件但没生效
Kratos 的中间件必须在两个地方同时注册:服务端配置里声明,且 server/grpc.go 创建 grpc.Server 时显式传入,缺一不可。
- 中间件函数(如
recovery.Recovery())要放在internal/server/grpc.go的kratos.GRPCServer选项里,而不是塞进grpc.UnaryInterceptor手动链 - 自定义中间件必须满足
middleware.Middleware接口签名:func(handler middleware.Handler) middleware.Handler - 日志中间件依赖
log.Logger,如果cmd/main.go里没传 logger 给kratos.New(),中间件里log.WithContext会 panic - 顺序很重要:Kratos 默认把 recovery 放最外层,如果你手动调整了
UnaryInterceptor链顺序,可能让 panic 在 recovery 外面就抛出了
真正容易被忽略的是:所有配置项(kratos.yaml、conf.Conf 结构体、internal/server/grpc.go 的选项组装)必须严格对齐字段名和嵌套层级,错一层 struct tag 就会导致配置静默失效——它不会报错,只是用默认值。


















