轻量级rpc框架核心职责是序列化、网络传输、服务寻址和请求响应生命周期管理;采用单线程reactor验证通路,分protocol、transport、invocation三层,精简nio实现并提供直觉式api。

明确核心职责,避免过度设计
轻量级 RPC 框架的“优雅”首先体现在边界清晰:它只负责 序列化、网络传输、服务寻址、请求响应生命周期管理,不掺杂注册中心、配置中心、熔断降级等上层能力。NIO 封装的重点是屏蔽 Selector 轮询、ByteBuffer 管理、连接状态机等底层细节,而非重造 Netty。建议从一个单线程 Reactor 入手(1 个 Selector + 主循环),验证基础通路,再按需扩展为多线程模型(如主从 Reactor)。
分层抽象,各司其职
典型三层结构足够轻量又不失可维护性:
- Protocol 层:定义消息格式(如 Magic Number + Version + Type + Length + Body),统一 Request/Response 对象,支持 SPI 插拔序列化器(JSON/Hessian/Protobuf)
-
Transport 层:封装 NIO 核心——
NioEventLoop(自研简易版)、Channel(包装SocketChannel)、ChannelHandler(责任链处理编解码、心跳、超时) -
Invocation 层:提供
Invoker(发起调用)、Exporter(暴露服务),通过Future或回调支持异步,用ConcurrentHashMap维护请求 ID →Promise映射实现响应匹配
精简 NIO 实现的关键细节
绕不开但必须克制:
- 使用
ByteBuffer的compact()而非反复clear(),避免内存抖动;读写共用一个 buffer 时注意 flip/compact 时机 - 连接建立后立即注册
OP_READ,写操作用channel.write()返回的int判断是否写完,未写完则注册OP_WRITE,写完立刻取消,防止空轮询 - 心跳包走独立定时任务(
ScheduledExecutorService),不依赖业务线程;超时检测在收到响应或心跳应答时刷新时间戳,由后台线程扫描过期请求并触发失败回调
接口友好,贴近直觉
最终使用者不该感知 NIO。例如:
RpcClient client = RpcClientBuilder.newBuilder()
.serializer(HessianSerializer.class)
.connectTimeout(3000)
.build();
UserService service = client.refer(UserService.class, "127.0.0.1:2181");
User user = service.findById(1001); // 同步调用
背后自动完成:代理生成 → 编码 Request → 异步发包 → 阻塞等待 Promise → 解码 Response。同步只是封装了 Future.get(),异步则直接返回 CompletableFuture。
不复杂但容易忽略
真正的轻量不是代码行数少,而是每个模块无冗余职责、错误有明确归属、调试有日志锚点(比如打印每次 selector.select() 的就绪数量、每次 read/write 的字节数)。先跑通一个本地 socket 调用,再加压缩、再加 TLS,迭代比蓝图重要。










