【发布时间】:2021-07-28 06:27:48
【问题描述】:
我在 proto-file 中有一个像这样定义的 Go 服务器双向流方法:
syntax = "proto3";
option go_package="pdfcompose/;pdfcompose";
package pdfcompose;
service PdfCompose {
rpc Send (stream FileForm) returns (stream PdfFile) {}
}
message FileForm {
bytes Upfile1 = 1;
bytes Upfile2 = 2;
bytes Upfile3 = 3;
}
message PdfFile {
bytes File = 1;
}
而我的日志拦截器有如下接口:
func logInterceptor(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
fmt.Println("Log Interceptor")
err := handler(srv, ss)
if err != nil {
return err
}
return nil
}
我使用https://github.com/grpc-ecosystem/go-grpc-middleware 作为拦截器引擎。 我需要实现流文件大小的日志记录(出于教育目的),并试图找出我可以从哪里获取有关 FileForm 及其内容的任何数据。
我的第一个猜测是查看 grpc.ServerStream 参数 (ss) 以查找有关它的信息,它看起来包含大量数据,例如最大和最小 MessageSize,但注意实际内容长度。
如何使用这种拦截器获取传入文件的大小?
【问题讨论】:
-
随着内容的流式传输,它会随着时间的推移到达(因此在调用拦截器时信息不可用;您需要等待
handler)。您是否希望在收到每个PdfFile时提出一个日志条目(在处理程序中而不是在拦截器中更容易做到这一点)或只是处理的总字节数(仅在流关闭时才知道;认为这需要一个 @987654322 @)。 -
是的,你是对的,这实际上是我成功实现这一点的方式!
标签: go grpc middleware interceptor go-grpc-middleware