myrpc 学习笔记-0010 启动机制和注解驱动(完结)
项目地址 欢迎访问
笔记总览 myrpc 学习笔记-001 实现简易版 rpc myrpc 学习笔记-002 配置加载 myrpc 学习笔记-003 Mock 服务代理 myrpc 学习笔记-004 序列化实现和 SPI 机制 myrpc 学习笔记-005 注册中心 myrpc 学习笔记-006 自定义协议 myrpc 学习笔记-007 负载均衡 myrpc 学习笔记-008 重试机制 myrpc 学习笔记-009 容错机制 myrpc 学习笔记-0010 启动机制和注解驱动
一、Starter 是什么?
SpringBoot Starter = 自动配置包 作用:
- 让使用者只加一个依赖、一个注解就能启用 RPC 框架
- 自动初始化、自动注册服务、自动注入代理
- 完全融入 Spring 生命周期
myrpc-springboot-starter 实现了:
- 自动初始化 RPC
- 自动发布服务(Provider)
- 自动注入服务(Consumer)
- 自动启动 TCP 服务
二、3个注解
1. @EnableRpc 启动开关
▼java复制代码@EnableRpc @SpringBootApplication public class ProviderApp {}
作用:
- 开启 MyRPC 自动配置
- 通过
@Import导入 3 个启动类 - 可配置是否需要启动服务端
needServer = false
导入的类:
▼java复制代码@Import({ RpcConsumerBootstrap.class, // 消费端注入 RpcProviderBootstrap.class, // 服务端注册 RpcInitBootstrap.class // 框架初始化 })
2. @RpcService 服务提供者(发布服务)
▼java复制代码@RpcService(interfaceClass = UserService.class) public class UserServiceImpl implements UserService {}
功能:
- 被 Spring 识别为 RPC 服务
- 自动注册到 LocalRegistry
- 自动发布到 注册中心(Etcd/ZK)
元注解:
@Component→ 让 Spring 扫描并创建 Bean
3. @RpcReference 服务消费者(注入服务)
▼java复制代码@Service public class UserController { @RpcReference private UserService userService; }
功能:
- 自动注入 RPC 动态代理
- 支持配置:
- 服务版本
- 负载均衡
- 重试策略
- 容错策略
- mock 调用
三、三大启动类
1. RpcInitBootstrap 框架初始化
实现:ImportBeanDefinitionRegistrar 执行时机:Spring 早期
功能:
- 解析
@EnableRpc(needServer) - 执行
RpcApplication.init() - 初始化配置、注册中心
- 判断是否启动
VertxTcpServer
▼java复制代码VertxTcpServer server = new VertxTcpServer(); server.doStart(port);
2. RpcProviderBootstrap 服务发布
实现:BeanPostProcessor 执行时机:Bean 初始化后
功能:
- 扫描所有 Bean
- 识别
@RpcService - 本地注册:
LocalRegistry.register() - 注册中心注册:
registry.register()
流程:
▼text复制代码Bean初始化 → 检查@RpcService → 注册本地 → 注册注册中心
3. RpcConsumerBootstrap 服务注入
实现:BeanPostProcessor 执行时机:Bean 初始化后
功能:
- 扫描所有 Bean 的字段
- 识别
@RpcReference - 创建代理对象:
ServiceProxyFactory.getProxy() - 反射注入字段
▼java复制代码Object proxy = ServiceProxyFactory.getProxy(interfaceClass); field.set(bean, proxy);
四、完整启动流程
服务提供者启动流程
▼text复制代码1. @EnableRpc ↓ 2. RpcInitBootstrap - RpcApplication.init() - 启动 VertxTcpServer ↓ 3. RpcProviderBootstrap - 扫描 @RpcService - 本地注册 - 注册中心注册 ↓ 服务发布完成
服务消费者启动流程
▼text复制代码1. @EnableRpc(needServer = false) ↓ 2. RpcInitBootstrap - 不启动服务器 ↓ 3. RpcConsumerBootstrap - 扫描 @RpcReference - 创建代理对象 - 注入字段 ↓ 可以直接调用远程接口
五、使用示例
服务提供者
▼java复制代码@EnableRpc @SpringBootApplication public class ProviderApp { public static void main(String[] args) { SpringApplication.run(ProviderApp.class, args); } } @RpcService public class UserServiceImpl implements UserService { @Override public User getUser(Long id) { return new User(id, "rpc"); } }
服务消费者
▼java复制代码@EnableRpc(needServer = false) @SpringBootApplication public class ConsumerApp {} @Service public class UserService { @RpcReference( loadBalancer = "random", retryStrategy = "fixedInterval" ) private UserService userService; }
(完结)
从最开始的简易版实现,一步一步的增加新的功能,全局配置、序列化、协议设计、注册中心实现,到 SpringBoot Starter 集成,终于自己亲手从 0 到 1 搭起了一套完整可用的轻量级 RPC 框架。
有过编码报错时的困惑,有过粘包拆包、序列化兼容、注册中心心跳等问题的排查,也有过服务成功调用、启动即运行、注解一键接入时的豁然开朗。
每一个类、每一段逻辑、每一次调试,都是对 RPC 核心思想的深入理解
从底层 TCP 通信到上层注解驱动,从 Etcd 到 ZooKeeper 多注册中心扩展,从服务提供者到消费者全链路打通,整个体系已经完整、健壮、可扩展。
至此,项目圆满完结,撒花 ✨
感谢鱼总!感谢编程导航!这个项目让我收获满满!
