Go 1.21中EnableFullDuplex()方法的使用及测试结果验证
关于
EnableFullDuplex()的测试分析 你的猜测是正确的,出现两个"hello"确实说明服务器在客户端上传大文件的过程中,并发完成了响应写入。
默认情况下,Go的HTTP服务器会先完整读取请求体,之后才会执行响应写入逻辑。但调用rc.EnableFullDuplex()后,打破了这个顺序限制——服务器可以在还没读完请求体的时候就向客户端发送响应数据。
你测试时上传2GB大文件,客户端会分批次发送请求数据。服务器在接收到第一批数据后,就可以执行w.Write([]byte("hello"))发送响应;后续客户端继续发送剩余文件数据时,服务器可能因连接的分帧特性或处理逻辑触发再次输出,最终你看到了两次"hello"。
如果要实现流式反向代理,你可以基于这个特性做以下操作:
- 启用全双工后,在后台goroutine里持续读取客户端的请求体流
- 同时把读取到的数据实时转发给目标服务器
- 再把目标服务器的响应流实时回传给客户端
这样就能实现请求和响应的双向流式传输,不需要等请求体完全接收完再处理。
内容的提问来源于stack exchange,提问作者jim alef
相关产品推荐
相关产品推荐

