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:

✅ 实现了服务自动注册

✅ 注解式远程调用

✅ 自动代理 + 自动注入

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

相关推荐
砍材农夫7 小时前
物联网 基于netty构建mqtt协议规范(主题通配符订阅)
java·前端·javascript·物联网·netty
砍材农夫2 天前
物联网 基于netty构建mqtt协议规范(发布/订阅模式)
java·开发语言·物联网·netty
砍材农夫3 天前
物联网 基于netty构建mqtt服务协议支持
java·物联网·struts·netty
devilnumber4 天前
Netty 核心重点精讲(面试 + 工作 精简背诵版)
面试·netty
砍材农夫4 天前
物联网 基于netty心跳和ack机制
java·物联网·netty
砍材农夫5 天前
物联网 基于netty编解码器机制与自定义协议
物联网·netty
不懂的浪漫9 天前
02|Netty 服务端是怎么启动的:从 ServerBootstrap.bind() 看源码主线
架构·netty
不懂的浪漫13 天前
Netty 系列文章总览:从源码主线到业务架构判断
架构·netty