溫馨提示×

溫馨提示×

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

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

如何進(jìn)行Yar并行的RPC框架使用分析

發(fā)布時間:2022-01-06 18:28:23 來源:億速云 閱讀:174 作者:柒染 欄目:云計算

今天就跟大家聊聊有關(guān)如何進(jìn)行Yar并行的RPC框架使用分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

前言:

RPC,就是Remote Procedure Call的簡稱呀,翻譯成中文就是遠(yuǎn)程過程調(diào)用

RPC要解決的兩個問題:

  1. 解決分布式系統(tǒng)中,服務(wù)之間的調(diào)用問題。

  2. 遠(yuǎn)程調(diào)用時,要能夠像本地調(diào)用一樣方便,讓調(diào)用者感知不到遠(yuǎn)程調(diào)用的邏輯

如果模仿B/S架構(gòu)的調(diào)用方式,每次調(diào)用時,都需要寫一串發(fā)起http請求的代碼。比如new Curl()...之類的,能不能像本地調(diào)用一樣,去發(fā)起遠(yuǎn)程調(diào)用,讓使用者感知不到遠(yuǎn)程調(diào)用的過程。

實(shí)際情況下,RPC很少用到http協(xié)議來進(jìn)行數(shù)據(jù)傳輸,畢竟我只是想傳輸一下數(shù)據(jù)而已,何必動用到一個文本傳輸?shù)膽?yīng)用層協(xié)議。 為什么不直接使用二進(jìn)制傳輸。

安裝:

$ pecl install yar
$ pecl install msgpack

服務(wù)端代碼:

<?php

require_once 'Email.php';
require_once 'Sms.php';

class Service
{
    private $sms;
    private $email;

    public function __construct()
    {
        $this->sms = new Sms();
        $this->email = new Email();
    }

    /**
     * @param $mobile
     * @return string
     */
    public function sendSms($mobile, $content = '短信內(nèi)容')
    {
        return $this->sms->send($mobile, $content);
    }

    /**
     * @param $email
     * @return string
     */
    public function sendEmail($email)
    {
        return $this->email->send($email);
    }
}

$service = new Yar_Server(new Service());
$service->handle();

客戶端代碼:

<?php

// 一、直接調(diào)用
//$client = new Yar_Client("http://192.168.2.138/api/");
//$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
//$result = $client->sendSms('18234065200', '我是短信內(nèi)容');
//echo $result;

// 二、并行調(diào)用
// public static call ( string $uri , string $method [, array $parameters [, callable $callback [, callable $error_callback [, array $options ]]]] )
// callback 回掉函數(shù), 在遠(yuǎn)程服務(wù)的返回到達(dá)的時候被Yar調(diào)用, 從而可以處理返回內(nèi)容 如果沒有設(shè)置則調(diào)用loop中的callback
// error_callback
// $options
Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendSms", ['18234065200', '歡迎注冊']);
Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendEmail", ['12580@qq.com'], "callback", "callError", [YAR_OPT_TIMEOUT => 10]);

// 發(fā)送請求
// public static loop ([ callable $callback [, callable $error_callback ]] )
Yar_Concurrent_Client::loop("loopCallback", "loopError");

function callback($retval, $callinfo)
{
    echo 'call自己的回調(diào):' . $callinfo['method'] . '方法返回數(shù)據(jù)' . $retval . PHP_EOL;
}

// 錯誤回掉函數(shù), 如果設(shè)置了, Yar在發(fā)送出所有的請求之后立即調(diào)用一次這個回掉函數(shù)(此時還沒有任何請求返回), 調(diào)用的時候$callinfo參數(shù)是NULL
function loopCallback($retval, $callinfo)
{
    if (is_null($callinfo)) {
        echo '所有rpc請求發(fā)送完畢調(diào)用' . PHP_EOL;
    } else {
        echo '調(diào)用成功后返回' . PHP_EOL;
        var_dump($retval);
        var_dump($callinfo);
    }
}

// 錯誤回調(diào)
function callError()
{
    echo '發(fā)送rpc出錯' . PHP_EOL;
}

// 錯誤回掉函數(shù), 如果設(shè)置了, 那么Yar在出錯的時候會調(diào)用這個回掉函數(shù)
function loopError()
{
    echo '發(fā)送rpc出錯' . PHP_EOL;
}

如何進(jìn)行Yar并行的RPC框架使用分析

看完上述內(nèi)容,你們對如何進(jìn)行Yar并行的RPC框架使用分析有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI