我正在使用 Istio 1.16 和 envoy (v1.24.1)sidecar。 我为 ext_proc (v3) 创建了一个过滤器,它连接到远程 API 并针对每个请求发送一些运行状况信息。
ext_proc
^
|
client -> envoy -> upstream
ext_proc 使用 GRPC 并发送请求标头、请求正文等... 下面还给出了处理模式
request_header_mode: "SEND"
response_header_mode: "SEND"
request_body_mode: "BUFFERED"
response_body_mode: "BUFFERED"
request_trailer_mode: "SKIP"
response_trailer_mode: "SKIP"
使用此处理模式配置,上下文不会取消,并且读取不会达到 EOF。因此,我在 EOF 内的代码不起作用。
ctx := srv.Context()
for {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
req, err := srv.Recv()
if err == io.EOF {
**send request to remote API**
return nil
}
if err != nil {
return status.Errorf(codes.Unknown, "cannot receive stream request: %v", err)
}
但是,当我将response_trailer_mode更改为SEND时,流程工作正常,上下文被取消并且EOF满足。然而,我不需要响应预告片,SKIP 是实际需要。 参考代码取自以下链接 ext_proc.
如何使其与预告片模式 SKIP 一起工作?有什么建议吗?
您的问题找到解决方案了吗?