在kratos中需用protoc生成grpc客户端代码:先确认protoc 3.15+及go-gen-go、go-gen-go-grpc插件已安装;proto文件须设正确go_package路径、独立定义request/response;执行protoc命令指定双-i路径并启用source_relative;最后在业务代码中注入并调用生成的client。

在Kratos框架中,使用proto定义服务接口后,需要通过protoc命令生成Go语言的客户端调用代码,才能在业务逻辑中发起gRPC请求。
确认protoc与插件已安装
执行 protoc --version 确保已安装 protoc 3.15+;执行 which protoc-gen-go 和 which protoc-gen-go-grpc 验证两个核心插件存在。若缺失,运行 go install google.golang.org/protobuf/cmd/protoc-gen-go@latest 和 go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest 安装。
注意:Kratos v2.7+ 默认使用 go-grpc 插件而非旧版 grpc 插件,用错插件会导致生成的client结构体缺少 Invoke 方法和拦截器支持。
编写符合Kratos规范的proto文件
在 api/helloworld/v1/helloworld.proto 中定义service时,必须添加 option go_package,且值需包含模块路径和子目录,例如:option go_package = "github.com/go-kratos/kratos/examples/helloworld/api/helloworld/v1;v1"。
【go_package路径必须与实际Go文件存放路径一致,否则生成的import路径错误,编译失败】
service块内每个RPC方法的request/response message需独立定义,不可复用同一message类型——Kratos的transport/http和transport/grpc中间件依赖字段名做自动绑定,复用会导致HTTP参数解析异常。
执行protoc命令生成client代码
进入项目根目录(即go.mod所在目录),运行以下命令:
protoc -I . -I $(go list -f '{{.Dir}}' -m github.com/go-kratos/kratos)/proto --go_out=paths=source_relative:. --go-grpc_out=paths=source_relative:. api/helloworld/v1/helloworld.proto
这条命令中 -I 指定了两处include路径:当前目录(含自定义proto)和Kratos官方proto仓库路径(提供 google/api/annotations.proto 等基础定义);paths=source_relative 确保生成的Go文件包路径与proto文件目录结构严格对应。
生成后检查 api/helloworld/v1/helloworld_grpc.pb.go 文件,确认其中包含形如 type GreeterClient interface { SayHello(context.Context, *SayHelloRequest, ...) 的client接口定义——没有该接口说明 --go-grpc_out 参数未生效或插件版本不匹配。
在业务代码中初始化并调用client
第一步:在 internal/service/service.go 中导入生成的client包,例如 "github.com/go-kratos/kratos/examples/helloworld/api/helloworld/v1"。
第二步:在Service结构体中声明字段 greeterClient v1.GreeterClient。
第三步:在Service的NewService函数中,通过DI容器注入client实例:greeterClient := v1.NewGreeterClient(conn),其中conn为已建立的grpc.ClientConnInterface(通常由kratos.transport.grpc.Dial()创建并注入)。
第四步:在具体业务方法里调用 greeterClient.SayHello(ctx, &v1.SayHelloRequest{Name: "kratos"}) 即可发起远程调用。这一步会自动经过Kratos内置的log、metric、trace等client middleware。











