一个用Go实现的高性能RPC框架,支持自定义二进制协议和多种序列化方式。
Lightning RPC是一个学习型RPC框架项目,旨在深入理解RPC框架的核心原理和实现细节。通过从零开始构建RPC框架,我们将探索:
- 自定义二进制协议的设计与实现
- 序列化与反序列化机制
- 服务发现与负载均衡
- 连接管理与性能优化
- 系统可靠性与监控
- 基础RPC通信功能
- 自定义Lightning协议(支持int64和string)
- 可插拔编解码器(Gob、JSON、Lightning)
- 基于反射的序列化机制
目标: 完善基础RPC功能,实现真正的服务调用
- 服务注册与方法调用
- 实现服务注册机制
- 支持方法名路由(如
Calculator.Add
) - 动态方法调用而非硬编码响应
- 客户端代理生成
- 自动生成客户端调用代理
- 支持同步和异步调用
- 统一错误处理
- 错误码定义与传播机制
目标: 实现连接池和性能优化
- 连接池管理
- 客户端连接池
- 连接复用与生命周期管理
- 连接健康检查
- 超时与重试
- 可配置请求超时
- 智能重试策略(指数退避)
- 请求去重
- 并发控制
- 请求限流
- 服务端并发控制
目标: 实现分布式RPC核心功能
- 服务注册中心
- 内存注册中心实现
- 服务注册、发现、心跳
- 多实例服务支持
- 客户端负载均衡
- Round Robin算法
- 加权随机算法
- 最少连接数算法
- 健康检查
- 主动健康检查
- 被动故障检测
目标: 实现生产级可靠性保证
- 熔断器模式
- 基于失败率的熔断
- 半开状态恢复
- 监控与追踪
- 请求耗时统计
- QPS监控
- 调用链追踪
- 配置管理
- 动态配置更新
- 配置热重载
目标: 实现高级RPC特性
- 流式RPC
- 客户端流/服务端流
- 双向流
- 压缩与加密
- 数据压缩支持
- TLS加密通信
- Server (
server/
): RPC服务器实现 - Client (
client/
): 客户端实现 - Codec (
codec/
): 可插拔编解码器 - Serialization (
serialization/
): Lightning协议实现 - Registry (
registry/
): 服务注册与发现 (计划中) - LoadBalancer (
loadbalancer/
): 负载均衡 (计划中)
- 自定义二进制序列化(当前支持int64和string)
- 魔数标识包边界
- Big-endian字节序保证跨平台兼容
- 包格式:
[MAGIC_START][参数数量][参数类型][参数长度][参数数据][MAGIC_END]
go run main/main.go
go test ./... # 运行所有测试
go test ./serialization # 测试Lightning协议
go test -v ./serialization # 详细测试输出
go build ./main # 构建主程序
go build . # 构建所有包
go fmt ./... # 格式化代码
go vet ./... # 静态分析
go mod tidy # 清理依赖
RPC框架中反射主要解决两个问题:
- 动态方法调用: 客户端不知道服务端提供哪些方法及参数类型
- 通用序列化: 服务端需要处理任意复杂对象的序列化/反序列化
使用binary.BigEndian
确保跨平台兼容:
- 网络字节序标准
- 不同架构间数据交换一致性
- 只有多字节数据才需要考虑字节序
为什么要自定义协议?
- 性能: 比JSON更高效的二进制传输
- 控制: 完全掌控序列化/反序列化过程
- 学习: 深入理解数据编码原理
协议格式示例:
Magic Start (4字节) | 参数数量 (4字节) | 参数类型数组 | 参数长度数组 | 参数数据 | Magic End (4字节)
[33,44,55,12] | 0x00000002 | [4,3] | [4,11] | 数据... | [23,84,55,29]
如何从TCP连接中提取完整数据包?
- 使用魔数标记包边界
- 先读取固定长度的头部获取数据长度
- 根据长度读取完整包体
- 验证结束魔数确保数据完整性
- 语言: Go 1.22+
- 网络: TCP socket
- 序列化: 自定义二进制协议 + Gob + JSON
- 测试: Go标准库 + assert库
这个项目采用渐进式开发方式,每个阶段都有明确的学习目标和可运行的代码。通过实现这些功能,我们将深入理解:
- RPC框架架构设计原理
- 分布式系统核心问题与解决方案
- 负载均衡与服务发现实现细节
- 系统可靠性与性能优化策略
每个阶段完成后都会更新此README,记录实现细节和学习心得。
- 基础TCP服务器/客户端通信
- 自定义Lightning二进制协议
- 多种编解码器支持(Gob/JSON/Lightning)
- 基于反射的对象序列化
- Phase 1: 服务注册与真正的RPC方法调用
- 实现服务注册机制,支持动态方法注册
- 开发客户端代理生成器
- 建立统一的错误处理体系