myrpc 学习笔记-0010 启动机制和注解驱动(完结)

项目地址 欢迎访问

https://gitee.com/longlong5/myrpc

笔记总览 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 实现了:

  1. 自动初始化 RPC
  2. 自动发布服务(Provider)
  3. 自动注入服务(Consumer)
  4. 自动启动 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 早期

功能:

  1. 解析 @EnableRpc(needServer)
  2. 执行 RpcApplication.init()
  3. 初始化配置、注册中心
  4. 判断是否启动 VertxTcpServer
java
复制代码
VertxTcpServer server = new VertxTcpServer(); server.doStart(port);

2. RpcProviderBootstrap 服务发布

实现:BeanPostProcessor 执行时机:Bean 初始化后

功能:

  1. 扫描所有 Bean
  2. 识别 @RpcService
  3. 本地注册:LocalRegistry.register()
  4. 注册中心注册:registry.register()

流程:

text
复制代码
Bean初始化 → 检查@RpcService → 注册本地 → 注册注册中心

3. RpcConsumerBootstrap 服务注入

实现:BeanPostProcessor 执行时机:Bean 初始化后

功能:

  1. 扫描所有 Bean 的字段
  2. 识别 @RpcReference
  3. 创建代理对象:ServiceProxyFactory.getProxy()
  4. 反射注入字段
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 多注册中心扩展,从服务提供者到消费者全链路打通,整个体系已经完整、健壮、可扩展。

至此,项目圆满完结,撒花 ✨

感谢鱼总!感谢编程导航!这个项目让我收获满满!

0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
longlong
下载 APP