把基于Yaf框架的接口改造成Rpc服務(wù)

RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過(guò)程調(diào)用協(xié)議敛苇,它是一種通過(guò)網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(wù)梳码,而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議斜筐。RPC協(xié)議假定某些傳輸協(xié)議的存在冰啃,如TCP或UDP邓夕,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中阎毅,RPC跨越了傳輸層和應(yīng)用層焚刚。RPC使得開(kāi)發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。

一直以來(lái)扇调,我們都是采用Restfull的方式矿咕。

今天讓我們來(lái)認(rèn)識(shí)一種更高效的調(diào)用協(xié)議——RPC

PHP的RPC框架并不少,比如鳥(niǎo)叔的Yar狼钮,比如我們今天講到的Hprose碳柱。

鳥(niǎo)叔的Yar只支持PHP,而Hprose提供了多種客戶端熬芜。

Hprose

這就為我們搭建一個(gè)跨語(yǔ)言的服務(wù)提供了可能莲镣。

另外一個(gè)很重要的是原因是Hprose不止可以搭建基于HTTP協(xié)議的RPC服務(wù),還可以搭建基于Socket協(xié)議的RPC服務(wù)涎拉!

眾所周知瑞侮,HTTP協(xié)議是應(yīng)用層協(xié)議,而HTTP是基于Socket的曼库。這就意味著更高效的RPC服務(wù)区岗。

好了,廢話不多說(shuō)毁枯,現(xiàn)在我們直接來(lái)看Hprose官方給出的demo慈缔。

Server

<?php
    require_once('Hprose.php');

    function hello($name) {
        return 'Hello ' . $name;
    }

    $server = new HproseHttpServer();
    $server->addFunction('hello');
    $server->start();

Client

<?php
    require_once("Hprose.php");
    $client = new HproseHttpClient('http://127.0.0.1/server.php');
    echo $client->hello('World');

RPC,遠(yuǎn)程過(guò)程調(diào)用協(xié)議

何為遠(yuǎn)程過(guò)程調(diào)用協(xié)議种玛,通過(guò)這個(gè)demo就可以很輕松的理解了藐鹤。

簡(jiǎn)單來(lái)說(shuō)瓤檐,就是通過(guò)RPC,你可以將你的一個(gè)方法發(fā)布出去對(duì)外提供服務(wù)娱节。

而對(duì)于客戶端來(lái)說(shuō)挠蛉,這就是一個(gè)方法,客戶端可以像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程的方法肄满。

是不是很酷谴古!

那么我們?cè)撊绾螌PC集成到Y(jié)af中呢?

最理想的方式是將RPC服務(wù)封裝成一個(gè)類稠歉,在我們的控制器里繼承這個(gè)類就可以將我們的這個(gè)控制器變成一個(gè)RPC服務(wù)掰担。

那么該如何來(lái)實(shí)現(xiàn)呢?

直接來(lái)看代碼

<?php

/**
 * Created by PhpStorm.
 * User: yanbo
 * Date: 16/4/7
 * Time: 下午1:21
 */
class TestController extends Rpc
{

    public function test()
    {
        return 'This is a rpc function.';
    }
}
<?php

/**
 * @author yanbo
 * @desc 基礎(chǔ)控制器
 */

class Rpc extends Yaf_Controller_Abstract {

    use Trait_Hprose;

