Server: Provider ,暴露服務(wù),服務(wù)提供方
Client: Consumer ,服務(wù)消費(fèi),調(diào)用遠(yuǎn)程服務(wù)
Registry:服務(wù)注冊與發(fā)現(xiàn)
RPC的調(diào)用過程如下:
第一步:server會將他需要暴露的服務(wù)以及他的地址信息注冊到Registry這一注冊中心。
第二步:client通過注冊中心一只關(guān)注它所需要的服務(wù)在哪里,如果此時server的地址發(fā)生改變,server會再次注冊入Registry,然后Resgistry會通知給RPC client。
現(xiàn)在client已經(jīng)有了server的地址以及它暴露服務(wù)的信息,就可以做最后一步調(diào)用了(即3 call 步)。
其實(shí)在這里,注冊中心并不是必要的組件,client可以把服務(wù)端的信息直接寫死進(jìn)client,然后直接去調(diào)用rpc server,實(shí)則可以發(fā)現(xiàn)3 call這一步才是rpc調(diào)用最關(guān)鍵的一步?。?/p>
調(diào)用(call)
1.首先是client要去調(diào)用client stub(存根)這個接口里面的方法,這時候這個接口的實(shí)現(xiàn)在遠(yuǎn)程,所以需要sockets網(wǎng)絡(luò)傳輸,才能達(dá)到調(diào)用(即通過sockets建立連接,傳輸數(shù)據(jù)),在通過sockets進(jìn)行傳輸之前,需要第2步的序列化(把傳輸?shù)膶ο筠D(zhuǎn)成可傳輸?shù)亩M(jìn)制數(shù)據(jù))。
2.假設(shè)此時server的sockets拿到了數(shù)據(jù),需要第4步的反序列化(將拿到的二進(jìn)制數(shù)據(jù)反序列化為對象),在這個對象中包含了這個客戶端要調(diào)用的服務(wù)端的信息(像它調(diào)用的是那個接口,也即它調(diào)用的是哪個存根,接口里面的什么方法方法里面參數(shù)的類型,以及返回值的類型等),之后server去找到這個接口的具體實(shí)現(xiàn)類的對象。通常這個對象為了性能考慮,一般會做成單例模式。
3.這個server stub找到這個對象之后會通過反射來調(diào)用這個方法,方法調(diào)用完成后可以拿到計(jì)算的結(jié)果,拿到結(jié)果后又通過第7步的序列化成二進(jìn)制,然后通過網(wǎng)絡(luò)傳輸8響應(yīng)給client,client拿到這個數(shù)據(jù)之后也會通過9將其序列化為對象,然后得到結(jié)果–第10步。那么本次調(diào)用結(jié)束文章來源:http://www.zghlxwxcb.cn/news/detail-486860.html
調(diào)用關(guān)鍵點(diǎn):文章來源地址http://www.zghlxwxcb.cn/news/detail-486860.html
- 一定要的網(wǎng)絡(luò)模塊(用于網(wǎng)絡(luò)傳輸)
- 序列化模塊(對象與二進(jìn)制數(shù)據(jù)之間的互轉(zhuǎn))
- client 端怎么就通過調(diào)用一個接口就調(diào)用到遠(yuǎn)程方法呢?其實(shí)他內(nèi)部有一個存根代理對象,而這個網(wǎng)絡(luò)的交互,序列化操作都是由這個代理對象來完成的)
- server端肯定需要一個對服務(wù)進(jìn)行管理的組件,里面完成了服務(wù)的查找,服務(wù)的反射調(diào)用等
到了這里,關(guān)于RPC核心原理(整體架構(gòu)/調(diào)用過程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!