Go语言中gRPC客户端流通过Send发送多条数据,CloseAndRecv关闭并接收响应,适用于日志上传等场景。

在Go语言中使用gRPC客户端Stream发送数据,关键在于理解流式RPC的类型和正确调用生成的客户端接口。gRPC支持四种类型的RPC,其中客户端流(Client Streaming)允许客户端向服务器发送多个消息,服务器接收后返回单个响应。这种模式适用于日志上传、批量数据提交等场景。
要在gRPC中使用客户端流,首先需要在.proto文件中声明流式方法。客户端流通过stream关键字修饰请求参数来标识:
service DataCollector {
rpc UploadLogs(stream LogEntry) returns (UploadResult);
}
message LogEntry {
string timestamp = 1;
string level = 2;
string message = 3;
}
message UploadResult {
bool success = 1;
int32 count = 2;
}
上述定义表示UploadLogs方法接收一个日志条目流,并在所有数据发送完成后返回一个结果。
使用protoc配合gRPC插件生成Go代码:
立即学习“go语言免费学习笔记(深入)”;
protoc --go_out=. --go-grpc_out=. data_collector.proto
生成的客户端会提供一个流对象,其类型为DataCollector_UploadLogsClient,具备Send()和CloseAndRecv()方法。
在客户端代码中按以下方式使用:
示例代码:
conn, err := grpc.Dial("localhost:50051", grpc.WithInsecure())
if err != nil {
log.Fatalf("无法连接: %v", err)
}
defer conn.Close()
client := NewDataCollectorClient(conn)
stream, err := client.UploadLogs(context.Background())
if err != nil {
log.Fatalf("调用失败: %v", err)
}
logs := []LogEntry{
{Timestamp: "2023-04-01T10:00:00", Level: "INFO", Message: "启动服务"},
{Timestamp: "2023-04-01T10:01:00", Level: "ERROR", Message: "数据库连接失败"},
{Timestamp: "2023-04-01T10:02:00", Level: "WARN", Message: "磁盘空间不足"},
}
for _, log := range logs {
if err := stream.Send(&log); err != nil {
log.Printf("发送日志失败: %v", err)
}
}
// 关闭发送并接收最终结果
result, err := stream.CloseAndRecv()
if err != nil {
log.Fatalf("接收响应失败: %v", err)
}
fmt.Printf("上传成功: %v, 条数: %d\n", result.Success, result.Count)
客户端流通信中可能遇到网络中断、超时或服务器拒绝等情况。建议设置上下文超时以避免长时间阻塞:
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() stream, err := client.UploadLogs(ctx)
在Send()过程中如果返回错误,通常意味着连接已断开,应停止后续发送。而CloseAndRecv()的错误则代表服务器处理失败或响应异常。
基本上就这些。掌握Send和CloseAndRecv的配合使用,就能稳定实现gRPC客户端流数据传输。
以上就是Golang如何使用gRPC客户端Stream发送数据_Golang gRPC客户端Stream通信实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号