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:

✅ 实现了服务自动注册

✅ 注解式远程调用

✅ 自动代理 + 自动注入

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

相关推荐
她似晚风般温柔7893 天前
SpringBoot3 + Netty + Vue3 实现消息推送(最新)
java·websocket·spring·vue·netty
广东数字化转型10 天前
LengthFieldBasedFrameDecoder 详细用法
netty·粘包·拆包
探索java15 天前
Netty Channel详解:从原理到实践
java·后端·netty
你打代码的样子真帅16 天前
从零开始构建物联网设备管理系统:基于Netty的高性能IoT平台实战
物联网·netty
9527出列22 天前
探索服务端启动流程
netty·源码阅读
深圳蔓延科技23 天前
NioEventLoopGroup 完全指南
netty
深圳蔓延科技25 天前
如何使用 Netty 实现 NIO 方式发送 HTTP 请求
netty
Derek_Smart1 个月前
Netty 客户端与服务端选型分析:下位机连接场景
spring boot·后端·netty
Derek_Smart1 个月前
工业级TCP客户端高可靠连接架构设计与Netty优化实践
java·性能优化·netty
c_zyer1 个月前
FreeSWITCH与Java交互实战:从EslEvent解析到Spring Boot生态整合的全指南
spring boot·netty·freeswitch·eslevent