1. 程式人生 > >netty 實現簡單的rpc呼叫

netty 實現簡單的rpc呼叫

> **yls** *2020/5/23* ## netty 實現簡單rpc準備 1. 使用netty傳輸java bean物件,可以使用protobuf,也可以通過json轉化 2. 客戶端要將呼叫的介面名稱,方法名稱,引數列表的型別和值傳輸到服務端, 可以用動態代理 3. 服務端要對介面和實現類進行對映(或者自定義名稱與實現類對映),接收到客戶端的資料,使用反射呼叫相關類的函式 4. 客戶端使用callable返回呼叫的結果,先等待,有資料寫回後喚醒執行緒,賦值返回 ## 基於netty編碼實現 rpc 呼叫 > 大致流程: >1. netty搭建rpc框架; >2. 建立服務消費者和服務提供者的公共介面和類 >3. 建立服務提供者,啟動netty框架的服務端 >4. 建立服務消費者,啟動netty框架的客戶端,然後獲取呼叫結果 ### 1.首先用netty實現一個rpc框架 ###### 1.1 建立客戶端呼叫服務端時傳輸資訊的類 ```java /** * rpc呼叫時傳輸類的資訊 * 客戶端與服務端之間通訊,傳遞資訊的媒介 */ public class ClassInfo { //自定義name,一般一個介面有多個實現類的時候使用自定義 // 或者預設使用介面名稱 private String name; private String methodName; //引數型別 private Class[] types; //引數列表 private Object[] params; //自定義rpc協議 private String protocol="#rpc#"; public String getProtocol() { return protocol; } public void setProtocol(String protocol) { this.protocol = protocol; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public Class[] getTypes() { return types; } public void setTypes(Class[] types) { this.types = types; } public Object[] getParams() { return params; } public void setParams(Object[] params) { this.params = params; } } ``` ###### 1.2 建立解決TCP粘包拆包的編解碼器 ```java /** * 編碼器 * MyMessageEncoder MyMessageDecoder解決粘包拆包問題 */ public class MyMessageEncoder extends MessageToByt