构建 RPC 服务
本指南创建一个用户 RPC 服务,API 网关可通过 gRPC 调用它。
- 已安装
protoc - 已安装
protoc-gen-go和protoc-gen-go-grpc
未安装?参见安装 protoc。
第一步:创建项目
Section titled “第一步:创建项目”goctl rpc new usercd usergo mod tidygoctl 会创建 .proto 文件和完整的服务骨架:
user/├── etc/│ └── user.yaml├── internal/│ ├── config/config.go│ ├── logic/│ │ └── getuserlogic.go # ← 在这里实现│ ├── server/userserver.go # gRPC 服务端适配器│ └── svc/servicecontext.go├── user/│ └── user.pb.go # 生成的 protobuf 类型│ └── user_grpc.pb.go # 生成的 gRPC 桩代码├── user.go # 主入口└── user.proto # 源定义第二步:查看生成的 Proto
Section titled “第二步:查看生成的 Proto”打开 user.proto:
syntax = "proto3";
package user;option go_package = "./user";
service User { rpc GetUser(GetUserRequest) returns (GetUserResponse);}
message GetUserRequest { int64 id = 1;}
message GetUserResponse { int64 id = 1; string name = 2;}第三步:实现业务逻辑
Section titled “第三步:实现业务逻辑”编辑 internal/logic/getuserlogic.go:
func (l *GetUserLogic) GetUser(in *user.GetUserRequest) (*user.GetUserResponse, error) { // 生产环境:通过 l.svcCtx 查询数据库 return &user.GetUserResponse{ Id: in.Id, Name: "alice", }, nil}第四步:配置并运行
Section titled “第四步:配置并运行”打开 etc/user.yaml — 默认端口为 8080:
Name: user.rpcListenOn: 0.0.0.0:8080运行 RPC 服务:
go run user.go# Starting rpc server at 0.0.0.0:8080...第五步:从 API 服务中调用
Section titled “第五步:从 API 服务中调用”生成 API 网关使用的 RPC 客户端桩代码:
goctl rpc protoc user.proto \ --go_out=./user \ --go-grpc_out=./user \ --zrpc_out=./client在 API 服务的 servicecontext.go 中:
UserRpc userclient.User // 注入生成的客户端然后在 logic 文件中调用:
resp, err := l.svcCtx.UserRpc.GetUser(l.ctx, &user.GetUserRequest{Id: 1})go-zero 自动处理连接池、负载均衡和熔断。
Proto 变更后重新生成
Section titled “Proto 变更后重新生成”goctl rpc protoc user.proto \ --go_out=./user \ --go-grpc_out=./user \ --zrpc_out=.