Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

Golang protoc的使用

2022/02/22 Go
Word count: 702 | Reading time: 4min

使用Grpc需要有protoc的支持, 但默认安装的/Go/bin目录下只有go.exegofmt.exe两个可执行文件,因此要使用protoc的话,需要自己去下载

  1. https://github.com/protocolbuffers/protobuf/releases中下载Windows64的压缩包,为$protoc -go_out=. *.proto使用到的命令可执行文件

  2. 编写.proto文件, 如下所示

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

    # 注意, 这边使用的是go_package, 类似的还有java_package, 后面的参数是output_path和包名
    option go_package = ".;geecachepb";

    message Request{
    string group = 1;
    string key = 2;
    }

    message Response{
    bytes value = 1;
    }

    service GroupCache{
    rpc Get(Request) returns (Response);
    }
  3. 使用protoc -go_out=. *.proto命令,将.proto转换成要使用的go文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    // Code generated by protoc-gen-go. DO NOT EDIT.
    // versions:
    // protoc-gen-go v1.27.1
    // protoc v3.19.4
    // source: geecachepb.proto

    package geecachepb

    import (
    protoreflect "google.golang.org/protobuf/reflect/protoreflect"
    protoimpl "google.golang.org/protobuf/runtime/protoimpl"
    reflect "reflect"
    sync "sync"
    )

    const (
    // Verify that this generated code is sufficiently up-to-date.
    _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
    // Verify that runtime/protoimpl is sufficiently up-to-date.
    _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
    )

    type Request struct {
    state protoimpl.MessageState
    sizeCache protoimpl.SizeCache
    unknownFields protoimpl.UnknownFields

    Group string `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"`
    Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"`
    }

    // ... 省略更多
  4. go get -u github.com/golang/protobuf/protoc-gen-go安装使用xxxx.pb.go文件的库

  5. 在业务代码中使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    type PeerGetter interface {
    Get(in *pb.Request, out *pb.Response) error
    }

    func (p *HttpPool) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    // ...
    body, err := proto.Marshal(&pb.Response{Value: view.ByteSlice()})

    if err != nil {
    http.Error(w, err.Error(), http.StatusInternalServerError)
    return
    }
    // ...
    }
    func (h *httpGetter) Get(in *pb.Request, out *pb.Response) error {
    u := fmt.Sprintf(
    "%v%v/%v",
    h.baseURL,
    url.QueryEscape(in.GetGroup()),
    url.QueryEscape(in.GetKey()),
    )
    res, err := http.Get(u)
    if err != nil {
    return err
    }
    defer res.Body.Close()
    if res.StatusCode != http.StatusOK {
    return fmt.Errorf("server return %v", res.Status)
    }

    bytes, err := ioutil.ReadAll(res.Body)
    if err != nil {
    return err
    }

    if err = proto.Unmarshal(bytes, out); err != nil {
    return fmt.Errorf("decoding response body: %v", err)
    }
    return nil
    }

    推荐风格

    • 文件(Files)
      • 文件名使用小写下划线的命名风格,例如 lower_snake_case.proto
      • 每行不超过 80 字符
      • 使用 2 个空格缩进
    • 包(Packages)
      • 包名应该和目录结构对应,例如文件在my/package/目录下,包名应为 my.package
    • 消息和字段(Messages & Fields)
      • 消息名使用首字母大写驼峰风格(CamelCase),例如message StudentRequest { ... }
      • 字段名使用小写下划线的风格,例如 string status_code = 1
      • 枚举类型,枚举名使用首字母大写驼峰风格,例如 enum FooBar,枚举值使用全大写下划线隔开的风格(CAPITALS_WITH_UNDERSCORES ),例如 FOO_DEFAULT=1
    • 服务(Services)
      • RPC 服务名和方法名,均使用首字母大写驼峰风格,例如service FooService{ rpc GetSomething() }

Author: Mrli

Link: https://nymrli.top/2022/02/22/protoc的使用/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
私有Gitlab配置SSH连接
NextPost >
语义化的版本控制
CATALOG
  1. 1. 推荐风格