Skip to content

Alan-MQ/lightning

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lightning RPC Framework

一个用Go实现的高性能RPC框架,支持自定义二进制协议和多种序列化方式。

项目简介

Lightning RPC是一个学习型RPC框架项目,旨在深入理解RPC框架的核心原理和实现细节。通过从零开始构建RPC框架,我们将探索:

  • 自定义二进制协议的设计与实现
  • 序列化与反序列化机制
  • 服务发现与负载均衡
  • 连接管理与性能优化
  • 系统可靠性与监控

🗺️ 开发Roadmap

✅ 当前状态 (v0.1)

  • 基础RPC通信功能
  • 自定义Lightning协议(支持int64和string)
  • 可插拔编解码器(Gob、JSON、Lightning)
  • 基于反射的序列化机制

🚧 Phase 1: 核心RPC增强 (进行中)

目标: 完善基础RPC功能,实现真正的服务调用

  • 服务注册与方法调用
    • 实现服务注册机制
    • 支持方法名路由(如 Calculator.Add
    • 动态方法调用而非硬编码响应
  • 客户端代理生成
    • 自动生成客户端调用代理
    • 支持同步和异步调用
  • 统一错误处理
    • 错误码定义与传播机制

📋 Phase 2: 连接管理与性能优化

目标: 实现连接池和性能优化

  • 连接池管理
    • 客户端连接池
    • 连接复用与生命周期管理
    • 连接健康检查
  • 超时与重试
    • 可配置请求超时
    • 智能重试策略(指数退避)
    • 请求去重
  • 并发控制
    • 请求限流
    • 服务端并发控制

📋 Phase 3: 服务发现与负载均衡

目标: 实现分布式RPC核心功能

  • 服务注册中心
    • 内存注册中心实现
    • 服务注册、发现、心跳
    • 多实例服务支持
  • 客户端负载均衡
    • Round Robin算法
    • 加权随机算法
    • 最少连接数算法
  • 健康检查
    • 主动健康检查
    • 被动故障检测

📋 Phase 4: 可靠性与监控

目标: 实现生产级可靠性保证

  • 熔断器模式
    • 基于失败率的熔断
    • 半开状态恢复
  • 监控与追踪
    • 请求耗时统计
    • QPS监控
    • 调用链追踪
  • 配置管理
    • 动态配置更新
    • 配置热重载

📋 Phase 5: 高级特性 (可选)

目标: 实现高级RPC特性

  • 流式RPC
    • 客户端流/服务端流
    • 双向流
  • 压缩与加密
    • 数据压缩支持
    • TLS加密通信

🏗️ 架构设计

核心组件

  • Server (server/): RPC服务器实现
  • Client (client/): 客户端实现
  • Codec (codec/): 可插拔编解码器
  • Serialization (serialization/): Lightning协议实现
  • Registry (registry/): 服务注册与发现 (计划中)
  • LoadBalancer (loadbalancer/): 负载均衡 (计划中)

Lightning协议特性

  • 自定义二进制序列化(当前支持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框架中反射主要解决两个问题:

  1. 动态方法调用: 客户端不知道服务端提供哪些方法及参数类型
  2. 通用序列化: 服务端需要处理任意复杂对象的序列化/反序列化

字节序的重要性

使用binary.BigEndian确保跨平台兼容:

  • 网络字节序标准
  • 不同架构间数据交换一致性
  • 只有多字节数据才需要考虑字节序

Lightning协议详解

为什么要自定义协议?

  • 性能: 比JSON更高效的二进制传输
  • 控制: 完全掌控序列化/反序列化过程
  • 学习: 深入理解数据编码原理

协议格式示例:

Magic Start (4字节) | 参数数量 (4字节) | 参数类型数组 | 参数长度数组 | 参数数据 | Magic End (4字节)
[33,44,55,12]      | 0x00000002      | [4,3]        | [4,11]       | 数据... | [23,84,55,29]

TCP连接处理

如何从TCP连接中提取完整数据包?

  • 使用魔数标记包边界
  • 先读取固定长度的头部获取数据长度
  • 根据长度读取完整包体
  • 验证结束魔数确保数据完整性

📚 技术栈

  • 语言: Go 1.22+
  • 网络: TCP socket
  • 序列化: 自定义二进制协议 + Gob + JSON
  • 测试: Go标准库 + assert库

🤝 开发计划

这个项目采用渐进式开发方式,每个阶段都有明确的学习目标和可运行的代码。通过实现这些功能,我们将深入理解:

  • RPC框架架构设计原理
  • 分布式系统核心问题与解决方案
  • 负载均衡与服务发现实现细节
  • 系统可靠性与性能优化策略

每个阶段完成后都会更新此README,记录实现细节和学习心得。

🔄 当前进展

已完成功能

  • 基础TCP服务器/客户端通信
  • 自定义Lightning二进制协议
  • 多种编解码器支持(Gob/JSON/Lightning)
  • 基于反射的对象序列化

正在进行

  • Phase 1: 服务注册与真正的RPC方法调用

下一步计划

  • 实现服务注册机制,支持动态方法注册
  • 开发客户端代理生成器
  • 建立统一的错误处理体系

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages