Netty 实战篇:Netty RPC 框架整合 Spring Boot,迈向工程化

本文将基于前面构建的 RPC 能力,尝试将其与 Spring Boot 整合,借助注解、自动扫描、依赖注入等机制,打造"开箱即用"的 Netty RPC 框架,提升开发效率与工程规范。


一、为什么要整合 Spring Boot?

手动 new 实例、写注册逻辑、写接口代理代码太繁琐,不利于实际项目使用。我们希望:

  • 通过注解快速暴露服务(类似 @RestController)

  • 通过注解快速引用远程服务(类似 @FeignClient)

  • 自动初始化注册中心、Netty 客户端、服务端

✅ 本文目标:打造注解驱动、自动装配的 RPC 框架


二、目标效果

java 复制代码
// 暴露远程服务
@RpcService
public class HelloServiceImpl implements HelloService {
    public String hello(String name) {
        return "Hello " + name;
    }
}

// 注入远程调用代理
@RpcReference
private HelloService helloService;

三、自定义注解

java 复制代码
@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 加载注册逻辑:

java 复制代码
@Configuration
@ComponentScan("com.example.rpc")
@Import(RpcBeanPostProcessor.class)
public class RpcAutoConfiguration {
}

RpcBeanPostProcessor 扫描所有 @RpcService 和 @RpcReference 注解:

java 复制代码
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 项目结构建议

java 复制代码
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 引入:

XML 复制代码
<dependency>
    <groupId>com.example</groupId>
    <artifactId>rpc-spring-boot-starter</artifactId>
    <version>1.0.0</version>
</dependency>

六、使用示例

服务端:

java 复制代码
@SpringBootApplication
public class RpcProviderApp {
    public static void main(String[] args) {
        SpringApplication.run(RpcProviderApp.class, args);
    }
}
java 复制代码
@RpcService
public class HelloServiceImpl implements HelloService {
    public String hello(String name) {
        return "Hello from Provider: " + name;
    }
}

客户端:

java 复制代码
@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:

✅ 实现了服务自动注册

✅ 注解式远程调用

✅ 自动代理 + 自动注入

✅ 框架模块化、可复用、可发布

相关推荐
daidaidaiyu3 天前
一文学习和实践 当下互联网安全的基石 - TLS 和 SSL
java·netty
enjoy编程3 天前
Spring boot 4 探究netty的关键知识点
spring boot·设计模式·reactor·netty·多线程
ps酷教程6 天前
HttpData
http·netty
ps酷教程11 天前
ChunkedWriteHandler源码浅析
java·netty·分块传输
奕辰杰14 天前
Netty私人学习笔记
笔记·学习·netty·网络通信·nio
ps酷教程16 天前
HttpObjectDecoder源码浅析
java·netty·httpaggregator
魔芋红茶21 天前
Netty 简易指南
java·开发语言·netty
ps酷教程21 天前
HttpAggregator源码浅析
netty·httpaggregator
9527出列24 天前
Netty实战--使用netty构建WebSocket服务
websocket·网络协议·netty