Netty 實戰篇:手寫一個輕量級 RPC 框架原型

本文將基于前文實現的編解碼與心跳機制,構建一個簡單的 RPC 框架,包括請求封裝、響應解析、動態代理調用。為打造微服務通信基礎打下基礎。


一、什么是 RPC?

RPC(Remote Procedure Call,遠程過程調用)允許你像調用本地方法一樣調用遠程服務。

RPC 框架的核心包括:

  • 通信協議(我們用 Netty 實現)

  • 服務注冊與發現(此處簡化為直連)

  • 編碼/解碼機制(TLV、自定義協議)

  • 動態代理與調用(Java 反射)


二、定義協議數據結構

請求對象

public class RpcRequest {private String className;private String methodName;private Class<?>[] paramTypes;private Object[] args;
}

響應對象

public class RpcResponse {private Object result;private Throwable error;
}

三、編碼器和解碼器(簡化版)

此處建議使用 Java 內置序列化或 JSON,避免自行實現復雜字節協議

public class RpcEncoder<T> extends MessageToByteEncoder<T> {@Overrideprotected void encode(ChannelHandlerContext ctx, T msg, ByteBuf out) throws Exception {byte[] data = SerializationUtil.serialize(msg); // 自定義序列化工具out.writeInt(data.length);out.writeBytes(data);}
}
public class RpcDecoder<T> extends ByteToMessageDecoder {private final Class<T> clazz;public RpcDecoder(Class<T> clazz) { this.clazz = clazz; }@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {if (in.readableBytes() < 4) return;in.markReaderIndex();int length = in.readInt();if (in.readableBytes() < length) {in.resetReaderIndex();return;}byte[] bytes = new byte[length];in.readBytes(bytes);out.add(SerializationUtil.deserialize(bytes, clazz));}
}

四、客戶端動態代理

public class RpcClientProxy {private final String host;private final int port;public RpcClientProxy(String host, int port) {this.host = host;this.port = port;}@SuppressWarnings("unchecked")public <T> T getProxy(Class<T> serviceClass) {return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(),new Class<?>[]{serviceClass},(proxy, method, args) -> {RpcRequest request = new RpcRequest();request.setClassName(serviceClass.getName());request.setMethodName(method.getName());request.setParamTypes(method.getParameterTypes());request.setArgs(args);// Netty 同步發送請求,獲取響應(略)RpcResponse response = NettyClient.send(request, host, port);return response.getResult();});}
}

五、服務端調用分發

public class RpcServerHandler extends SimpleChannelInboundHandler<RpcRequest> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) {RpcResponse response = new RpcResponse();try {Class<?> clazz = Class.forName(request.getClassName());Method method = clazz.getMethod(request.getMethodName(), request.getParamTypes());Object result = method.invoke(clazz.getDeclaredConstructor().newInstance(), request.getArgs());response.setResult(result);} catch (Exception e) {response.setError(e);}ctx.writeAndFlush(response);}
}

六、服務端注冊

ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(boss, worker).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {protected void initChannel(SocketChannel ch) {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new RpcDecoder(RpcRequest.class));pipeline.addLast(new RpcEncoder<>(RpcResponse.class));pipeline.addLast(new RpcServerHandler());}});
bootstrap.bind(8080).sync();

七、調用示例

// 定義服務接口
public interface HelloService {String hello(String name);
}// 服務實現類
public class HelloServiceImpl implements HelloService {public String hello(String name) {return "Hello, " + name;}
}// 客戶端調用
RpcClientProxy proxy = new RpcClientProxy("localhost", 8080);
HelloService service = proxy.getProxy(HelloService.class);
System.out.println(service.hello("Netty"));

八、總結

通過本篇,你已經實現了:

  • 基于 Netty 的 RPC 協議通信

  • 編解碼框架構建

  • 動態代理與服務遠程調用

  • 基礎版 Netty RPC 框架原型

