开发环境搭建

  1. 安装golang
    参见:源码安装 golang

  2. 开启go module
    go env -w GO111MODULE=on

  3. 使用代理镜像
    go env -w GOPROXY=https://goproxy.cn,direct

  4. 安装goctl(版本1.4.0)

    go install github.com/zeromicro/go-zero/tools/goctl@latest  # 使用 golang安装
    # 二进制下载地址
    https://github.com/zeromicro/go-zero/releases
  5. 安装protoc & protoc-gen-go
    goctl env check -i -f --verbose

  6. 安装mysqlredisetcd(略)

常用命令

  1. 生成api
    goctl api go -api myapi.api -dir .

  2. 生成rpc
    goctl rpc protoc myrpc.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.

  3. 生成model(可选)
    goctl model mysql ddl -src tables.sql -dir . -c

  4. 启动apirpc

    go run myprj.go
    或
    go run myprj.go -f etc/myprj.yaml

示例用法(api服务端—rpc服务端)

  1. 目录结构:

    |—— demo/   // 根目录
    ****|—— api/
    ********|—— test.api/
    ****|—— rpc/
    ********|—— test.proto/
  2. 文件内容:

    1. demo/api/test.api
       type (
           Req {
               Id string `path:"id"`
           }
           Resp {
               Id   string `json:"id"`
               Name string `json:"name"`
           }
       )
       service test {
           @handler testGet
           get /test/:id (Req) returns (Resp)
       }
    2. demo/rpc/test.proto
       syntax = "proto3";
       package test;
       option go_package = "./test";
       service Test {
           rpc test(Req) returns(Resp);
       }
       message Req {
           uint32 id = 1;
       }
       message Resp {
           uint32 id = 1;
           string name = 2;
       }
  3. 初始化go module

    cd demo
    go mod init demo
  4. 生成api

    cd demo/api
    goctl api go -api test.api -dir .
  5. 生成rpc

    cd demo/rpc
    goctl rpc protoc test.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
  6. 代码地址:
    点击访问

  7. 启动rpc

    cd demo/rpc
    go run test.go
  8. 启动api

    cd demo/api
    go run test.go
  9. 访问测试:
    localhost:8888/test/1

示例用法(api客户端—api服务端 / rpc客户端—rpc服务端)

  1. 目录结构:

    |—— demo/   // 根目录
    ****|—— api/
    ********|—— client/
    ************|—— main.go
    ********|—— server/
    ************|—— test.api
    ****|—— rpc/
    ********|—— client/
    ************|—— main.go
    ********|—— server/
    ************|—— test.proto
  2. 文件内容:

    1. demo/api/server/test.api
      type (
        Req {
          Id string `path:"id"`
        }
        Resp {
          Id   string `json:"id"`
          Name string `json:"name"`
        }
      )
      service test {
        @handler testGet
        get /test/:id (Req) returns (Resp)
      }
    2. demo/api/client/main.go
      package main
      import (
        "fmt"
        "io"
        "io/ioutil"
        "net/http"
      )
      func HTTP_GET(url string) (string, error) {
        resp, err := http.Get(url)
        if resp != nil {
          defer resp.Body.Close()
        }
        if err != nil {
          return "", err
        } else {
          if resp.StatusCode == 200 {
            var bodyReader io.ReadCloser = resp.Body
            body, err := ioutil.ReadAll(bodyReader)
            if err != nil {
              return "", err
            } else {
              return string(body), nil
            }
          } else {
            return "", fmt.Errorf("服务器异常")
          }
        }
      }
      func main() {
        url := "http://localhost:8888/test/1"
        ret, err := HTTP_GET(url)
        fmt.Println(ret, err)
      }
    3. demo/rpc/server/test.proto
      syntax = "proto3";
      package test;
      option go_package = "./test";
      service Test {
          rpc test(Req) returns(Resp);
      }
      message Req {
          uint32 id = 1;
      }
      message Resp {
          uint32 id = 1;
          string name = 2;
      }
    4. demo/rpc/client/main.go
      1. etcd
        package main
        import (
           "context"
           "demo/rpc/server/testclient"
           "fmt"
           "github.com/zeromicro/go-zero/core/discov"
           "github.com/zeromicro/go-zero/zrpc"
        )
        func main() {
           client := zrpc.MustNewClient(zrpc.RpcClientConf{
               Etcd: discov.EtcdConf{
                   Hosts: []string{"127.0.0.1:2379"},
                   Key:   "test.rpc",
               },
           })
           t := testclient.NewTest(client)
           resq, err := t.Test(context.Background(), &testclient.Req{Id: 1})
           fmt.Println(resq, err)
        }
      2. grpc
        package main
        import (
           "demo/rpc/server/types/test"
           "fmt"
           "golang.org/x/net/context"
           "google.golang.org/grpc"
           "google.golang.org/grpc/grpclog"
        )
        const (
           Address = "127.0.0.1:8080"
        )
        func main() {
           conn, err := grpc.Dial(Address, grpc.WithInsecure())
           if err != nil {
               grpclog.Fatalln(err)
           }
           defer conn.Close()
           c := test.NewTestClient(conn)
           req := &test.Req{Id: 1111}
           res, err := c.Test(context.Background(), req)
           if err != nil {
               grpclog.Fatalln(err)
           }
           fmt.Println(res)
        }
  3. 初始化go module:

    cd demo
    go mod init demo
  4. 生成api服务端代码:

    cd demo/api/server
    goctl api go -api test.api -dir .
  5. 生成rpc服务端代码:

    cd demo/rpc/server
    goctl rpc protoc test.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
  6. 代码地址:
    点击访问

  1. 启动api服务:

    cd demo/api/server
    go run test.go
  2. 调用api客户端:

    cd demo/api/client
    go run main.go
  3. 启动rpc服务:

    cd demo/rpc/server
    go run test.go
  4. 调用rpc客户端:

    cd demo/rpc/client
    go run main.go

集成jaeger(链路追踪)

  1. jaeger搭建:

     docker run -d --name jaeger \
       -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
       -e COLLECTOR_OTLP_ENABLED=true \
       -p 6831:6831/udp \
       -p 6832:6832/udp \
       -p 5778:5778 \
       -p 16686:16686 \
       -p 4317:4317 \
       -p 4318:4318 \
       -p 14250:14250 \
       -p 14268:14268 \
       -p 14269:14269 \
       -p 9411:9411 \
       jaegertracing/all-in-one:1.37
  2. jaeger-ui访问地址:
    http://localhost:16686

  3. go-zero集成jaeger:

    1. 修改api服务的配置文件:
      vim demo/api/etc/test.yaml

       Name: test
       ...
       Telemetry:
           Name: test.api
           Endpoint: http://localhost:14268/api/traces
           Sampler: 1.0
           Batcher: jaeger
    2. 修改rpc服务的配置文件:
      vim demo/rpc/etc/test.yaml

       Name: test.rpc
       ...
       Telemetry:
         Name: test.rpc
         Endpoint: http://localhost:14268/api/traces
         Sampler: 1.0
         Batcher: jaeger
文档更新时间: 2024-04-20 10:57   作者:lee