yar粗略使用記錄


yar是鳥哥(laruence)開發的一個並行的RPC框架。據說sina weibo已經在大規模使用這個框架了。今天初步使用了下,覺得還是挺爽的一個工具。

什么情況適用這個工具呢?

比如一般你有個微博這樣的一個項目,這個項目的特點是有多個子項目組成,即有web版,手機客戶端版,wap版等。

一般有這么多個子項目,且項目的頁面邏輯是分開的,我們自然會建立多個項目,然后分拆給不同的人負責。

但是呢,這么多版本,它的功能實際都是相似的,比如必須都有個獲取好友的功能,必須有個獲取好友動態的接口,那么雖然這個接口的表現形式可能是不一樣的,但是它的數據邏輯是一樣的,如果使用MVC的分層模型來說,Controller和View層各個項目是不一樣的,但是Model層實際上是完全相同的。那么怎么能讓他們使用同樣的model層呢?這個時候就想到了使用RPC。使用RPC就能讓各個項目像訪問自己的Model層一樣訪問RPC提供的服務了。換句話說,RPC可以提供業務數據的封裝。這個對於公司來說,很爽。為毛呢?因為把業務數據一封裝,寫一篇足夠完善的文檔解釋提供的rpc文章,這樣招一批實習生就只要套套模板就能實現一個很完整的項目了。

需要考慮什么?

但是呢?RPC本質上也是一個網絡請求,既然是請求,對於效率來說,就需要考慮了。

首先,基於什么協議層來做網絡傳輸呢,yar是基於http來做的。

其次,能不能多個請求並發呢?

當然可以,yar實現了多個請求並發執行。這里就直接套用yar的文檔例子做個演示:

<?php
function callback($retval, $callinfo) {
     var_dump($retval);
}

function error_callback($type, $error, $callinfo) {
    error_log($error);
}

Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"));   // if the callback is not specificed, 
                                                                               // callback in loop will be used
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", array(YAR_OPT_PACKAGER => "json"));
                                                                               //this server accept json packager
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", array(YAR_OPT_TIMEOUT=>1));
                                                                               //custom timeout 

Yar_Concurrent_Client::loop("callback", "error_callback"); //send the requests, 
                                                           //the error_callback is optional
?>

再其次,緩存

既然Model層已經統一了,復用性這么高,那么緩存做在model層就很有用了,因為命中率很高嘛。

緩存yar可沒有幫你做,但是我們基於yar做個通用的緩存是很容易的事情,比如你可以使用文件緩存做容災處理,使用redis做內容緩存加速。

再再其次,安全

提供rpc的機器不能對外提供服務,需要使用簽名機制,那么調用rpc的客戶端就需要有個做簽名的過程,提供rpc的服務端就需要有個解簽名的過程。

那么可以這么搞:

意思就是做一個通用的SDK安裝在客戶端,然后各個項目調用這個SDK,這個SDK可以做什么事情呢?

1 RPC緩存

2 優化調用接口

3 做日志統計

4 做簽名驗證

怎么搭建?

步驟在github上都已經說很清楚了:

1 php安裝yar擴展(可選擇安裝msgpack擴展)msgpack擴展是一個高效的二進制打包協議。rpc的服務端和rpc的客戶端都需要安裝這個擴展。

2 服務端寫model類

3 服務端提供對外的rpc的api服務程序,這個程序大致像這樣:

<?php
class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function api($parameter, $option = "foo") {
    }
 
    protected function client_can_not_see() {
    }
}
 
$service = new Yar_Server(new API());
$service->handle();
?>

有的人說我希望這個提供rpc的類是我自定義的,那么你就可以使用$_REQUEST將class參數傳入進來,然后在服務端new $class,再使用Yar_Server封裝,這樣就能加上簽名驗證,就能將所有的Model類作為rpc提供給客戶端了。

4 客戶端使用Yar_Client來調用服務端的rpc服務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM