websocket可构建轻量级rpc:约定json消息格式(含唯一id、method、params/result/error),客户端用map缓存promise并设超时,服务端路由白名单方法并异步执行,需处理断连重连、幂等及序列化限制。

WebSocket 本身不提供 RPC 语义,但可以基于它构建轻量级 RPC:核心是约定请求/响应的消息格式、维护请求 ID 映射、处理超时和错误。不需要引入框架,几十行代码就能跑起来。
定义统一的 RPC 消息协议
客户端和服务端必须协商一套简单结构,推荐用 JSON:
-
请求消息:包含
id(唯一字符串或数字)、method(方法名)、params(参数数组或对象) -
响应消息:包含相同
id、result(成功返回值)或error(失败对象,含code和message) - ID 必须全局唯一且可追溯,建议用
crypto.randomUUID()(现代浏览器)或时间戳+随机数生成
客户端:发请求 + 收响应 + 触发 Promise
封装一个 call(method, params) 方法,内部创建 Promise 并缓存 resolve/reject 函数:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 发送前生成唯一
id,把{ id, method, params }发给 WebSocket - 用 Map 存
id → { resolve, reject, timeoutId },避免内存泄漏 - 收到响应后根据
id查找并调用对应 resolve/reject;匹配不到则忽略(可能是超时后到达) - 设置定时器,比如 10 秒未响应就 reject,并清理 Map 中该 ID 条目
服务端:路由方法 + 执行 + 回传结果
服务端监听 WebSocket 的 message,解析后执行对应逻辑:
- 检查是否为合法 RPC 请求(含
id、method),否则直接丢弃 - 从注册表中查找
method对应的函数(如rpcMethods['getUser'] = async (id) => {...}) - 调用函数,捕获异常;无论成功失败,都构造带原
id的响应消息发回 - 不阻塞:所有方法应返回 Promise,支持异步操作(数据库、HTTP 调用等)
注意事项与健壮性补充
真实场景下需考虑连接断开、重连、重复 ID、并发压力等问题:
- WebSocket 断开时,清空所有待响应的 Promise 缓存,并标记为 “连接已断”
- 重连成功后,可选择重发未确认的请求(需服务端幂等)或让用户手动重试
- 服务端避免直接
eval或反射调用任意方法,只允许白名单内的method名称 - 大参数或返回值注意 JSON 序列化限制(如 Date、undefined、function 会丢失)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










