实现实时数据推送:SpringBoot中SSE接口的两种方法
🌟 前言
欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍
-
🤖 洛可可白:个人主页
-
🔥 个人专栏:✅前端技术 ✅后端技术
-
🏠 个人博客:洛可可白博客
-
🐱 代码获取:bestwishes0203
-
📷 封面壁纸:洛可可白wallpaper
SpringBoot中SSE接口的两种方法
- 实现实时数据推送:SpringBoot中SSE接口的两种方法
- 一、什么是SSE?
- 二、项目环境准备
- 1. 基础依赖
- 三、两种实现方式对比
- 四、传统Servlet实现(基于SseEmitter)
- 1. 控制器实现
- 2. 关键点解析
- 五、响应式实现(基于WebFlux)
- 1. 控制器实现
- 2. 核心优势
- 六、接口测试方法
- 1. 使用curl测试
- 2. 前端示例
- 七、生产环境注意事项
- 八、扩展应用场景
- 九、总结
实现实时数据推送:SpringBoot中SSE接口的两种方法
一、什么是SSE?
SSE(Server-Sent Events) 是一种基于HTTP的服务器向客户端单向实时推送数据的技术。与WebSocket不同,SSE天然支持断线重连,且协议简单,适用于股票行情、实时日志、消息通知等场景。
二、项目环境准备
1. 基础依赖
org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-webflux
三、两种实现方式对比
特性 传统Servlet方式 WebFlux响应式方式 线程模型 阻塞IO(线程池) 非阻塞IO(事件循环) 资源消耗 较高 较低 代码复杂度 需手动管理线程 声明式编程 适用场景 简单低频场景 高并发实时场景 四、传统Servlet实现(基于SseEmitter)
1. 控制器实现
@RestController public class SseController { @GetMapping("/sse") public SseEmitter handleSse() { SseEmitter emitter = new SseEmitter(); ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); Runnable task = () -> { try { String data = "Time: " + LocalDateTime.now(); emitter.send( SseEmitter.event() .data(data) .id(String.valueOf(System.currentTimeMillis())) ); } catch (IOException e) { emitter.completeWithError(e); executor.shutdown(); } }; // 定时发送(立即执行,每秒一次) executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS); // 客户端断开处理 emitter.onCompletion(executor::shutdown); emitter.onTimeout(executor::shutdown); return emitter; } }
2. 关键点解析
- SseEmitter:核心类,保持长连接
- ScheduledExecutorService:定时任务线程池
- 事件结构:支持设置id/event/data等字段
- 资源释放:通过onCompletion/onTimeout确保线程池关闭
五、响应式实现(基于WebFlux)
1. 控制器实现
@RestController public class SseWebFluxController { @GetMapping(value = "/sse-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux streamEvents() { return Flux.interval(Duration.ofSeconds(1)) .map(sequence -> ServerSentEvent.builder() .id(String.valueOf(sequence)) .event("time-update") .data("SSE from WebFlux - " + LocalDateTime.now()) .build()); } }
2. 核心优势
- 非阻塞IO:基于Reactor库实现响应式流
- 自动背压:处理客户端消费速度差异
- 简洁API:使用Flux流式编程
六、接口测试方法
1. 使用curl测试
curl http://localhost:8080/sse curl http://localhost:8080/sse-stream
2. 前端示例
const eventSource = new EventSource('/sse'); eventSource.onmessage = (e) => { console.log('Received:', e.data); }; eventSource.addEventListener('time-update', (e) => { console.log('Custom event:', e.data); });
七、生产环境注意事项
-
连接管理:设置合理的超时时间(默认30秒)
-
错误处理:添加onError回调记录异常
-
跨域配置:需要配置CORS
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/sse*") .allowedOrigins("*"); } }
-
性能监控:跟踪活跃连接数
八、扩展应用场景
- 实时股票报价推送
- 系统运行状态监控
- 聊天应用消息通知
- 长耗时任务进度更新
九、总结
两种实现方式各有优势:
- 传统Servlet方式 适合简单场景,快速实现
- WebFlux方式 更适合高并发、低延迟需求
建议根据实际场景选择,对于新项目推荐使用WebFlux实现,能更好地利用系统资源。希望本文能帮助您快速上手SpringBoot中的SSE开发!
源码地址:https://gitee.com/bestwishes0203
如果对你有帮助,点赞👍、收藏💖、关注🔔是我更新的动力!👋🌟🚀
-
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。