该文章只是记录如何搭建一个go-zero demo,可以根据官方文档搭建

  • 首先在根目录下创建目录: /user/rpc

  • 创建文件夹 user.proto

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    syntax = "proto3";

    package user;

    option go_package = "./user";

    message IdRequest {
    string id = 1;
    }

    message UserResponse{
    string id = 1;
    string name = 2;
    string password = 4;
    }

    service UserService {
    rpc GetUserById(IdRequest) returns (UserResponse);
    }
  • 进入 rpc 目录并生成代码

    goctl rpc protoc user.proto --go_out=types --go-grpc_out=types --zrpc_out=.

    如果是根目录使用

    得到下面这个目录和文件

    image-20240603113520457

  • 进入 user/rpc/etc/user.yaml 可以发现我们还需要搭建一个 etcd的服务器

    我们使用 docker-compose.yaml进行搭建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    etcd:
    image: bitnami/etcd:latest # 使用Bitnami的etcd Docker镜像
    container_name: etcd
    environment:
    - ALLOW_NONE_AUTHENTICATION=yes # 允许无需认证的连接
    - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 # 客户端访问地址
    - ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # 监听客户端的地址
    ports:
    - "2379:2379" # 映射容器的2379端口到宿主机的2379端口
    networks:
    - backend

    启动容器

  • 进入 user/rpc/internal/logic/getuserbyidlogic.go中有个 func GetUserById 进行修改

    这里的结构体字段的填写根据之前user.proto中的message UserResponse来填写

    1
    2
    3
    4
    5
    6
    7
    func (l *GetUserByIdLogic) GetUserById(in *user.IdRequest) (*user.UserResponse, error) {
    return &user.UserResponse{
    Id: "2",
    Name: "test",
    Password: "123456",
    }, nil
    }
  • 下载依赖 go mod tidy

  • 启动服务 go run user.go

  • 得到下面命令

    1
    2
    3
    Starting rpc server at 0.0.0.0:8080...
    {"@timestamp":"2024-06-03T11:45:38.101+08:00","caller":"stat/usage.go:61","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=5.1Mi, Sys=13.5Mi, NumGC=2","level":"stat"}
    {"@timestamp":"2024-06-03T11:45:38.116+08:00","caller":"load/sheddingstat.go:61","content":"(rpc) shedding_stat [1m], cpu: 0, total: 0, pass: 0, drop: 0","level":"stat"}
  • 测试:

    1. 打开 apifox或者postman
    2. 创建一个rpc项目
    3. 导入user.proto
    4. image-20240603120758182

​ 测试成功

  • 下面进行 api 文件的编写

  • 首先也是创建一个 video/api/video.api 文件

  • 编写 video.api 文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    type(
    VideoReq {
    Id string `path:"id"`
    }

    VideoRes{
    Id string `json:"id"`
    Name string `json:"name"`
    }
    )

    service VideoService {
    @handler getVideo
    get /api/videos/:id (VideoReq) returns (VideoRes)
    }

下面开始生成api的文件

  • greet/greet.api 的文件中设置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    syntax = "v1"

    type Request {
    Name string `path:"name,options=you|me"`
    }

    type Response {
    Message string `json:"message"`
    }

    service greet-api {
    @handler GreetHandler
    get /from/:name (Request) returns (Response)
    }
  • 生成代码: goctl api go -api greet.api -dir greet

  • image-20240603223119191

  • 然后运行main.go,记得修改一下路径,要不然会报错找不到 /etc/greet-api.yaml

  • 测试:

    image-20240603223425583

  • 成功了