本文将基于前面构建的 RPC 能力,尝试将其与 Spring Boot 整合,借助注解、自动扫描、依赖注入等机制,打造“开箱即用”的 Netty RPC 框架,提升开发效率与工程规范。
一、为什么要整合 Spring Boot?
手动 new 实例、写注册逻辑、写接口代理代码太繁琐,不利于实际项目使用。我们希望:
通过注解快速暴露服务(类似 @RestController)
通过注解快速引用远程服务(类似 @FeignClient)
自动初始化注册中心、Netty 客户端、服务端
✅ 本文目标:打造注解驱动、自动装配的 RPC 框架
二、目标效果
// 暴露远程服务
@RpcService
public class HelloServiceImpl implements HelloService {
public String hello(String name) {
return "Hello " + name;
}
}
// 注入远程调用代理
@RpcReference
private HelloService helloService;
三、自定义注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RpcService {
String name() default "";
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RpcReference {
String name() default "";
}
四、定义配置类与自动扫描器
我们通过 Spring Boot 的 @Import 加载注册逻辑:
@Configuration
@ComponentScan("com.example.rpc")
@Import(RpcBeanPostProcessor.class)
public class RpcAutoConfiguration {
}
RpcBeanPostProcessor 扫描所有 @RpcService 和 @RpcReference 注解:
public class RpcBeanPostProcessor implements BeanPostProcessor, ApplicationContextAware {
private ApplicationContext context;
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
if (bean.getClass().isAnnotationPresent(RpcService.class)) {
// 注册服务到注册中心 + 启动 Netty 服务端
RpcServer.register(bean);
}
for (Field field : bean.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(RpcReference.class)) {
Object proxy = RpcClient.createProxy(field.getType());
field.setAccessible(true);
try {
field.set(bean, proxy);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
return bean;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.context = applicationContext;
}
}
五、Spring Boot 项目结构建议
rpc-core/
├── RpcClient.java
├── RpcServer.java
├── RpcProxy.java
├── annotation/
├── processor/
rpc-spring-boot-starter/
├── RpcAutoConfiguration.java
├── META-INF/spring.factories
demo-provider/
├── HelloServiceImpl.java
demo-consumer/
├── HelloController.java
只需在 pom.xml 引入:
<dependency>
<groupId>com.example</groupId>
<artifactId>rpc-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
六、使用示例
服务端:
@SpringBootApplication
public class RpcProviderApp {
public static void main(String[] args) {
SpringApplication.run(RpcProviderApp.class, args);
}
}
@RpcService
public class HelloServiceImpl implements HelloService {
public String hello(String name) {
return "Hello from Provider: " + name;
}
}
客户端:
@SpringBootApplication
public class RpcConsumerApp {
public static void main(String[] args) {
SpringApplication.run(RpcConsumerApp.class, args);
}
@RpcReference
private HelloService helloService;
@PostConstruct
public void init() {
System.out.println(helloService.hello("Netty"));
}
}
七、总结
通过本文,我们将 Netty RPC 框架成功整合进了 Spring Boot:
✅ 实现了服务自动注册
✅ 注解式远程调用
✅ 自动代理 + 自动注入
✅ 框架模块化、可复用、可发布