手寫實現RPC 框架

2021-09-22 21:14:49 字數 1831 閱讀 7190

乙個簡易的rpc框架,別的先不多說上github

github

gitee

註冊中心

: zookeeper  (使用curator 操作)

通訊框架 

: netty  (4.1.25版本)

序列化 

:  kryo  

以下只寫了大體專案流程,以及展示部分**,具體上方github ,**裡基本都寫了注釋

本rpc框架,有乙個統一的 框架容器,用來初始化,zookeeper的連線,以及快取一些遠端服務.這樣方便負載均衡呼叫,以及不用每次呼叫都去zookeeper上獲取遠端伺服器,如果遠端伺服器掛機,或者新增新的遠端伺服器,使用watch機制,重新整理到快取中.

//創造rpc應用容器,建議使用單列

//如果有提供者,設定乙個通訊埠,等待呼叫者來訪問

//把服務註冊進rpc容器,資訊寫入zk,

//引數1是服務唯一的名字

//userserviceimp實現了介面userservice

//也能這麼註冊,只是註冊的名字是userservice介面的全路徑

//根據服務的名字,去zk中獲取當前提供了該遠端服務的ip位址和埠,存入快取

//同時開啟watch,如果該遠端服務的提供者變動,zk將會推送,然後重新整理快取

//生成**物件,用的jdk動態**.

//執行了動態**的**方法,將會呼叫netty去傳送請求.

//引數和返回值,講會使用kryo去序列化,然後tcp傳輸

service.xx(...)

注意點:

@override

public object invoke(object proxy, method method, object args) throws throwable

//呼叫模版方法,正真遠端呼叫

object result = dorpchandle(remoteservices, method, args);

return result;

}

在動態**的時候,一定要過濾了 object的 自帶方法.不然在整合spring的時候,spring會自動呼叫equals() 方法,導致異常

netty這邊,沒什麼好說的.重點在於,管道的使用

服務提供者 :

eventloopgroup work = new nioeventloopgroup();

eventloopgroup child = new nioeventloopgroup();

//serializationhandle serializationhandle = new serializationhandle();

serverbootstrap serverbootstrap = new serverbootstrap();

serverbootstrap.group(work,child)

.channel(nioserversocketchannel.class)

.childhandler(new channelinitializer()

});channelfuture channelfuture = null;

try catch (interruptedexception e) finally

呼叫者,和提供者,類似.

框架介紹,到此就結束了.乙個很簡單的rpc框架.具體實現細節.請移步github,**上都有注釋

手寫實現bind

bind 方法會建立乙個新函式。當這個新函式被呼叫時,bind 的第乙個引數將作為它執行時的 this,之後的一串行引數將會在傳遞的實參前傳入作為它的引數。來自於 mdn 由此我們可以首先得出 bind 函式的兩個特點 返回乙個函式 可以傳入引數 返回函式的模擬實現 從第乙個特點開始,我們舉個例子 ...

RPC 手寫乙個RPC框架

基於上一節的內容rpc 準備階段,自己實現乙個基本的rpc框架。public class rpcserverframereg 註冊服務,就是將介面和實現類儲存到上邊定義的serviceholder中,param serviceinte ce 介面 param impl 介面的實現類 throws i...

實現RPC框架

什麼是rpc client端 student student call serveraddr,addage,student 1.將這個呼叫對映為call id。2.將call id,student params 序列化,以二進位制形式打包 3.把2中得到的資料報傳送給serveraddr,這需要使用...