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
繁體地址,請注明出處:http://hk.pswp.cn/news/907574.shtml
英文地址,請注明出處:http://en.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("…