跳转到内容

SSE 路由

go-zero 现已通过 @server 指令中的 sse: true 注解支持服务器推送事件(Server-Sent Events, SSE)。这使得服务器可以向客户端进行实时事件流传输。

syntax = "v1"
type EventMessage {
Type string `json:"type"`
Data string `json:"data"`
}
@server (
sse: true
prefix: /api/v1
)
service EventApi {
@handler StreamEvents
get /events returns (EventMessage)
}

当指定 sse: true 时,goctl 会生成带有 rest.WithSSE() 选项的路由:

server.AddRoutes(
[]rest.Route{
{
Method: http.MethodGet,
Path: "/events",
Handler: StreamEventsHandler(serverCtx),
},
},
rest.WithPrefix("/api/v1"),
rest.WithSSE(),
)

rest.WithSSE() 选项会自动:

  1. 设置适当的 SSE 头部(Content-Type: text/event-streamCache-Control: no-cache 等)
  2. 移除写入超时以允许长时间运行的连接
  3. 启用连接保持活动
  • SSE 路由通常应使用 GET 方法
  • 连接将保持打开状态,直到客户端断开连接或处理程序完成
  • SSE 可与 JWT 认证和中间件良好配合使用