    public function init() {

        $this->initRpc();
    }

可以看到怒炸,Rpc類就是我們的Base類带饱。只不過(guò)在init方法中初始化了RPC服務(wù)。

這里有兩個(gè)坑阅羹,一個(gè)是PHP不支持多重繼承勺疼,一個(gè)是Yaf框架的控制器必須繼承Yaf_Controller_Abstract。

所以捏鱼,這里只能采用Trait的方式繼承Hprose执庐,然后在Rpc的構(gòu)造函數(shù)中初始化Hprose。

小知識(shí):Trait 是 PHP5.4 中的新特性,是 PHP 多重繼承的一種解決方案穷躁。

最后給大家來(lái)看下Hprose類

<?php

/**
 * Created by PhpStorm.
 * User: yanbo
 * Date: 16/4/7
 * Time: 下午1:32
 */
Trait Trait_Hprose
{
    protected $allowMethodList  =   '';
    protected $crossDomain      =   false;
    protected $P3P              =   false;
    protected $get              =   true;
    protected $debug            =   false;

    /**
     * 架構(gòu)函數(shù)
     * @access public
     */
    public function initRpc() {
        //控制器初始化
        if(method_exists($this,'_initialize'))
            $this->_initialize();
        //導(dǎo)入類庫(kù)
        Yaf_Loader::import('Rpc/Hprose.php');

        //實(shí)例化HproseHttpServer
        $server     =   new \HproseHttpServer();
        if($this->allowMethodList){
            $methods    =   $this->allowMethodList;
        }else{
            $methods    =   get_class_methods($this);
            $methods    =   array_diff($methods, array('__construct','__call','_initialize', '__destruct', 'init', 'indexAction'));
        }

        $server->addMethods($methods,$this);
        if($this->debug) {
            $server->setDebugEnabled(true);
        }
        // Hprose設(shè)置
        $server->setCrossDomainEnabled($this->crossDomain);
        $server->setP3PEnabled($this->P3P);
        $server->setGetEnabled($this->get);
        // 啟動(dòng)server
        $server->start();

        exit;
    }

    /**
     * 魔術(shù)方法 有不存在的操作的時(shí)候執(zhí)行
     * @access public
     * @param string $method 方法名
     * @param array $args 參數(shù)
     * @return mixed
     */
    public function __call($method,$args){}
}

這個(gè)類里的代碼其實(shí)大部分都是抄TP的耕肩,天下代碼一大抄嘛。

哈哈哈~

后記

雖然實(shí)現(xiàn)了最初的目標(biāo)问潭,但是由于Yaf的特性,必須繼承Yaf_Controller_Abstract婚被。所以get_class_methods的時(shí)候會(huì)把Yaf_Controller_Abstract中的方法也變成RPC服務(wù)狡忙,這是唯一的一個(gè)缺憾。址芯。灾茁。

---
我是閆大伯,一只求知欲旺盛的程序猿

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末谷炸,一起剝皮案震驚了整個(gè)濱河市北专,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌旬陡,老刑警劉巖拓颓,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異描孟,居然都是意外死亡驶睦,警方通過(guò)查閱死者的電腦和手機(jī)砰左,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)场航,“玉大人缠导,你說(shuō)我怎么就攤上這事「攘。” “怎么了僻造?”我有些...
    開(kāi)封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)孩饼。 經(jīng)常有香客問(wèn)我髓削,道長(zhǎng),這世上最難降的妖魔是什么捣辆? 我笑而不...
    開(kāi)封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任蔬螟,我火速辦了婚禮,結(jié)果婚禮上汽畴,老公的妹妹穿的比我還像新娘旧巾。我一直安慰自己,他們只是感情好忍些,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布鲁猩。 她就那樣靜靜地躺著,像睡著了一般罢坝。 火紅的嫁衣襯著肌膚如雪廓握。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天嘁酿,我揣著相機(jī)與錄音隙券,去河邊找鬼。 笑死闹司,一個(gè)胖子當(dāng)著我的面吹牛娱仔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播游桩,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼牲迫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了借卧?” 一聲冷哼從身側(cè)響起盹憎,我...
    開(kāi)封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铐刘,沒(méi)想到半個(gè)月后陪每,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年奶稠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俯艰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锌订,死狀恐怖竹握,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辆飘,我是刑警寧澤啦辐,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站蜈项,受9級(jí)特大地震影響芹关,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜紧卒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一侥衬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跑芳,春花似錦轴总、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至盆佣,卻和暖如春往堡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背共耍。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工虑灰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人痹兜。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓瘩缆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親佃蚜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理着绊,服務(wù)發(fā)現(xiàn)谐算,斷路器,智...
    卡卡羅2017閱讀 134,715評(píng)論 18 139
  • 轉(zhuǎn)自:http://blog.csdn.net/kesonyk/article/details/50924489 ...
    晴天哥_王志閱讀 24,826評(píng)論 2 38
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法归露,類相關(guān)的語(yǔ)法洲脂,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法恐锦,線程的語(yǔ)...
    子非魚_t_閱讀 31,665評(píng)論 18 399
  • 不知道為什么我突然想到這樣一句話往果,或者是因?yàn)樽约捍丝痰男那榘桑∩钪形覀儠?huì)因?yàn)橐恍┬∈屡c他人產(chǎn)生矛盾一铅,當(dāng)矛盾產(chǎn)生...
    霧嶼巷閱讀 704評(píng)論 0 1
  • 鐐銬帶久了 就有了印記 印記待久了 就以為是鐐銬
    孤獨(dú)的豬閱讀 183評(píng)論 0 1