前言

随着AI Agent的兴起,人机交互方式正在由表单转向自然语言对话。

传统HTTP短连接无法满足实时流式响应,HTTP长连接成为AI交互的核心支撑。

SSE和HTTP Stream作为HTTP长连接最主流的两种实现,支撑了ChatGPT、豆包、DeepSeek等大模型对话。

SSE (Server Send Events)

前端发1次HTTP请求,都需要创建1个新HTTP连接。

​后端可以基于1次HTTP请求一直不停向前端推送信息,后端决定什么时候推送完毕信息,什么时候结束HTTP本次请求。

HTTP 流(SSE/Stream)是单向的,只能服务端推,不能双向实时协商。

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/chart", sseHandler)
    log.Println("SSE server running on :8001")
    log.Println("访问: http://127.0.0.1:8001/chart")
    _ = http.ListenAndServe(":8001", nil)
}

// 视图函数
func sseHandler(w http.ResponseWriter, r *http.Request) {
    // SSE 必须的响应头
    w.Header().Set("Content-Type", "text/event-stream; charset=utf-8")
    w.Header().Set("Cache-Control", "no-cache")
    w.Header().Set("Connection", "keep-alive")
    // 允许跨域(前端调试用)
    w.Header().Set("Access-Control-Allow-Origin", "*")

    // 刷新器,确保实时推送
    flusher, ok := w.(http.Flusher)
    if !ok {
        http.Error(w, "SSE not supported", http.StatusInternalServerError)
        return
    }

    // 持续推送消息
    for i := 1; ; i++ {
        // SSE 消息格式:data: xxx\n\n
        msg := fmt.Sprintf("data: 第 %d 条消息 | 时间: %s\n\n", i, time.Now().Format("15:04:05"))
        _, _ = fmt.Fprint(w, msg)
        flusher.Flush() // 立即发送
        // 每秒推一条
        time.Sleep(1 * time.Second)
        // 客户端断开时退出
        select {
        case <-r.Context().Done():
            log.Println("客户端断开连接")
            return
        default:
        }
    }
}
sse-server

 

 

 

 

 

 

 

 

 

参考

posted on 2026-04-07 22:33  运维体系建设之路  阅读(19)  评论(0)    收藏  举报