准备工作
确保已安装 Go 环境,然后安装 goctl 工具:
go install github.com/zeromicro/go-zero/tools/goctl@latest
示例:创建一个用户查询服务
第一步:创建项目目录
mkdir rpc-demo && cd rpc-demo
go mod init rpc-demo
第二步:编写 proto 文件
在项目根目录创建 user.proto,定义服务:
syntax = "proto3";
package user;
option go_package = "./user";
service UserRpc {
rpc GetUser (UserRequest) returns (UserResponse);
}
message UserRequest {
int32 id = 1;
}
message UserResponse {
int32 id = 1;
string name = 2;
}
第三步生成RPC代码
在 user.proto 所在目录执行以下命令:
goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.
生成后的目录结构如下:
rpc-demo/
├── user.proto
├── user.go // 服务启动入口
├── etc/
│ └── user.yaml // 配置文件
├── internal/
│ ├── config/ // 配置定义
│ ├── logic/ // 业务逻辑(在这里写代码)
│ ├── server/ // 服务注册
│ └── svc/ // 依赖注入上下文
└── user/ // pb 生成文件
第四步:编写逻辑
打开 internal/logic/getuserlogic.go,实现 GetUser 方法:
func (l *GetUserLogic) GetUser(in *user.UserRequest) (*user.UserResponse, error) {
// 模拟根据 ID 查询用户
if in.Id == 1 {
return &user.UserResponse{
Id: in.Id,
Name: "张三",
}, nil
}
return nil, fmt.Errorf("用户不存在")
}
第五步:修改配置
编辑 etc/user.yaml,指定服务监听地址:
Name: user.rpc
ListenOn: 0.0.0.0:8080
Etcd:
Hosts:
- 127.0.0.1:2379
Key: user.rpc
第六步:启动服务
1.启动一个etcd.exe(双加即可)
获取注册到etcd服务中的key内容(*user.yaml文件)
E:\Db\etcds\etcd-v3.6.12>etcdctl.exe get user --prefix
2.启动服务
go mod tidy
go run user.go -f etc/user.yaml
看到输出 Starting rpc server at 127.0.0.1:8080... 即表示启动成功。
第七步:验证服务"客户端方式
创建调用端(-客 户 端-)
在项目根目录新建 client/client.go
package main
import (
"context"
"fmt"
"log"
"rpc-demo/user"
"github.com/zeromicro/go-zero/zrpc"
)
func main() {
// 创建客户端(直连模式,方便测试)
conn := zrpc.MustNewClient(zrpc.RpcClientConf{
Target: "127.0.0.1:8080", // 对应服务端监听的地址
})
client := user.NewUserRpcClient(conn.Conn())
// 调用 RPC 方法
resp, err := client.GetUser(context.Background(), &user.UserRequest{Id: 1})
if err != nil {
log.Fatal("调用失败:", err)
}
fmt.Printf("查询结果: ID=%d, Name=%s\n", resp.Id, resp.Name)
}
第八步 运行客户端测试:
cd client
go run client.go
预期输出:
查询结果: ID=1, Name=张三