netty 實現簡單的rpc呼叫
阿新 • • 發佈:2020-05-23
> **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