⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 程序猿DD 「DD」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

早期网站仅展示静态内容,而如今我们更期望:实时更新、即时聊天、通知推送和动态仪表盘。

那么要如何实现实时的用户体验呢?三大经典技术各显神通:

  • SSE(Server-Sent Events):轻量级单向数据流
  • WebSocket:双向全双工通信
  • Long Polling(长轮询):传统过渡方案

假设目前有三个业务场景,需要实现数据实时更新:

  • 股票交易仪表盘
  • 即时聊天平台
  • 实时新闻推送

面对这些需求,我们应该如何决策选择合适的方案呢?

下面让我们从架构、性能和扩展性角度一起探讨一下。

什么是长轮询?

原理解析

客户端持续询问服务器:

  • “有更新吗?”
  • “没有”
  • “现在呢?”
  • “还是没有”
  • “现在呢?”
  • “有了!”

就像在吃饭排队叫号的时候,站在店门口每隔5分钟询问是否到你一样,效率低下。

Spring Boot实现(长轮询式REST端点):

@GetMapping("/updates")
public ResponseEntity<String> getUpdate() {
// 模拟延迟或等待事件
return ResponseEntity.ok("最新更新!");
}

✔ 优点:

  • 实现简单(标准REST)
  • 兼容性最佳

✘ 缺点:

  • 高延迟
  • 资源浪费(大量空请求)
  • 扩展性差

适用场景

当无法使用WebSocket或SSE且需要支持老旧浏览器或代理时使用,一般常见于大型企业的遗留系统中使用。

什么是SSE?

原理解析

客户端建立连接后:

  • “持续监听中…”
  • 服务器随时推送:
  • “新事件1”
  • “新事件2”
  • “连接保持”

仅支持服务器到客户端的单向通信,适合实时数据流。

Spring Boot实现(SSE端点):

@GetMapping("/stream")
public SseEmitter stream() {
SseEmitter emitter = new SseEmitter();
// 异步推送更新
emitter.send("实时更新!");
return emitter;
}

✔ 优点:

  • 轻量(基于HTTP/1.1)
  • 兼容多数代理
  • 自动重连机制

✘ 缺点:

  • 单向通信
  • 部分环境支持有限
  • 控制粒度较粗

适用场景

需要简单高效的服务器到客户端更新(如:股票行情、实时比分、状态仪表盘、监控系统等)。

什么是WebSocket?

原理解析

建立双向通道实现实时对话:

  • 服务器:”Bob有新消息”
  • 客户端:”收到!….”

类似对讲机的全双工通信模式。

Spring Boot配置与实现

@Configuration
@EnableWebSocket
publicclassWebSocketConfigimplementsWebSocketConfigurer {
publicvoidregisterWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(newMyHandler(), "/ws").setAllowedOrigins("*");
}
}

// 处理器
publicclassMyHandlerextendsTextWebSocketHandler {
@Override
protectedvoidhandleTextMessage(WebSocketSession session, TextMessage message) {
session.sendMessage(newTextMessage("回显:" + message.getPayload()));
}
}

✔ 优点:

  • 双向通信
  • 低延迟
  • 可通过消息中间件扩展

✘ 缺点:

  • 代理兼容性问题
  • 扩展复杂度高
  • 需维持长连接

适用场景

适用于聊天室、游戏、协作应用等需要双向交互的场景。

小结

最后,结合上面的分析,对于文章开头的业务场景,最终选型方案可以是:

  • 股票交易仪表盘:SSE
  • 即时聊天平台:WebSocket
  • 实时新闻推送(遗留系统):Long Polling

当然,技术选型需因地制宜,具体还是要根据实际场景来选择最优方案!

文章目录
  1. 1. 什么是长轮询?
    1. 1.1. 原理解析
    2. 1.2. Spring Boot实现(长轮询式REST端点):
    3. 1.3. 适用场景
  2. 2. 什么是SSE?
    1. 2.1. 原理解析
    2. 2.2. Spring Boot实现(SSE端点):
    3. 2.3. 适用场景
  3. 3. 什么是WebSocket?
    1. 3.1. 原理解析
    2. 3.2. Spring Boot配置与实现
    3. 3.3. 适用场景
  4. 4. 小结