rpc框架yar之源碼解析-入門和原理介紹-創(chuàng)新互聯(lián)

關于rpc的文章,網上的內容很多,但我還是準備寫一下,主要是自己的理解吧。算是公眾號的第一篇技術類文章吧。

成都創(chuàng)新互聯(lián)長期為成百上千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為寧鄉(xiāng)企業(yè)提供專業(yè)的網站建設、網站制作,寧鄉(xiāng)網站改版等技術服務。擁有10年豐富建站經驗和眾多成功案例,為您定制開發(fā)。

上周給團隊小伙伴分享了也是下面基礎入門的內容,本文主要結合一個簡單框架yar的原理和源碼來說明詳細情況。

rpc框架yar之源碼解析- 入門和原理介紹

RPC的定義

RPC,即 Remote Procedure Call(遠程過程調用),調用遠程計算機上的服務,就像調用本地服務一樣。

RPC可以很好的解耦系統(tǒng),如WebService就是一種基于Http協(xié)議的RPC。

RPC的框架

各種架構都是在一定環(huán)境背景下產生的,有跨語言的,java語言的,有php的,有基于http的,有基于http2的。如下:

Thrift, gRPC, rpcx, motan, dubbox

Phprpc, yar, swoole, Hprose

RPC調用

rpc框架yar之源碼解析- 入門和原理介紹

這里以dubbo的架構圖為例,dubbo主要分成4個角色:消費者(Consumer),生產者(Provider),監(jiān)控中心(Monitor),注冊中心(Registry)。

Provider: 暴露服務的服務提供方,生產者。 
Consumer: 調用遠程服務的服務消費方。 
Registry: 服務注冊與發(fā)現(xiàn)的注冊中心。 
Monitor: 統(tǒng)計服務的調用次數(shù)和調用時間的監(jiān)控中心。

調用方法如下:

0. 服務容器啟動,加載,運行服務提供者(server端)。 
1.服務提供者在啟動時,向注冊中心注冊自己提供的服務。 
2.服務消費者在啟動時,向注冊中心訂閱自己所需的服務。 
3.注冊中心返回服務提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。 
4.服務消費者,從提供者地址列表中,根據(jù)指定的負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。 
5.服務消費者和提供者,在內存中累計調用次數(shù)和調用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。

以上是從網上其他帖子上找的調用內容?;旧虾w了rpc框架的基本思路,monitor和registry不是必須的,如果有其他方式替代, 也可省略或者換成其他可以實現(xiàn)功能的方式,如集中處理日志。下面是我們在實際使用中用到的內容。

業(yè)務背景:在DAU過億的某博,基礎數(shù)據(jù)獨立成平臺,這樣返回的PC,手機,H5其實是基礎數(shù)據(jù),要想被手機端所用,實際上需要加工然后傳到端上展示。而為了統(tǒng)一化管理,網頁版和手機app版盡量使用同一套解析。業(yè)務需求產生,在一定的歷史背景下,產生了rpc的調用模式。條條大路通羅馬,問題不止一個解決方案,我們只是采用了一種,即結合http,nginx ,php-fpm等使用yar這個php擴展模塊實現(xiàn)這個業(yè)務。

嚴格意義上講yar不能獨立使用的,沒有dubbo,motan等那種自己獨立成框架體系。有些部分交給使用者自己實現(xiàn),如日志記錄,我們的日志記錄實際與yar關系不大。框架數(shù)據(jù)傳輸方式還是借助http,結合nginx,php-fpm等內容,基礎還是個http的請求。(curl和sockert兩種方式,sockert目前我們沒有使用)。沒有注冊發(fā)現(xiàn)服務的具體使用,這個完全由lvs給我們解決,服務的可用完全交給了運維。

了解了各個角色,我們來看下核心內容,Yar實現(xiàn)了rpc的基礎部分,即數(shù)據(jù)的譯碼/解碼和傳輸,我感覺這兩部分是這個框架的核心。下面是流程圖:

rpc框架yar之源碼解析- 入門和原理介紹

請求過程:

Client需要遠程調用的時候,先初始化數(shù)據(jù),數(shù)據(jù)主要包括三個部分header, packager_name,request_body,然后根據(jù)配置中的方式從pack_list選擇合適的序列化方式(msgpack,json,php)

對request_body進行序列化。 然后進行傳輸,傳輸方式 同樣是采用工廠方法,從已有的方式中選擇Curl/sockert方式進行傳輸數(shù)據(jù),傳輸數(shù)據(jù)的過程實際就是發(fā)送一個http請求(我們以curl為例)。

服務器端監(jiān)聽端口,底層網絡實現(xiàn)都利用現(xiàn)有的nginx, php-fpm。在PHP代碼中,實現(xiàn)的地方實例化一個類,然后根據(jù)request的內容,解析body,然后去初始化header, 獲得packager_name,根據(jù)packer_name解析yar_body的內容。

以下是每次request和response的數(shù)據(jù)情況。以request為例傳輸?shù)腷ody數(shù)據(jù)包含三個部分,82byte的頭部,packager_name,和經過packager_name序列化的string。當這段數(shù)據(jù)傳到server端,按照固定的結構解析出來即可。

rpc框架yar之源碼解析- 入門和原理介紹

PACK過程是對數(shù)據(jù)作如下處理的過程。以msgpack為例,對中間部分的數(shù)據(jù)進行序列化。生成最右邊的內容(序列化后的字符串有最右有差別,這里只是拿json舉例)。

rpc框架yar之源碼解析- 入門和原理介紹

傳輸

yar目前有兩種傳輸方式,這個在之前提到過curl和socket方式。因為socket實際沒有用過所以這里主要介紹curl。

curl的模塊主要以來底層的CURL模塊,主要封裝了如下方法。其中multi系列主要是解決并行請求的方案。

rpc框架yar之源碼解析- 入門和原理介紹

php_yar_curl_open

這個方法主要是用CURL創(chuàng)建一個連接對象。這里有個復用的機制,當options &

YAR_PROTOCOL_PERSISTENT(0x1) 為true的時候,會去已經使用的連接中找一下,如果存在并且沒有在用則復用。

php_yar_curl_send

這個函數(shù)主要是把request需要的數(shù)據(jù),轉成字符串,然后放在請求的postfield里面。

php_yar_curl_exec

將postfield內容,通過http請求發(fā)送出去。獲得返回的內容。然后按照上述內容解析出結果。

本來還想分享grpc的protobuf和htt2,鑒于粗淺學習階段,網上的其他博客文章更詳細,這里就不寫了,等我實際有自己的理解再說啦。

凡事都沒有完美,也碰到過yar的不足之處,比如server的handle方法,解析post數(shù)據(jù),執(zhí)行對應的方法返回都在這里了。沒有將請求的實際方法暴露,這樣在server端統(tǒng)計起來比較困難。曾試圖在源碼中加個getCallMethod方法去標記這個內容,不過只是自己玩玩,沒有實際應用...

有同學問我為啥我們當時要用yar,也許別的框架也能滿足我們的需求,一定的歷史背景決定一定的技術架構。技術的選型更多傾向于開發(fā)者的水平----即選擇自己駕馭的技術,站在巨人的肩膀上展望遠處。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

本文題目:rpc框架yar之源碼解析-入門和原理介紹-創(chuàng)新互聯(lián)
URL標題:http://www.muchs.cn/article16/dcdodg.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供微信公眾號品牌網站建設、App設計、面包屑導航關鍵詞優(yōu)化、定制網站

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網站建設