說起RPC,,大家都已經(jīng)很熟悉了,,隨著soa的出現(xiàn)和普及,,遠(yuǎn)程分布式調(diào)用已經(jīng)成為主流,。今年來流行的微服務(wù)更是讓RPC大放光彩,。目前業(yè)界開源的rpc框架非常多,比較主流的RPC框架有facebook開發(fā)的Apache Thrift,,Hadoop的Avro-RPC,,google開源的gRpc等。dubbo也是基于rpc框架之上的一個服務(wù)治理框架,。 下面將通過java原生的序列化,Socket通信,,動態(tài)代理和反射機制,,實現(xiàn)一個簡單的RPC框架,。 它主要由三部分組成: 1:服務(wù)提供者,,它運行在服務(wù)端,負(fù)責(zé)提供服務(wù)接口定義和服務(wù)實現(xiàn)類。 2:服務(wù)發(fā)布者,,它運行在RPC服務(wù)端,負(fù)責(zé)將本地服務(wù)發(fā)布成遠(yuǎn)程服務(wù),,供其他消費者調(diào)用,。 3:本地服務(wù)代理,它運行在RPC客戶端,通過代理調(diào)用遠(yuǎn)程服務(wù)提供者,,然后將結(jié)果進行封裝返回給本地消費者,。 首先是服務(wù)端接口定義和實現(xiàn): 服務(wù)端的服務(wù)發(fā)布者代碼如下 服務(wù)發(fā)布者的主要職責(zé)如下: 1)作為服務(wù)端,監(jiān)聽客戶端的TCP連接,,接收到新的客戶端連接之后,將其封裝成Task,,有線程池執(zhí)行,。 2)將客戶端發(fā)送的碼流反序列化成對象,反射調(diào)用服務(wù)實現(xiàn)者,,獲取執(zhí)行結(jié)果,。 3)將執(zhí)行結(jié)果對象反序列化,,通過Socket發(fā)送給客戶端。 4)遠(yuǎn)程服務(wù)調(diào)用完成之后,,釋放socket等連接資源,,防止句柄泄露,。 接下來是客戶端本地服務(wù)代理源碼: 本地服務(wù)代理的主要功能如下: 1)將本地的接口調(diào)用轉(zhuǎn)換成JDK的動態(tài)代理,,在動態(tài)代理中實現(xiàn)接口的遠(yuǎn)程調(diào)用。 2)創(chuàng)建Socket客戶端,,根據(jù)指定地址連接遠(yuǎn)程服務(wù)提供者。 3)將遠(yuǎn)程服務(wù)調(diào)用所需的接口類,方法名,,參數(shù)列表等編碼后發(fā)送給服務(wù)提供者,。 4)同步阻塞等待服務(wù)端返回應(yīng)答,獲取應(yīng)答之后返回。 下面是測試代碼 首先,創(chuàng)建一個異步發(fā)布服務(wù)端的線程并啟動,,用于接收RPC客戶端的請求,,根據(jù)請求參數(shù)調(diào)用服務(wù)實現(xiàn)類,,返回結(jié)果給客戶端,。隨后,創(chuàng)建客戶端服務(wù)代理類,,構(gòu)造RPC請求參數(shù),,發(fā)起RPC調(diào)用,,將調(diào)用結(jié)果輸出到控制臺,。執(zhí)行結(jié)果如下圖所示: |
|