1

我是 gRPC 的大一新生,这是我的问题。我正在尝试通过myOwnService以下服务方法编写服务以公开到 gRPC 服务中:

rpc HighFive (stream HighRequest) returns (stream HighReply) {}

服务器端代码如下:

func (s *server) HighFive(stream pb.Greeter_HighFiveServer) error {    
    // Oops, don't know how to do here ...
    myOwnService(stdin io.ReadCloser, stdout io.WriteCloser)
    return nil
}

func myOwnService(stdin io.ReadCloser, stdout io.WriteCloser) error {    
    // read input from stdin, do something, the  write result to stdout
    ...
    return nil
}

正如您在上面看到的,我不知道如何stream使用io.Readerio.Writer在我的原始服务中工作,以便HighFivegRPC 服务的调用者可以像myOwnService正常调用一样读取和写入数据。

[更新] 我当前的消息是这样的,但如果需要,您可以更改它们:

message HighRequest {
  bytes content  = 1;
}

message HighReply {
  bytes content  = 1;
}
4

1 回答 1

1

根据双向流 RPC 的 gRPC 基础教程部分,对stream参数方法的每次调用Recv都会为您提供解码HighRequest消息,而不是字节流,正如您对myOwnService函数所期望的那样。

现在,如果您的HighRequest消息包含类型为bytes或的字段string,您可能希望通过包装原始值来将该字段的内容myOwnService作为参数提供。stdin[]bytebytes.NewReader

不过,我知道这myOwnService需要一个io.ReadCloser. 我不知道您为什么希望myOwnService关闭其输入参数,但我会非常信任您,您需要它然后推荐使用它ioutil.NopCloser来满足该需求。

素描:

// Next tag: 2
message HighRequest {
  bytes content = 1;
}

func (s *server) HighFive(stream pb.Greeter_HighFiveServer) error {
  for req, err := stream.Recv(); {
    if err != nil {
      if err == io.EOF {
        return nil
      }
      return err
    }
    in := ioutil.NopCloser(bytes.NewReader(req.Content))
    out := /* ... */
    if err := myOwnService(in, out); err != nil {
      return err
    }
  }
}
于 2016-05-16T00:34:54.403 回答