什麼是rpc
// client端
// student student = call(serveraddr, addage, student)
1. 將這個呼叫對映為call id。
2. 將call id,student(params)序列化,以二進位制形式打包
3. 把2中得到的資料報傳送給serveraddr,這需要使用網路傳輸層
4. 等待伺服器返回結果
5. 如果伺服器呼叫成功,那麼就將結果反序列化,並賦給student,年齡更新
// server端
1. 在本地維護乙個call id到函式指標的對映call_id_map,可以用mapcallidmap
2. 等待服務端請求
3. 得到乙個請求後,將其資料報反序列化,得到call id
4. 通過在callidmap中查詢,得到相應的函式指標
5. 將student(params)反序列化後,在本地呼叫addage()函式,得到結果
6. 將student結果序列化後通過網路返回給client
我們通過一張圖來大概了解一下在乙個完整的rpc框架中存在的角色以及整個遠端呼叫的過程。
通過上面的圖可以看出來,在rpc框架中主要有以下4個角色:
啟動服務提供者後,服務提供者會以非同步的方式向註冊中心註冊。然後啟動服務消費者,它會訂閱註冊中心中服務提供者列表,當有服務提供者的資訊發生改變時,註冊中心會通知所有的消費者。當消費者發起遠端呼叫時,會通過動態**將需要請求的引數以及方法簽名等資訊通過netty傳送給服務提供者,服務提供者收到呼叫的資訊後呼叫對應的方法並將產生的結果返回給消費者,這樣就完成了乙個完整的遠端呼叫。當然了這個過程中可能還會將呼叫資訊非同步傳送給monitor用於監控和統計。
2.1 服務端
服務端介面
/**
* 啟動rpc服務
* @throws ioexception
*/void
start()
throws ioexception;
/** * 服務註冊
* @param serviceinte***ce 服務介面
* @param impl 服務實現類
*/void
register
(class serviceinte***ce
, class impl
);
服務端實現
@override
public
void
start()
throws ioexception
}catch
(exception e)}}
@override
public
void
register
(class serviceinte***ce
, class impl
)static
class
serverstask
implements
runnable
objectinputstream input = null;
//輸入流
objectoutputstream output = null;
//輸出流
@override
public
void
run(
) method method = serverclass.
getmethod
(methodname, parametertype)
; object result = method.
invoke
(serverclass.
newinstance()
, args)
;//執行結果反序列化返回給客戶端
output =
newobjectoutputstream
(this
.client.
getoutputstream()
);output.
writeobject
(result);}
catch
(exception e)
finally
catch
(ioexception e)}if
(input != null)
catch
(ioexception e)}if
(this
.client != null)
catch
(ioexception e)}}
}
2.2 客戶端**
public
static
t create
(final class<
?> serviceinte***ce,
final string ip,
final
int port)
,new
proxyhandler
(ip, port, serviceinte***ce));
}static
class
proxyhandler
implements
invocationhandler
在invoke中我們需要將引數,方法名等傳入到服務端,然後等待返回服務端的結果
連線服務端
public object invoke
(object proxy, method method, object[
] args)
throws throwable
finally
if(output != null)
if(input != null)
}
客戶端呼叫
long start =system.
currenttimemillis()
;for
(int i=
0;i<
200;i++
)catch
(exception e)
}long end=system.
currenttimemillis()
; system.out.
println
("總耗時:"
+(end-start)
);
手寫實現RPC 框架
乙個簡易的rpc框架,別的先不多說上github github gitee 註冊中心 zookeeper 使用curator 操作 通訊框架 netty 4.1.25版本 序列化 kryo 以下只寫了大體專案流程,以及展示部分 具體上方github 裡基本都寫了注釋 本rpc框架,有乙個統一的 框架...
實現基於springboot的RPC框架(序)
rpc框架大家或多或少都用過,出自於阿里系的就有dubbo,hsf,sofarpc等。但是,要深入理解rpc的原理卻不容易,其中光是核心部分,就涉及到動態 netty,服務註冊與發現,序列化,多執行緒等等。筆者為了弄清楚rpc框架的大致呼叫實現原理,自己造了個輪子 zrpc.首先,筆者寫這個rpc框...
Golang實現自己的RPC框架
rpc session.go package rpc import encoding binary io net 編寫資料會話中讀寫 會話連線的結構體 type session struct 建立新連線 func newsession conn net.conn session 向連線中寫資料 fu...