# simple-rpc **Repository Path**: aopmin/simple-rpc ## Basic Information - **Project Name**: simple-rpc - **Description**: 基于SpringBoot+Nacos+Netty实现一个小rpc框架。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-19 - **Last Updated**: 2026-05-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 项目简介 本项目是一个轻量级的小RPC(远程调用)框架,主要实现了服务注册、服务发现、动态代理和Netty通信等核心功能。 ### 核心功能 - **服务注册**:服务提供者将服务注册到Nacos注册中心 - **服务发现**:服务消费者从Nacos发现可用服务实例 - **动态代理**:使用JDK动态代理生成远程服务代理对象 - **Netty通信**:基于Netty实现高性能的RPC通信 - **注解驱动**:使用注解简化服务定义和引用 ## 项目架构 ``` simple-rpc (父工程) ├── simple-api # 公共接口模块 ├── simple-provider # 服务提供者模块 └── simple-consumer # 服务消费者模块 ``` ### 模块说明 | 模块 | 职责 | 端口 | |------|------|------| | **simple-api** | 定义RPC服务接口、实体类和注解 | - | | **simple-provider** | 实现服务接口,注册到Nacos,启动Netty服务器 | HTTP: 8081, RPC: 9999 | | **simple-consumer** | 从Nacos发现服务,动态代理调用远程服务 | HTTP: 8082 | ## 技术栈 - **Spring Boot 3.4.3** - 应用框架 - **Nacos 2.4.2** - 服务注册与发现 - **Netty** - 高性能网络通信 - **JDK 17** - Java开发环境 - **Maven** - 项目构建工具 ## 快速开始 ### 前置条件 1. 安装 JDK 17+ 2. 安装 Maven 3.6+ 3. 启动 Nacos 服务(默认端口 8848) ### 启动 Nacos ```bash # 下载并启动 Nacos # 访问 http://127.0.0.1:8848/nacos # 默认账号/密码: nacos/nacos ``` ### 构建项目 ```bash # 在父工程目录下执行 mvn clean install ``` ### 启动服务提供者 ```bash # 进入 simple-provider 目录 cd simple-provider # 启动服务 mvn spring-boot:run # 或 java -jar target/simple-provider-1.0-SNAPSHOT.jar ``` ### 启动服务消费者 ```bash # 进入 simple-consumer 目录 cd simple-consumer # 启动服务 mvn spring-boot:run # 或 java -jar target/simple-consumer-1.0-SNAPSHOT.jar ``` ### 测试服务 ```bash # 访问消费者提供的 HTTP 接口 curl "http://127.0.0.1:8082/hello?name=World" ``` 预期响应:`Hello, World!` ## 使用示例 ### 1. 定义服务接口(simple-api) ```java public interface HelloRpcService { String sayHello(String name); } ``` ### 2. 实现服务接口(simple-provider) ```java @Service @RpcService public class HelloRpcServiceImpl implements HelloRpcService { @Override public String sayHello(String name) { return "Hello, " + name + "!"; } } ``` ### 3. 调用远程服务(simple-consumer) ```java @RestController public class TestController { @RpcReference private HelloRpcService helloRpcService; @GetMapping("/hello") public String test(@RequestParam("name") String name) { return helloRpcService.sayHello(name); } } ``` ## 配置说明 ### Nacos 配置 所有模块使用相同的 Nacos 服务器地址: ```yaml nacos: server-addr: 127.0.0.1:8848 ``` ### 端口配置 | 模块 | HTTP 端口 | RPC 端口 | |------|-----------|----------| | simple-provider | 8081 | 9999 | | simple-consumer | 8082 | - | ## 项目结构详解 ### simple-api 模块 - **注解定义**:`@RpcService`、`@RpcReference` - **实体类**:`RpcRequest`、`RpcResponse` - **服务接口**:`HelloRpcService` 详细说明:[simple-api/README.md](simple-api/README.md) ### simple-provider 模块 - **服务注册**:`NacosRegistry` - **服务扫描**:`RpcServiceScanner` - **RPC服务器**:`RpcNettyServer`、`RpcServerHandler` - **服务缓存**:`ServiceCache` 详细说明:[simple-provider/README.md](simple-provider/README.md) ### simple-consumer 模块 - **服务发现**:`NacosDiscovery` - **动态代理**:`RpcProxyFactory` - **RPC客户端**:`RpcNettyClient`、`RpcClientHandler` - **依赖注入**:`RpcReferenceInjectProcessor` 详细说明:[simple-consumer/README.md](simple-consumer/README.md) ## 工作流程 ### 服务注册流程 ``` 1. Provider 启动 ↓ 2. 初始化 Nacos 客户端 ↓ 3. 扫描 @RpcService 注解的 Bean ↓ 4. 获取 Bean 实现的接口 ↓ 5. 注册到 Nacos (服务名 + IP + 端口) ↓ 6. 存入本地服务缓存 ↓ 7. 启动 Netty 服务器 ↓ 8. 等待客户端请求 ``` ### 服务调用流程 ``` 1. HTTP 请求到达 ↓ 2. Controller 调用远程服务方法 ↓ 3. 动态代理拦截方法调用 ↓ 4. 从 Nacos 发现服务实例 ↓ 5. 构造 RpcRequest ↓ 6. 通过 Netty 发送请求到 Provider ↓ 7. Provider 处理请求并返回响应 ↓ 8. Consumer 接收响应并返回结果 ↓ 9. HTTP 响应返回客户端 ``` ## 注意事项 1. **Nacos 必须先启动**:Provider 和 Consumer 启动前确保 Nacos 服务正常运行 2. **IP 地址问题**:确保网络配置正确,能够获取到正确的本机 IP 3. **端口冲突**:检查 RPC 端口(9999)和 HTTP 端口(8081/8082)是否被占用 4. **服务注册时机**:服务在 Spring 容器初始化完成后自动注册 5. **网络连通性**:确保 Consumer 能访问 Provider 的 RPC 端口 ## 扩展建议 ### 功能增强 - [ ] 添加服务健康检查 - [ ] 实现更复杂的负载均衡策略(轮询、随机、权重) - [ ] 添加服务熔断和降级机制 - [ ] 支持服务分组和命名空间 - [ ] 添加请求重试机制 - [ ] 支持服务版本控制 ### 性能优化 - [ ] 添加连接池管理 - [ ] 实现请求超时机制 - [ ] 添加监控和链路追踪 - [ ] 支持异步调用 ### 安全增强 - [ ] 添加服务认证机制 - [ ] 支持 TLS 加密通信 - [ ] 添加访问控制 ## 开发指南 ### 添加新的 RPC 服务 1. 在 `simple-api` 模块中定义服务接口 2. 在 `simple-provider` 模块中实现接口并添加 `@RpcService` 注解 3. 在 `simple-consumer` 模块中使用 `@RpcReference` 注解注入服务 ### 调试技巧 - 查看 Nacos 控制台:http://127.0.0.1:8848/nacos - 检查服务注册状态 - 查看日志输出了解请求处理过程 ## 相关资源 - [Spring Boot 官方文档](https://spring.io/projects/spring-boot) - [Nacos 官方文档](https://nacos.io/zh-cn/docs/what-is-nacos.html) - [Netty 官方文档](https://netty.io/wiki/)