当前位置: 首页 > news >正文

如何解决:http2: Transport received Server‘s graceful shutdown GOAWAY

有一次做压力测试,客户端经常出现如下错误:

http2: Transport: cannot retry err [http2: Transport received Server's graceful shutdown GOAWAY] after Request.Body was written; define Request.GetBody to avoid this error

是 Golang 中使用 HTTP/2 协议时,客户端收到服务端的 GOAWAY 信号(表示服务端准备关闭连接)时发生的错误。

错误含义简要解释:

  • GOAWAY 是 HTTP/2 协议中的一个信号,表示服务端打算关闭连接。
  • Golang HTTP 客户端如果在连接被关闭时还打算重试请求,而请求已经包含了 Body,就必须有办法重新读取请求体。
  • 如果没有为 Request.Body 定义 GetBody 方法,那么 Golang 无法重新读取请求体,自然也就无法重试。

解决方案

✅ 方案一:为请求显式设置 GetBody 字段

如果你手动构造了 http.Request 对象并包含了 Body,就应该设置 GetBody,示例如下:

body := []byte("your request body here")
req, err := http.NewRequest("POST", url, bytes.NewReader(body))
if err != nil {
    // handle error
}

req.GetBody = func() (io.ReadCloser, error) {
    return io.NopCloser(bytes.NewReader(body)), nil
}

这样,如果连接重试时 Golang 可以重新从 GetBody() 获取请求体。


✅ 方案二:使用 http.Client 重试逻辑时避免重试不可重读的请求体

例如上传文件、流式数据时不要依赖 Golang 自动重试,可以改为手动管理连接、错误捕获和重试逻辑。


✅ 方案三:禁用 HTTP/2(仅作为最后手段)

如果你确定服务端的 HTTP/2 实现有问题,或者你不依赖 HTTP/2,可以选择禁用它:

tr := &http.Transport{
    TLSNextProto: make(map[string]func(string, *tls.Conn) http.RoundTripper),
}
client := &http.Client{Transport: tr}

但一般不推荐,除非你知道自己在做什么。


总结

如果你遇到这个错误,大概率是你构造了带 Body 的请求,但是没有设置 GetBody。设置好它即可解决该问题。

如果你愿意贴一下你的请求代码,我可以帮你具体改一下。

相关文章:

  • qemu仿真调试esp32,以及安装版和vscode版配置区别
  • 字符串操作栈和队列
  • MES生产工单管理系统,Java+Vue,含源码与文档,实现生产工单全流程管理,提升制造执行效率与精准度
  • C++使用Qt Charts可视化大规模点集
  • matlab中排序函数sortrows的用法
  • 快速入手-前后端分离Python权限系统 基于Django5+DRF+Vue3.2+Element Plus+Jwt
  • SQL注入流量分析
  • 【算法】二分查找
  • 单片机实现触摸按钮执行自定义任务组件
  • IntelliJ IDEA下开发FPGA——FPGA开发体验提升__下
  • 量子计算模拟中的GPU加速:从量子门操作到Shor算法实现
  • 嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
  • 双周报Vol.69: C FFI 支持 borrow、新增.mbt.md测试与调试、WASM 后端支持extern type..
  • Python----计算机视觉处理(Opencv:道路检测完整版:透视变换,提取车道线,车道线拟合,车道线显示,)
  • 解决:Fontconfig head is null, check your fonts or fonts configurat
  • Java设计模式之外观、享元、组合模式《三国争霸:模式风云录》
  • Spring MVC 框架 的核心概念、组件关系及流程的详细说明,并附表格总结
  • 【探商宝】 Llama 4--技术突破与争议并存的开源多模态
  • 【机器学习】ROC 曲线与 PR 曲线
  • Python 3.13.2 安装教程(附安装包)轻松开启编程之旅
  • 俄乌刚谈完美国便筹划与两国领导人通话,目的几何?
  • 新时代,新方志:2025上海地方志论坛暨理论研讨会举办
  • 北邮今年本科招生将首次突破四千人,新增低空技术与工程专业
  • 外交部部长助理兼礼宾司司长洪磊接受美国新任驻华大使递交国书副本
  • 张家界一铁路致17人身亡,又有15岁女孩殒命,已开始加装护栏
  • 老字号“逆生长”,上海制造的出海“蜜”钥