本文将基于前面构建的 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;@Overridepublic 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;}@Overridepublic 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);}@RpcReferenceprivate HelloService helloService;@PostConstructpublic void init() {System.out.println(helloService.hello("Netty"));}
}
七、总结
通过本文,我们将 Netty RPC 框架成功整合进了 Spring Boot:
✅ 实现了服务自动注册
✅ 注解式远程调用
✅ 自动代理 + 自动注入
✅ 框架模块化、可复用、可发布