亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-05-19 19:05:44 來源:網絡 閱讀:1597 作者:netbird_fly 欄目:web開發

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

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

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


RPC的定義

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

RPC可以很好的解耦系統,如WebService就是一種基于Http協議的RPC。


RPC的框架

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

Thrift, gRPC, rpcx, motan, dubbox

Phprpc, yar, swoole, Hprose 


RPC調用

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

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

Provider: 暴露服務的服務提供方,生產者。 
Consumer: 調用遠程服務的服務消費方。 
Registry: 服務注冊與發現的注冊中心。 
Monitor: 統計服務的調用次數和調用時間的監控中心。


調用方法如下:

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


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


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


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


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

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


請求過程:

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

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

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


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


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

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

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


傳輸

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

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

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

php_yar_curl_open

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

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


php_yar_curl_send

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


php_yar_curl_exec

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


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


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


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


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

佛冈县| 青铜峡市| 安丘市| 垣曲县| 金昌市| 峨山| 云阳县| 阿巴嘎旗| 陆丰市| 简阳市| 崇州市| 方城县| 亚东县| 阳泉市| 溧阳市| 扶绥县| 宾川县| 贵州省| 泸州市| 鄄城县| 诸暨市| 唐海县| 太谷县| 紫金县| 开江县| 上犹县| 军事| 临朐县| 桂平市| 古田县| 宁海县| 尼玛县| 萍乡市| 涞水县| 成武县| 浑源县| 柳州市| 金湖县| 县级市| 孝义市| 江门市|