Go-Zero RPC 服务快速生成 (简单示例)

准备工作

确保已安装 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=张三