SSE(Server-Sent Events)是一种服务器推送技术,这种技术基于HTTP协议,利用HTTP的长连接特性,在客户端与服务器之间建立持久化连接,并通过该连接实现服务器向客户端的实时数据推送(应用于当前市面上的聊天语言模型,比如文心一言、chatgpt等)。SSE建立了一个从服务器到客户端的单向通道,服务器通过这个通道可以持续地向客户端发送事件流,而无需客户端进行显式的请求。服务器发送的事件流是由一系列的事件组成的,每个事件都以特定的格式呈现,包含一个或多个字段,如事件的名称、数据内容和可选的ID。
SSE主要关注的是服务器与客户端之间的通信协议和机制,它定义了一个标准,不同的服务器和客户端有不同的实现方式。
客户端:
SSE的实现主要通过JavaScript的EventSource接口来完成。几乎所有的现代浏览器都支持EventSource接口,这使得SSE具有广泛的兼容性。客户端通过创建EventSource对象并指定服务器发送事件的URL来建立与服务器的连接。一旦连接建立,服务器就可以通过该连接向客户端发送实时更新。
但是,标准的EventSource
API不支持POST请求和发送请求参数。EventSource
只支持通过GET方法连接到服务器,并且它不支持在连接时发送额外的请求头或请求体。这是因为SSE协议是基于HTTP的,而HTTP的服务器发送事件(Server-Sent Events)通常是通过GET请求建立的长期连接。可以使用sse.js,它是将EventSource
进行封装,可以支持POST请求和发送请求参数,具体的使用方式可以看官网,官网链接:官网链接。
服务端:
开发人员可以使用各种编程语言和技术栈来实现SSE,这里主要讲Java开发人员如何实现SSE。
1.SseEmitter
使用SseEmitter来发送SSE事件,但是需要创建新线程来模拟异步发送SSE事件,推荐使用线程池,配置了线程池来发送SSE通常不会直接导致调用线程被阻塞,但这并不意味着整个过程中完全不存在阻塞操作的风险,所以更推荐的做法是使用WebFlux的响应式编程模型来直接发送SSE。
2.Spring WebFlux
使用Flux<ServerSentEvent>
来发送SSE事件,可以更直接地利用WebFlux的异步和响应式特性。