1. Spring Cloud Gateway 与 WebSocket 的奇妙组合
Spring Cloud Gateway 作为微服务架构中的统一入口,不仅能够处理传统的 HTTP 请求,还能完美支持 WebSocket 协议。这对于需要实时通信的场景来说简直是福音,比如在线协作工具、即时聊天系统或者实时数据监控平台。
我去年负责过一个在线教育项目,需要实现老师和学生之间的实时互动。当时就是通过 Spring Cloud Gateway 来统一管理 WebSocket 连接的。相比直接在客户端连接各个微服务,网关方案让我们的架构更加清晰,也更容易实现负载均衡和故障转移。
WebSocket 和 HTTP 最大的区别在于它是长连接。HTTP 是无状态的,每次请求响应后连接就断开了。而 WebSocket 一旦建立连接就会一直保持,非常适合实时性要求高的场景。但这也给网关带来了新的挑战 - 如何高效地管理和转发这些长连接。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 基础配置:让 WebSocket 畅通无阻
2.1 最简单的 WebSocket 路由配置
让我们从一个最基本的配置开始。假设我们有一个运行在 9099 端口的 WebSocket 服务,想让网关将所有 /websocket 路径的请求转发过去:
yaml复制spring:
cloud:
gateway:
routes:
- id: websocket-basic
uri: ws://localhost:9099
predicates:
- Path=/websocket
这个配置虽然简单,但有几个关键点需要注意:
- 协议必须是
ws://或wss://(安全版本),不能使用 http - uri 要指向 WebSocket 服务的完整地址,包括端口号
- Path 断言用来匹配 WebSocket 的握手请求路径
我在第一次配置时犯了个低级错误,把协议写成了 http,结果死活连不上。后来抓包才发现握手请求被当成了普通 HTTP 请求处理,返回了 404。
2.2 服务发现集成
实际项目中我们更倾向于使用服务发现机制,而不是硬编码 IP 地址。假设你的 WebSocket 服务注册到了 Nacos,可以这样配置:
yaml复制spring:
cloud:
gateway:
routes:
- id: websocket-lb
uri: lb:ws://websocket-service
predicates:
- Path=/websocket
这里的 lb:ws:// 前缀很关键
