Golang怎么实现SSE服务端推送事件_Golang如何用Server-Sent Events实时推送数据【教程】

张开发
2026/4/10 7:02:26 15 分钟阅读

分享文章

Golang怎么实现SSE服务端推送事件_Golang如何用Server-Sent Events实时推送数据【教程】
Go 的 http.ResponseWriter 能多次写入但需禁用缓冲、手动刷新并防止中间件断连SSE 需设正确 header、定时心跳、严格格式输出、绕过干扰中间件并配置反向代理。Go 的 http.ResponseWriter 为什么不能直接写多次因为 SSE 要求服务端保持连接、持续写入以 data: 开头的纯文本块而默认的 http.ResponseWriter 在调用 Write 后可能被底层 HTTP/1.1 实现缓冲或提前关闭。关键不是“不能写多次”而是必须禁用响应缓冲、手动刷新并确保连接不被中间件如反向代理、Cloudflare断开。实操建议立即学习“go语言免费学习笔记深入”设置 w.Header().Set(Content-Type, text/event-stream)设置 w.Header().Set(Cache-Control, no-cache) 和 w.Header().Set(Connection, keep-alive)调用 w.(http.Flusher).Flush() 每次写完后立即刷出否则数据卡在 Go 的 bufio.Writer 里避免在 handler 中 defer defer w.(http.Flusher).Flush() —— 它只在函数退出时执行一次起不到流式推送作用如何用 net/http 实现带超时和心跳的 SSE 连接SSE 连接容易因网络空闲被中间设备Nginx、ALB、运营商网关静默断开单纯写 data: 不够得主动发心跳: 注释行或 event: heartbeat并控制连接生命周期。实操建议立即学习“go语言免费学习笔记深入”用 time.Timer 或 time.Ticker 每 15–30 秒发一次 : SSE 注释客户端忽略在写入前检查 w.(http.CloseNotifier).Done()Go 1.8 已弃用改用 req.Context().Done()对每个连接启动 goroutine 处理事件但用 context.WithTimeout 控制总存活时间比如 5 分钟防长连接堆积别用 log.Printf 频繁打日志 —— 日志 I/O 可能阻塞 flush导致客户端卡住客户端收到 error 事件或反复重连怎么办这是最常被忽视的信号EventSource 触发 error 并非一定是服务端崩了更可能是连接被重置、响应头缺失、或服务端没按 SSE 格式输出比如多了一个空行、漏了 结尾。 RedClaw 百度推出的手机端万能AI Agent助手

更多文章