雖然還不完善(無注冊中心、無連接池、無異步支持),但已具備通信能力,是 Netty 技術棧走向分布式架構的重要一步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85269.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85269.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85269.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

邊緣計算新基建:iVX 輕量生成模塊的 ARM 架構突圍

一、引言 隨著工業 4.0 和物聯網的快速發展&#xff0c;邊緣計算作為連接云端與終端設備的關鍵技術&#xff0c;正成為推動數字化轉型的核心力量。在邊緣計算場景中&#xff0c;設備的實時性、低功耗和離線處理能力至關重要。ARM 架構憑借其低功耗、高能效的特點&#xff0c;成…

C# 基于 Windows 系統與 Visual Studio 2017 的 Messenger 消息傳遞機制詳解:發布-訂閱模式實現

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

js數據類型有哪些?它們有什么區別?

js數據類型共有8種,分別是undefined,null,boolean,number,string,Object,symbol,bigint symbol和bigint是es6中提出來的數據類型 symbol創建后獨一無二不可變的數據類型,它主要是為了解決出現全局變量沖突的問題 bigint 是一種數字類型的數據,它可以表示任意精度格式的整數,…

Vite打包優化實踐:從分包到性能提升

前言: ??????? 隨著前端應用功能的增加&#xff0c;項目的打包體積也會不斷膨脹&#xff0c;影響加載速度和用戶體驗。本文介紹了幾種常見的打包優化策略&#xff0c;通過Vite和相關插件&#xff0c;幫助減少項目體積、提升性能&#xff0c;優化加載速度。 rollup-plugi…

C++語法系列之模板進階

前言 本次會介紹一下非類型模板參數、模板的特化(特例化)和模板的可變參數&#xff0c;不是最開始學的模板 一、非類型模板參數 字面意思,比如&#xff1a; template<size_t N 10> 或者 template<class T,size_t N 10>比如&#xff1a;靜態棧就可以用到&#…

html5的響應式布局的方法示例詳解

以下是HTML5實現響應式布局的5種核心方法及代碼示例: 1. 媒體查詢(核心方案) /* 默認樣式(移動優先) */ .container {padding: 15px; }/* 中等屏幕(平板) */ @media (min-width: 768px) {.container {padding: 30px;max-width: 720px;} }/* 大屏幕(桌面) */ @media …

數字化轉型進階:精讀41頁華為數字化轉型實踐【附全文閱讀】

該文檔聚焦華為數字化轉型實踐&#xff0c;核心內容如下&#xff1a; 轉型本質與目標&#xff1a;數字化轉型是通過數字技術穿透業務&#xff0c;實現物理世界與數字世界的融合&#xff0c;目標是支撐主業成功、提升體驗與效率、探索模式創新。華為以 “平臺 服務” 為核心&am…

C++ - STL #什么是STL #STL的版本 #閉源開源 #STL的六大組件

文章目錄 前言 一、什么是STL 二、STL的版本 1、原始版本 2、P.J.版本 3、RW版本 4、SGI版本 三、閉源、開源 四、STL的六大組件 總結 前言 路漫漫其修遠兮&#xff0c;吾將上下而求索&#xff1b; 一、什么是STL STL(standard template libaray 標準模板庫)&#…

智慧康養護理:科技重塑老齡化社會的健康守護體系

在我國邁入深度老齡化社會的背景下&#xff0c;智慧康養護理作為融合科技與人文的創新模式&#xff0c;正成為提升老年人生活質量、減輕家庭照護壓力、促進健康老齡化的重要路徑。我們將從核心概念、關鍵技術、實際應用與未來趨勢四個維度&#xff0c;為您呈現智慧康養護理的全…

權威認證與質量保障:第三方檢測在科技成果鑒定測試中的核心作用

科技成果鑒定測試是衡量科研成果技術價值與應用潛力的關鍵環節&#xff0c;其核心目標在于通過科學驗證確保成果的可靠性、創新性和市場適配性。第三方檢測機構憑借其獨立性、專業性和權威性&#xff0c;成為科技成果鑒定測試的核心支撐主體。本文從測試流程、第三方檢測的價值…

