# myRpc **Repository Path**: qxqq/rpc ## Basic Information - **Project Name**: myRpc - **Description**: 基于 JDK21 + Netty + Nacos + Kryo 实现的高性能分布式 RPC 框架。 核心亮点: 零拷贝网络传输、虚拟线程、自定义二进制协议(解决粘包/半包)、支持全链路灰度发布与 SPI 扩展。 专为高并发场景设计,提供类似 Dubbo 的易用性体验。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-06-29 - **Last Updated**: 2026-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 🚀 高性能分布式服务框架 [![Java](https://img.shields.io/badge/Java-21-orange.svg)](https://www.oracle.com/java/) [![Netty](https://img.shields.io/badge/Netty-4.1-blue.svg)](https://netty.io/) [![Nacos](https://img.shields.io/badge/Nacos-2.x-green.svg)](https://nacos.io/) [![License](https://img.shields.io/badge/license-Apache%202.0-brightgreen.svg)](https://github.com/QXFGR/rpc/blob/main/LICENSE) > **Light-RPC** 是一款基于 **Java 21**、**Netty** 和 **Nacos** 实现的轻量级、 > 高性能分布式 RPC 框架。它摒弃了传统的 Java 序列化与阻塞 IO 模型, > 采用**零拷贝**技术与 **虚拟线程**(Virtual Threads)模型, > 旨在在高并发场景下提供极低的延迟与超高的吞吐量。 --- ## ✨ 核心特性 (Features) - **🚀 高性能网络通信** - 基于 **Netty** Reactor 模型,手写自定义二进制协议(Magic+Version+Type+Length+Body)。 - 采用 `LengthFieldBasedFrameDecoder` 完美解决 TCP **粘包/半包**问题。 - 实现 **Zero-Copy (零拷贝)**:利用 `ByteBuf.readSlice` 及 `ByteBufOutputStream` - 避免堆内内存的二次拷贝。 - **⚡️ 极致并发模型 (JDK 21)** - 服务端采用 **JDK 21 虚拟线程 (Virtual Threads)** 处理业务逻辑,实现 IO 线程与业务线程分离。 - 彻底摆脱传统线程池的上下文切换开销,轻松支撑万级并发请求。 - **🧬 服务治理能力** - **注册中心**:集成 **Nacos**,支持服务自动注册与发现,配合客户端本地缓存 + Watch 机制,最小化网络开销。 - **负载均衡**:内置 **一致性哈希 (ConsistentHash)**、轮询 (RoundRobin)等多种算法。 - **流量染色 (灰度发布)**:支持全链路 Tag 透传,可根据请求标签将流量路由到特定灰度实例。 - **优雅停机**:基于 JVM ShutdownHook 实现服务平滑下线,拒绝流量损失。 - **🔌 高扩展性 (SPI)** - 实现了类似 Dubbo 的 **SPI (Service Provider Interface)** 机制。 - 序列化器、注册中心、负载均衡策略均可插拔替换。 - 默认支持 **Kryo**(性能约为 JDK 序列化的 10 倍)和 JDK 序列化。 --- ## 🏗 架构设计 (Architecture) 1. **Consumer (客户端)**:通过动态代理拦截接口调用,封装 RpcRequest,通过负载均衡选择服务实例。 2. **Registry (注册中心)**:负责服务元数据的存储与下发,客户端订阅节点变化。 3. **Network (网络层)**:基于 Netty 实现长连接通信,使用自定义协议进行编码/解码。 4. **Provider (服务端)**:监听端口,使用虚拟线程池执行具体业务逻辑,并将结果回传。 --- ## 🛠 快速开始 (Quick Start) ### 1. 环境要求 - JDK >= 21 - Maven >= 3.x - Nacos Server / ZooKeeper - SpringBoot >= 3.x ### 2. 定义服务接口 (API) ```java public interface UserService { String getUserName(String userId); } ``` ### 3. 服务 ```java @MyRpcService // 标记为服务提供者 public class UserServiceImpl implements UserService { @Override public String getUserName(String userId) { return "Light-RPC User: " + userId; } } ``` ### 4. 客户端调用 ```java public class ConsumerMain { @MyRpcReference private UserService userService; public static void main(String[] args) { // 发起调用 String result = userService.getUserName("1001"); System.out.println(result); // Output: Light-RPC User: 1001 // 演示灰度发布、一致性哈希 RpcContext.set("tag", "gray"); RpcContext.set("hashKey", "userId"); userService.getUserName("test-user"); // 该请求将路由到灰度节点 RpcContext.remove(); } } ```