go-grpc使用

go-grpc使用


前篇

使用的 proto 的语法必须是3. ( syntax = "proto3"; )


安装

  • 命令

    1
    $ go get -u -v google.golang.org/grpc

生成包含 grpc 的 pb


单向调用

  • 也就是 请求->响应 式的调用.

    参考: grpc_call

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

    package helloworld;

    service Greeter{
    rpc SayHello (HelloRequest) returns (HelloReply){}
    }

    message HelloRequest{
    string name = 1;
    }

    message HelloReply{
    string message = 1;
    }

    // go
    func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
    fmt.Printf("--- from cli, say:%s\n", in.Name)
    return &pb.HelloReply{Message: "hello " + in.Name}, nil
    }

双向调用

  • 双方都可主动推送流过去

    参考: grpc_stream_putget

    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
    41
    // proto
    syntax = "proto3";//声明proto的版本 只能 是3,才支持 grpc

    package pro;

    service Greeter {
    rpc AllStream (stream StreamReqData) returns (stream StreamResData){}
    }

    message StreamReqData {
    string data = 1;
    }

    message StreamResData {
    string data = 1;
    }

    // go
    //客户端服务端 双向流, req res 都定义了 stream, 必须通过 recv 和 send 接收发送数据, 然后再通过 .xxx 获取属性值
    func (this *server) AllStream(allStr pro.Greeter_AllStreamServer) error {
    wg := sync.WaitGroup{}
    wg.Add(2)
    go func() {
    for {
    data, _ := allStr.Recv()
    log.Println("--- srv AllStream recv:", data.Data)
    }
    wg.Done()
    }()

    go func() {
    for {
    allStr.Send(&pro.StreamResData{Data: "--- srv data"})
    time.Sleep(time.Second)
    }
    wg.Done()
    }()

    wg.Wait()
    return nil
    }