Spring Boot 支持 SSE

1. 什么是 SSE

SSE(Server-Sent Events)是一种基于HTTP的服务器推送技术,用于实现服务器向客户端单向推送消息。与其他技术(如WebSockets)相比,SSE更加简单易用,不需要建立全双工的连接。

SSE的工作原理是通过在客户端与服务器之间建立持久连接,服务器可以随时将消息推送给客户端,而不需要客户端主动发起请求。这使得SSE非常适合实时通信场景,如聊天应用程序、实时监控等。

2. Spring Boot SSE 支持

Spring Boot对SSE提供了良好的支持,在开发过程中可以轻松地使用SSE来实现实时通信功能。下面我们将通过一个简单的示例来演示如何在Spring Boot中使用SSE。

首先,我们需要创建一个Spring Boot项目。可以使用Spring Initializr( Boot项目,选择所需的依赖项。在本示例中,我们将选择Spring WebThymeleaf作为依赖项。

接下来,我们需要创建一个Controller来处理SSE请求。在Spring Boot中,我们可以使用@RestController@GetMapping注解来创建一个简单的Controller。

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.http.MediaType;
import org.springframework.http.codec.ServerSentEvent;
import reactor.core.publisher.Flux;

@RestController
public class SSEController {

    @GetMapping(value = "/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<ServerSentEvent<String>> sse() {
        return Flux.interval(Duration.ofSeconds(1))
                .map(seq -> ServerSentEvent.<String>builder()
                        .id(String.valueOf(seq))
                        .event("message")
                        .data("SSE message " + seq)
                        .build());
    }
}

这里的/sse路径将用于处理SSE请求,并返回一个Flux<ServerSentEvent<String>>。我们使用Flux.interval方法来生成一个每秒钟递增的序列,并将其转换为ServerSentEvent对象。每个ServerSentEvent对象包含一个唯一的ID、事件类型和数据。

接下来,我们需要创建一个简单的HTML页面来接收SSE消息并显示在页面上。可以在src/main/resources/static目录下创建一个名为index.html的文件。

<!DOCTYPE html>
<html>
<head>
    <title>Spring Boot SSE Example</title>
</head>
<body>
    Server-Sent Events Example
    <div id="sse-messages"></div>

    <script>
        if (!!window.EventSource) {
            var source = new EventSource('/sse');
            source.addEventListener('message', function(event) {
                var data = JSON.parse(event.data);
                var message = document.createElement('p');
                message.innerHTML = data.data;
                document.getElementById('sse-messages').appendChild(message);
            }, false);
        } else {
            console.log('Server-Sent Events not supported');
        }
    </script>
</body>
</html>

在这个HTML页面中,我们通过EventSource对象与服务器建立SSE连接,并通过addEventListener方法监听message事件。每当服务器发送一个ServerSentEvent对象时,我们将其数据部分添加到sse-messages元素中。

最后,我们需要启动Spring Boot应用程序,并在浏览器中打开http://localhost:8080来运行示例。你应该能够看到SSE消息以每秒钟一个的速度显示在页面上。

3. 总结

在本文中,我们介绍了SSE的概念和工作原理,并演示了如何在Spring Boot中使用SSE实现实时通信功能。我们创建了一个简单的SSE Controller来处理SSE请求,并在页面上显示推送的消息。通过这个示例,你应该能够理解如何在Spring Boot项目中使用SSE来实现实时通信。

如果你想深入了解SSE和Spring Boot的更多细节,可以参考官方文档和相关资源。希望本文对你有所帮助,谢谢阅读!

参考资料

  • Spring Boot官方文档:
  • Server-Sent Events官方