# HeartUnderBlade-RPC **Repository Path**: peng-yu-yan-169/HeartUnderBladeRPC ## Basic Information - **Project Name**: HeartUnderBlade-RPC - **Description**: HeartUnderBlade-RPC 是一个基于 Java 和 Spring Boot 的 RPC 框架实现,采用 Netty 进行高性能通信,基于 Redis实现服务注册与发现。项目通过注解驱动 (@RpcService, @RpcReference),支持远程方法调用、动态代理、负载均衡、序列化(JSON、Protobuf、Hessian)和超时重试等功能。 - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-02-16 - **Last Updated**: 2025-02-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ![JoolsRpc](https://img.shields.io/badge/HeartUnderBladeRPC-1.0-gray) ![JDK](https://img.shields.io/badge/JDK-17-blue) ![SpringBoot](https://img.shields.io/badge/SpringBoot-2.6.13-green) ![Maven](https://img.shields.io/badge/Maven-3.8.1-red)![Vert.x](https://img.shields.io/badge/Netty-4.1.111-green) ![Redis](https://img.shields.io/badge/Redis-%23DD0031?logo=redis&logoColor=white) ![Guava](https://img.shields.io/badge/Guava-32.1.2-brightgreen) ![Hutool](https://img.shields.io/badge/Hutool-v5.8.10-purple) # 基本介绍 HeartUnderBlade-RPC 是一个基于 Java 和 Spring Boot 的 RPC 框架实现,采用 Netty 进行高性能通信,基于 Redis实现服务注册与发现。项目通过注解驱动 (@RpcService, @RpcReference),支持远程方法调用、动态代理、负载均衡、序列化(JSON、Protobuf、Hessian)和超时重试等功能。 # 项目结构 ```xml HeartUnderBladeRPC/ │ ├── heartunderblade-rpc-springboot-starter # 基于 HeartUnderBladeRPC 的 Spring Boot 启动器 │ ├── sample-springboot-consumer/ # 基于 `heartunderblade-rpc-springboot-starter` 的消费者模块 │ ├── sample-springboot-provider/ # 基于 `heartunderblade-rpc-springboot-starter` 的提供者模块 │ ├── simple-consumer/ # 轻量级消费者模块 │ ├── simple-provider/ # 轻量级提供者模块 │ ├── heartunderblade-rpc-core/ # 框架的核心模块,提供多项功能 │ ├── heartunderblade-rpc-easy/ # 轻量级框架,仅支持本地服务注册与发现 │ ├── sample-common/ # 公共工具类或共享模型 │ └── pom.xml # Maven 构建文件 ``` # 快速开始 ### 1.修改注册中心 请先修改heartunderblade-rpc-core中redis地址,请确保redis已启动 ```java @Data public class RegistryConfig { /** * 注册中心类别 */ private String registry = "redis"; /** * 注册中心地址 */ private String address = "http://192.168.101.128:6379"; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 超时时间(单位毫秒) */ private Long timeout = 10000L; } ``` ### 2.创建共享包 在配置 Provider 和 Consumer 之前,首先创建一个共享模块,该模块包含通用实体(User)和服务接口(UserService)。这个共享包将在 Provider 和 Consumer 之间复用。 定义共享实体和服务接口 ```java // User.java public class User { private String name; public User(String name) { this.name = name; } // Getters and Setters public String getName() { return name; } public void setName(String name) { this.name = name; } } // UserService.java public interface UserService { User getUser(User user); } ``` 打包并发布到本地 Maven 仓库 创建共享模块后,将其打包为 JAR 文件,并发布到本地 Maven 仓库,以便 Provider 和 Consumer 都能使用它。 ```she # 将共享模块安装到本地 Maven 仓库 mvn clean install ``` ### 3.导入依赖 创建 **服务提供者(Service Provider)** 和 **服务消费者(Service Consumer)** 模块,并在 `pom.xml` 或 `build.gradle` 文件中添加必要的依赖项。 ```xml com.heartunderblade starter 0.0.1-SNAPSHOT {common-package-name} exp-common 1.0-SNAPSHOT ``` ### 4.配置服务提供者(Provider) 创建 **Spring Boot 服务提供者** 应用,并在主类上使用 `@EnableRpc` 注解,启用 RPC 服务功能。 ```java @SpringBootApplication @EnableRpc public class ExampleSpringbootProviderApplication { public static void main(String[] args) { SpringApplication.run(ExampleSpringbootProviderApplication.class, args); } } ``` **实现 `UserService` 接口**,并提供远程调用的方法: ```java @Service public class UserServiceImpl implements UserService { @Override public User getUser(User user) { user.setName("Hello, " + user.getName()); return user; } } ``` ### 5.配置服务消费者(Consumer) 创建 **Spring Boot 服务消费者** 应用,并在主类上使用 `@EnableRpc`,并设置 `needServer = false`,表明这是一个仅作为客户端的 Consumer。 ```java @SpringBootApplication @EnableRpc(needServer = false) public class ExampleSpringbootConsumerApplication { public static void main(String[] args) { SpringApplication.run(ExampleSpringbootConsumerApplication.class, args); } } ``` ### 6.注入远程服务代理 使用 `@RpcReference` 注解,将远程服务代理注入 Bean 中,框架会自动创建 `UserService` 的代理对象,并处理底层 RPC 通信。 ```java /** * @description: 注入 Spring 容器的 Bean 类。 * `@Reference` 让框架自动创建 `UserService` 的代理对象,透明地处理 RPC 调用。 */ @Service @Slf4j public class ExampleServiceImpl { @RpcReference private UserService userService; public void testUserService() { log.info("UserService 代理类型: {}", userService.getClass().getSimpleName()); User user = new User("heartunderblade"); User ans = userService.getUser(user); System.out.println(ans.getName()); } } ``` ### 7.测试服务消费者 创建一个测试类,验证 `UserService` 代理是否能正确工作。测试方法 `testUserService()` 将透明地调用远程 RPC 服务。 ```java public class ExampleServiceImplTest { @Resource private ExampleServiceImpl exampleService; @Test public void testUserService() { exampleService.testUserService(); } } ``` ### 8.总结 **服务提供者(Provider)**:使用 `@EnableRpc` 启用 RPC 并实现 `UserService` 业务逻辑。 **服务消费者(Consumer)**:使用 `@EnableRPC` 并通过 `@RPCReference` 注入远程服务代理。 **透明的 RPC 机制**:框架自动处理底层通信和序列化,使开发者专注于业务逻辑,而无需关心 RPC 细节。 # 项目架构图 1.简化基础RPC框架结构 ![34d4914fbfc39d33f3212f6666b59232](./assets/34d4914fbfc39d33f3212f6666b59232.png) 2.RPC框架的关键功能 ![73e0e6206be3b96982f5f1a7d55ba23c](./assets/73e0e6206be3b96982f5f1a7d55ba23c.png) 3.定制化设计协议结构 ![bcc1468c89b52c5de5400a2aa9bf4412](./assets/bcc1468c89b52c5de5400a2aa9bf4412.png) 4.定制化协议的解码与编码 ![image-20250206111121434](./assets/image-20250206111121434.png)