优势
与直接使用原始 WebSocket 相比,使用 STOMP 作为子协议可以让 Spring Framework 和 Spring Security 提供比原始 WebSocket 更丰富的编程模型。这就像 HTTP 之于原始 TCP 一样。
以下是使用 STOMP 的主要优势:
- 无需重造轮子: 不再需要发明自定义的消息协议和消息格式。
- 成熟的客户端: 现成的 STOMP 客户端可以直接使用(包括 Spring 提供的 Java 客户端和流行的 JavaScript 库)。
- 消息代理集成: 可以(可选地)使用外部消息代理(如 RabbitMQ、ActiveMQ 等)来管理订阅和广播消息。
- 结构化的应用逻辑:
- 原始方式: 一个连接对应一个
WebSocketHandler,所有类型的消息都在一个地方处理。 - STOMP 方式: 逻辑可以组织在任意数量的
@Controller实例中,消息根据目的地标头路由到对应的方法。
- 原始方式: 一个连接对应一个
- 安全保护: 可以利用 Spring Security 基于消息目的地和消息类型对消息进行精确的权限控制。
补充教学
1. 编程模型的跨跃
直接用 WebSocket 就像是在发“电报”,你得自己规定前三个字节是指令,后四个字节是长度。 用 STOMP 就像是在发“快递”,信封(Header)上已经写好了寄件人、收件人和指令类型,Spring 就像邮局,自动帮你分拣到对应的投递箱(Controller 方法)里。
2. 伸缩性 (Scalability)
如果你以后需要通过消息中间件跨服务器通信,STOMP 的原生支持能让你近乎零配置地从内存模拟切换到真实的 RabbitMQ 集群,这对于构建大规模实时系统至关重要。