问题描述
有:
我有一个 gRPC 服务可以在一个流中传输任意数量的字符串。
行为:
服务器上只打印第一行/消息
期望:
打印所有行
代码:
原型定义
/// Defines simple messages to run the logsink server and client
Syntax = "proto3";
package logsink;
option csharp_namespace = "Serilog.GologsinkSink";
/// LogTransfer service defines the method(s) used to send
/// messages from client to server
service LogTransfer {
/// SendLine sends a log line to the server
rpc SendLine(stream LineMessage) returns (LineResult) {}
}
/// The single line message
message LineMessage {
string line = 1;
int32 priority = 2;
int64 sequence = 3;
}
/// Result of the log send
message LineResult {
bool result = 1;
}
服务器端实现:
//SendLine implements logsink.SendLine
func (s *server) SendLine(stream logsink.LogTransfer_SendLineserver) error {
for {
in,err := stream.Recv()
if err != nil {
logrus.Warnf("error reading request: %s",err)
return stream.SendAndClose(&logsink.LineResult{
Result: true,})
}
logrus.Println(in.Line) // prints only the first message
}
return stream.SendAndClose(&logsink.LineResult{
Result: true,})
}
客户端使用:
//linesender emits the passed lines over gRPC
func linesender(in <-chan string) {
// Set up a connection to the server.
conn,err := grpc.Dial(viper.GetString("connect.address"),grpc.WithInsecure())
defer func() {
err := conn.Close()
}()
c := pb.NewLogTransferClient(conn)
client,err := c.SendLine(context.Background())
defer func() {
res,err := client.CloseAndRecv()
}()
priority := int32(viper.GetInt("connect.priority"))
for line := range in {
logrus.Println(line) // all lines printed
err = client.Send(&pb.LineMessage{Line: line,Priority: priority})
}
}
应用程序遵循管道模式,in
获取任意数量的预处理字符串。现在,当发送 10 行时,客户端会打印出所有 10 行,而服务器只打印第一行。
我没有找到为什么服务器只收到第一条消息的线索。我使用示例 gRPC 代码作为指导。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)