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

本文将基于前面构建的 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:

✅ 实现了服务自动注册
✅ 注解式远程调用
✅ 自动代理 + 自动注入
✅ 框架模块化、可复用、可发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure中继器学习笔记

一、中继器概述 中继器(Axure Repeater)是Axure中的高级组件&#xff0c;功能类似于数据集成器&#xff0c;主要用于&#xff1a; 数据存储与管理 数据的增删改查操作 数据的分页与展示控制 二、中继器基本使用流程 数据存储&#xff1a;将数据储存在中继器组件中 数据展…

hf-mirror断点续传下载权重

直接浏览器双击一个一个下载 这种方式不支持断点续传 dnf install git-lfs -y 下面成功跳过 LFS 权重下载只拿到 Git 元数据和 LFS 占位符文件了 GIT_LFS_SKIP_SMUDGE1 git clone https://hf-mirror.com/Tongyi-Zhiwen/QwenLong-L1-32B cd QwenLong-L1-32B git lfs install -…

【软件安装那些事 3 】CAD(2026 V60.7z) 安装教程(中文简体版)步骤完整不跳步 { 附软件提取下载链接,永久有效---------百度网盘 }

通过网盘分享的文件&#xff1a;CAD2026 V60.7z 安装包 中文 &#xff08;永久有效&#xff09; 链接: https://pan.baidu.com/s/122UXbOK9iGsD5Ld-lzrfAA?pwdneqd 提取码: neqd 1、解压完成后&#xff0c;打开【Setup】文件夹 2、鼠标右击【Setup】…

RK3399 Android7.1增加应用安装白名单机制

通过设置应用包名白名单的方式限制未授权的应用软件安装。 diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java index af9a533..ca…

体现物联网环境下安全防护的紧迫性 :物联网环境下的个人信息安全:隐忧与防护之道

摘要&#xff1a;随着物联网的飞速发展&#xff0c;个人信息在物联网环境下面临的安全风险日益严峻。本文深入探讨了物联网环境下个人信息泄露的主要途径&#xff0c;分析了当前个人信息安全保护面临的挑战&#xff0c;并从技术、法律、企业责任和个人意识等多方面提出了相应的…

vue3 项目配置多语言支持,如何从服务端拿多语言配置

在 Vue3 项目中实现多语言支持并从服务端获取配置&#xff0c;可以使用 Vue I18n 库。在初始化阶段可以发送请求获取多语言配置或者通过本地文件加载json文件的方式&#xff0c;都可以实现。我这里是tauri项目&#xff0c;所以使用的是invoke从tauri端拿到配置文件&#xff0c;…

使用ssh-audit扫描ssh过期加密算法配置

使用ssh-audit扫描ssh过期加密算法配置 安装检查ssh的加密算法配置修改ssh的加密算法配置 安装 # pip3安装ssh-audit pip3 instal ssh-audit检查ssh的加密算法配置 # 检查ssh的配置 ssh-audit 192.168.50.149修改ssh的加密算法配置 # 查看ssh加密配置文件是否存在 ls /etc/c…

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下

前五道题&#xff1a;LeetCode 高频 SQL 50 题&#xff08;基础版&#xff09;之 【连接】部分 上 题目&#xff1a;577. 员工奖金 题解&#xff1a; select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…

[yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码

[RFAConv介绍] 1、RFAConv 在传统卷积操作中&#xff0c;每个感受野都使用相同的卷积核参数&#xff0c;无法区分不同位置的信息差异&#xff0c;这都限制了网络性能。此外&#xff0c;由于空间注意力以及现有空间注意力机制的局限性&#xff0c;虽然能够突出关键特征&#xf…

【软件设计】通过软件设计提高 Flash 的擦写次数

目录 0. 个人简介 && 授权须知1. Flash 和 EEROM 基本情况2. 场景要求3. 软件设计思路4. 代码展示4.1 flash.h4.2 flash.c 0. 个人简介 && 授权须知 &#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是喜欢记录零碎知识点的菜鸟…

OpenCV CUDA模块直方图计算------在 GPU 上计算输入图像的直方图(histogram)函数histEven()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于在 GPU 上计算输入图像的直方图&#xff08;histogram&#xff09;。它将像素值区间均匀划分为若干个 bin&#xff08;桶&#xff09;…

龙虎榜——20250530

上证指数阳包阴&#xff0c;量能较前期下跌有放大&#xff0c;但个股跌多涨少&#xff0c;下跌超过4000个。 深证指数和上涨总体相同。 2025年5月30日龙虎榜行业方向分析 1. 医药&#xff08;创新药原料药&#xff09; 代表标的&#xff1a;华纳药厂、舒泰神、睿智医药、华…

HarmonyNext使用request.agent.download实现断点下载

filedownlaod(API12) &#x1f4da;简介 filedownload 这是一款支持大文件断点下载的开源插件&#xff0c;退出应用程序进程杀掉以后或无网络情况下恢复网络后&#xff0c;可以在上次位置继续恢复下载等 版本更新—请查看更新日志!!! 修复已知bug,demo已经更新 &#x1f4d…

nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: 80端口被占用

Nginx启动报错&#xff1a;nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions) 这个报错代表80端口被占用 先查看占用80的端口 netstat -aon | findstr :80 把它杀掉&#xff0c;强…

embbeding 视频截图

Embedding是什么&#xff1f;有什么作用&#xff1f;是怎么得到的&#xff1f;_哔哩哔哩_bilibili

服务器tty2终端如何关机

在服务器的 tty2 或其他虚拟终端上&#xff0c;要安全地进行关机操作&#xff0c;可以使用以下命令之一&#xff1a; 1.1 使用 shutdown 命令&#xff1a; shutdown 命令可以计划系统关机。默认需要超级用户权限。 sudo shutdown -h now-h 选项表示关机&#xff08;halt&…

时序数据库IoTDB启动方式及集群迁移指南

IoTDB启动方式 IoTDB在配置启动时有两种推荐方式&#xff1a; ‌主机名启动‌&#xff1a; ‌推荐理由‌&#xff1a;主机名启动方式更为灵活&#xff0c;便于在不同网络环境中部署相同的IoTDB实例。‌工作原理‌&#xff1a;IoTDB启动后会维护一张节点编号与网络地址的映射表…

如何在Qt中绘制一个带有动画的弧形进度条?

如何在Qt中绘制一个弧形的进度条 在图形用户界面开发中&#xff0c;进度指示控件&#xff08;Progress Widget&#xff09;是非常常见且实用的组件。CCArcProgressWidget 是一个继承自 QWidget 的自定义控件&#xff0c;用于绘制圆弧形进度条。当然&#xff0c;笔者看了眼公开…

在 Mac 下 VSCode 中的终端使用 option + b 或 f 的快捷键变成输入特殊字符的解决方案

前言 在终端里&#xff0c;我们可以使用 option b 和 option f 来在我们输入的命令中进行快速的前后调整光标&#xff0c;但是&#xff0c;在未设置的情况下&#xff0c;在 MacOS 中&#xff0c;会变成输入特殊字符。 普通键盘上是 alt b 和 alt f &#xff0c;只是叫法不…

Android bindservice绑定服务,并同步返回service对象的两个方法

先上一段代码&#xff1a; private IDeviceService deviceService null; private ServiceConnection connnull; private synchronized void bindyourservice() { Intent intent new Intent();intent.setPackage("servicepackagename");intent.setAction("…