Postman调用Kratos gRPC接口需手动注册反射服务,因其默认未启用grpc.reflection.v1alpha.ServerReflection;须在grpc.NewServer()后、s.Serve()前调用reflection.Register(s),且须在所有RegisterService之后,方可使Postman自动发现服务。

Postman 调用 gRPC 接口时,若服务端未启用反射(Server Reflection),你就得手动导入 .proto 文件——而很多 Kratos 项目默认不开启反射,导致 Postman 下拉列表里空空如也,连服务名都看不到。
Kratos 默认不启用 gRPC 反射服务
Kratos 的 grpc.Server 实例默认不注册 grpc.reflection.v1alpha.ServerReflection 服务。即使你启用了 HTTP/2 端口、写了正确的 .proto,Postman 点 “Reflect” 也会卡在 loading 或报 UNAVAILABLE 错误。
根本原因不是 Postman 问题,而是 Kratos 启动时没把反射服务挂到 gRPC Server 上。
- 反射服务是独立的 gRPC 服务,需显式注册,不是“开个配置就自动有”
- Kratos v2.6+ 的
transport/grpc/server.go中不包含反射注册逻辑 - 不依赖第三方中间件(如
grpc-ecosystem/go-grpc-middleware),纯 Kratos 原生方式即可完成
手动注册 grpc.ReflectionService
在 Kratos 初始化 gRPC Server 的地方(通常是 internal/server/grpc.go 或 cmd/server/main.go),找到创建 grpc.NewServer() 的位置,在其后立即注册反射服务:
import "google.golang.org/grpc/reflection"
s := grpc.NewServer(
grpc.Creds(credentials.NewTLS(tlsConfig)),
// 其他选项...
)
// ? 加这一行
reflection.Register(s)
注意:reflection.Register() 必须在所有 s.RegisterService(...) 之后调用,否则反射信息不全;但必须在 s.Serve() 之前。
- 不需要额外 import proto 或重新生成代码
- 注册后,服务会暴露
grpc.reflection.v1alpha.ServerReflection这个服务,Postman 就能通过grpc://host:port自动发现所有 service/method - 开发环境建议开启,生产环境可关(通过构建 tag 或配置控制)
Postman 中验证反射是否生效
在 Postman 新建 gRPC 请求,URL 填 grpc://localhost:9000(对应你的 Kratos gRPC 监听地址),方法选 Reflect → Service/Method Reflection,点击 Invoke:
- 成功:返回一大段 JSON,含
services列表,且能看到你定义的UserService、OrderService等 - 失败常见现象:
UNAVAILABLE(端口不通或 TLS 配置错)、PERMISSION_DENIED(mTLS 拒绝未认证连接)、空白下拉框(反射未注册或顺序错了) - 若用 mTLS,Postman 需上传 client cert/key,并在 Metadata 中加
tls_cert_hash等字段,否则反射请求直接被拦截
最易被忽略的一点:Kratos 的 gRPC server 启动日志里不会打印“reflection registered”,你得靠 Postman 的 Reflect 功能或 grpcurl -plaintext localhost:9000 list 主动验证,别只看日志就以为开了。


