Linux.docker.k8s基礎概念

1.Linux基本命令 cat 查看文件內容。 cd 進入目標目錄。 ll 查詢當前路勁下文件的詳細信息。 ls 查詢當前路勁下的文件。 touch 建立一個文件。 mkdir 建立一個文件夾。 rm 刪除文件或者目錄。 mv 移動目錄和重新命名文件。 unzip 解壓。 top 查看當前線程的信息。 find …

Python小白的蛻變之旅:從環境搭建到代碼規范(1/10)

摘要&#xff1a;全文圍繞 Python 編程展開&#xff0c;先是介紹如何搭建 Python 開發環境&#xff0c;推薦使用 Anaconda 和 VSCode&#xff0c;并詳細說明了二者的安裝及配置步驟&#xff0c;包括安裝 Anaconda、安裝 VSCode 并配置 Python 插件、選擇 Anaconda 的 Python 解…

linux 1.0.7

用戶和權限的含義與作用 linux中的用戶和文件 用戶的權限是非常重要的 而且有些程序需要使用管理員身份去執行 這些都是非常重要的 不可能讓所有的人擁有所有的權限 這樣的工具可以避免非法的手段來修改計算機中的數據 linux之所以安全還是權限管理做的很棒 每個登錄的用戶都有…

【第4章 圖像與視頻】4.6 結合剪輯區域來繪制圖像

文章目錄 前言示例 前言 本節將綜合運用圖像處理、離屏 canvas 以及剪輯區域等技術實現墨鏡效果。 示例 主線程代碼&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&qu…

UV 包管理工具:替代 pip 的現代化解決方案

安裝 方法一&#xff1a;使用安裝腳本 # macOS 和 Linux curl -LsSf https://astral.sh/uv/install.sh | sh# Windows PowerShell powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 方法二&#xff1a;使用包管理器 # macOS (Homebrew) brew install uv#…

Java注解規范與使用詳解

注解中的空值限制 在Java注解中,元素值不允許使用null引用。這是注解使用中的一項重要約束規則,違反該規則將導致編譯錯誤。需要注意的是,雖然禁止使用null值,但允許為String類型元素指定空字符串(“”),為數組類型元素指定空數組({})。 空值約束示例 以下兩種注解用法…

從零開始的數據結構教程(八)位運算與狀態壓縮

&#x1f3a9; 標題一&#xff1a;位運算基礎——魔術師的二進制手套 位運算是一種直接操作數字二進制位的運算方式&#xff0c;它高效且巧妙&#xff0c;就像魔術師戴上了二進制手套&#xff0c;能夠精準地操控每一個比特。理解位運算是深入學習狀態壓縮和其他底層優化技巧的…

GraalVM加持下的Quarkus極速啟動

1. 引言 1.1 Quarkus與云原生時代的挑戰 隨著云原生架構的普及,傳統Java應用在部署效率、資源消耗和冷啟動性能方面逐漸暴露出短板。Spring Boot等框架雖然功能強大,但在Serverless、邊緣計算等場景下表現乏力。 Quarkus 是 Red Hat 推出的一個專為云原生設計的 Java/Kotl…

vue3 el-input type=“textarea“ 字體樣式 及高度設置

在Vue 3中&#xff0c;如果你使用的是Element Plus庫中的<el-input>組件作為文本域&#xff08;type"textarea"&#xff09;&#xff0c;你可以通過幾種方式來設置字體樣式和高度。 1. 直接在<el-input>組件上使用style屬性 你可以直接在<el-input&…

Matlab中gcb、gcbh、gcs的區別

gcb&#xff1a;返回當前選中模塊的完整路徑名&#xff08;字符串&#xff09; gcbh&#xff1a;返回當前選中模塊的句柄&#xff08;數值標識符&#xff09; gcs&#xff1a;返回當前打開或選中的子系統或頂層模型路徑&#xff08;字符串&#xff09;