基於上一節的內容rpc-準備階段,自己實現乙個基本的rpc框架。
public
class
rpcserverframereg
/** * 註冊服務,就是將介面和實現類儲存到上邊定義的serviceholder中,
* @param serviceinte***ce 介面
* @param impl 介面的實現類
* @throws ioexception
*/public
void
registerservice
(class<
?> serviceinte***ce, class impl
)throws ioexception
}finally
}//任務類,伺服器啟動服務後,如果有請求過來了,就會執行run方法
private
static
class
servertask
implements
runnable
@override
public
void
run(
)//根據類,得到方法
method method = serverclass.
getmethod
( methodname, paramtype )
;//根據方法,類例項,引數得到結果
object result = method.
invoke
( serverclass.
newinstance()
, param )
;//寫到流裡邊。
outputstream.
writeobject
( result )
; outputstream.
flush()
;//返回去
}catch
(exception e)
finally
catch
(ioexception e)}}
}//啟動服務的方法
public
void
startservice()
throws ioexception
}finally
}}
public
class
test
}
public
class
rpcclientframereg
,new
dynproxy
( serviceinte***ce,inetsocketaddress ));
}/**
* 動態**類
* 這個類的作用就是,傳入對應的方法,以及引數,類找到對應的伺服器,將類,方法,引數穿過去, 拿到返回的結果。
*/private
static
class
dynproxy
implements
invocationhandler
@override
public object invoke
(object proxy, method method, object[
] args)
throws throwable
finally
}//第二部 、從上一步拿到的伺服器列表中,隨機(可以用負載均衡的演算法)獲取一台伺服器,然後傳入介面名, 方法名,引數型別,引數,拿到返回值,返回即可
random random =
newrandom()
;int index = random.
nextint
( servicearray.length )
; registerservicevo vo = servicearray[index]
;//隨機獲取乙個伺服器
inetsocketaddress socketaddress =
newinetsocketaddress
( vo.
gethost()
, vo.
getport()
);//遠端伺服器鏈結位址。
tryfinally}}
}
上邊**中用到了registerservicevo這個類,這個類就是乙個簡單的ip埠的bean,如下
private
final string host;
private
final
int port;
public
registerservicevo
(string host,
int port)
public string gethost()
public
intgetport()
當客戶端需要訪問服務端的方法的時候,這樣處理
sendsms sendsms =rpcclientframereg.
getremoteproxyobj
(sendsms.
class);
//然後就可以呼叫服務端的sendsms這個類的各個方法了
sendsms.
sendmail
("123");
//sendsms是自己實現的乙個類
手寫實現RPC 框架
乙個簡易的rpc框架,別的先不多說上github github gitee 註冊中心 zookeeper 使用curator 操作 通訊框架 netty 4.1.25版本 序列化 kryo 以下只寫了大體專案流程,以及展示部分 具體上方github 裡基本都寫了注釋 本rpc框架,有乙個統一的 框架...
乙個自己實現的rpc框架
整合spring配置 檔案頭部加入rpc的namespace 服務端 服務端標籤 其中,protocol標籤屬性分析 port指定服務端繫結的埠 service標籤屬性分析 inte ce指定介面的完整類名,ref指定實現類的id,且該實現類必須放入spring容器中service標籤也可 以用註解...
設計乙個分布式RPC框架
提前先祝大家春節快樂!好了,先簡單聊聊。我從事的是大資料開發相關的工作,主要負責的是大資料計算這塊的內容。最近hive集群跑任務總是會出現thrift連線hs2相關問題,研究了解了下內部原理,突然來了興趣,就想著自己也實現乙個rpc框架,這樣可以讓自己在設計與實現rpc框架過程中,也能從中了解和解決...