成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Swoole RPC 的實(shí)現(xiàn)

FWHeart / 1615人閱讀

摘要:概述這是關(guān)于學(xué)習(xí)的第七篇文章的實(shí)現(xiàn)。還有一些大佬加了微信,可能是出于對(duì)晚輩的提攜吧,偷偷告訴你,從大佬的朋友圈能學(xué)到很多東西。就到這了,上面的需要源碼的,加我微信。

概述

這是關(guān)于 Swoole 學(xué)習(xí)的第七篇文章:Swoole RPC 的實(shí)現(xiàn)。

第六篇:Swoole 整合成一個(gè)小框架

第五篇:Swoole 多協(xié)議 多端口 的應(yīng)用

第四篇:Swoole HTTP 的應(yīng)用

第三篇:Swoole WebSocket 的應(yīng)用

第二篇:Swoole Task 的應(yīng)用

第一篇:Swoole Timer 的應(yīng)用

有位讀者說(shuō) “上篇文章,下載代碼后直接運(yùn)行成功,代碼簡(jiǎn)潔明了,簡(jiǎn)直是 Swoole 入門(mén)最好的 Demo ”。

“哈哈哈...”

還有讀者說(shuō) “有一起學(xué)習(xí)的組織群?jiǎn)?,可以在里面進(jìn)行疑難答疑?”

這個(gè)還真沒(méi)有,總覺(jué)得維護(hù)一個(gè)微信群不容易,因?yàn)樽约罕旧砭筒粣?ài)在群里說(shuō)話,另外,自己也在很多微信群中,開(kāi)始氛圍挺好的,大家都聊聊技術(shù),后來(lái)技術(shù)聊的少了改成聊八卦啦,再后來(lái)慢慢就安靜了,還有在群里起沖突的...

當(dāng)然我也知道維護(hù)一個(gè)微信群的好處是非常大的,如果有這方面經(jīng)驗(yàn)的同學(xué),咱們一起交流交流 ~

還有出版社找我寫(xiě)書(shū)的.

他們也真是放心,我自己肚子里幾滴墨水還是知道的,目前肯定是不行,以后嘛,再說(shuō)。

還有一些大佬加了微信,可能是出于對(duì)晚輩的提攜吧,偷偷告訴你,從大佬的朋友圈能學(xué)到很多東西。

我真誠(chéng)的建議,做技術(shù)的應(yīng)該自己多總結(jié)總結(jié),將自己會(huì)的東西寫(xiě)出來(lái)分享給大家,先不說(shuō)給別人帶來(lái)太多的價(jià)值,反正對(duì)自己的幫助是非常非常大的,這方面想交流的同學(xué),可以加我,我可以給你無(wú)私分享。

可能都會(huì)說(shuō)時(shí)間少,時(shí)間只要擠,總會(huì)有的,每個(gè)人都 24 小時(shí),時(shí)間對(duì)每個(gè)人是最公平的。說(shuō)到這推薦大家讀一下《暗時(shí)間》這本書(shū),這是我這本書(shū)的 讀書(shū)筆記,大家可以瞅瞅。

開(kāi)始今天的文章吧,這篇文章實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 RPC 遠(yuǎn)程調(diào)用,在實(shí)現(xiàn)之前需要先了解什么是 RPC,不清楚的可以看下之前發(fā)的這篇文章 《我眼中的 RPC》。

下面的演示代碼主要使用了 Swoole 的 Task 任務(wù)池,通過(guò) OnRequest/OnReceive 獲得信息交給 Task 去處理。

舉個(gè)工作中的例子吧,在電商系統(tǒng)中的兩個(gè)模塊,個(gè)人中心模塊和訂單管理模塊,這兩個(gè)模塊是獨(dú)立部署的,可能不在一個(gè)機(jī)房,可能不是一個(gè)域名,現(xiàn)在個(gè)人中心需要通過(guò) 用戶ID 和 訂單類(lèi)型 獲取訂單數(shù)據(jù)。

實(shí)現(xiàn)效果 客戶端

HTTP 請(qǐng)求

//代碼片段
 "SW",
    "token" => "Bb1R3YLipbkTp5p0",
    "param" => [
        "class"  => "Order",
        "method" => "get_list",
        "param" => [
            "uid"  => 1,
            "type" => 2,
        ],
    ],
];

$ch = curl_init();
$options = [
    CURLOPT_URL  => "http://10.211.55.4:9509/",
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => json_encode($demo),
];
curl_setopt_array($ch, $options);
curl_exec($ch);
curl_close($ch);

TCP 請(qǐng)求

//代碼片段
$demo = [
    "type"  => "SW",
    "token" => "Bb1R3YLipbkTp5p0",
    "param" => [
        "class"  => "Order",
        "method" => "get_list",
        "param" => [
            "uid"  => 1,
            "type" => 2,
        ],
    ],
];
$this->client->send(json_encode($demo));
請(qǐng)求方式

SW 單個(gè)請(qǐng)求,等待結(jié)果

發(fā)出請(qǐng)求后,分配給 Task ,并等待 Task 執(zhí)行完成后,再返回。

SN 單個(gè)請(qǐng)求,不等待結(jié)果

發(fā)出請(qǐng)求后,分配給 Task 之后,就直接返回。

發(fā)送數(shù)據(jù)
$demo = [
    "type"  => "SW",
    "token" => "Bb1R3YLipbkTp5p0",
    "param" => [
        "class"  => "Order",
        "method" => "get_list",
        "param" => [
            "uid"  => 1,
            "type" => 2,
        ],
    ],
];

type 同步/異步設(shè)置

token 可進(jìn)行權(quán)限驗(yàn)證

class 請(qǐng)求的類(lèi)名

method 請(qǐng)求的方法名

uid 參數(shù)一

type 參數(shù)二

返回?cái)?shù)據(jù)

request_method 請(qǐng)求方式

request_time 請(qǐng)求開(kāi)始時(shí)間

response_time 請(qǐng)求結(jié)束時(shí)間

code 標(biāo)識(shí)

msg 標(biāo)識(shí)值

data 約定數(shù)據(jù)

query 請(qǐng)求參數(shù)

代碼 OnRequest.php
rawContent());
            self::$query   = $data;
            if (empty($data)) {
                self::$code = "-1";
                self::$msg  = "非法請(qǐng)求";
                self::end($request, $response);
            }

            //TODO 驗(yàn)證Token

            switch ($data["type"]) {
                case "SW": //單個(gè)請(qǐng)求,等待結(jié)果
                    $task = [
                        "request" => $data,
                        "server"  => "http"
                    ];
                    $rs = $serv->task(json_encode($task), -1, function ($serv, $task_id, $rs_data) use ($request, $response) {
                        self::$code = "1";
                        self::$msg  = "成功";
                        self::$data = $rs_data["response"];
                        self::end($request, $response);
                    });
                    if ($rs === false) {
                        self::$code = "-1";
                        self::$msg  = "失敗";
                        self::end($request, $response);
                    }
                    break;

                case "SN": //單個(gè)請(qǐng)求,不等待結(jié)果
                    $task = [
                        "request" => $data,
                        "server"  => "http"
                    ];
                    $rs = $serv->task(json_encode($task));
                    if ($rs === false) {
                        self::$code = "-1";
                        self::$msg  = "失敗";
                    } else {
                        self::$code = "1";
                        self::$msg  = "成功";
                    }
                    self::end($request, $response);
                    break;
                default:
                    self::$code = "-1";
                    self::$msg  = "非法請(qǐng)求";
                    self::end($request, $response);
            }
        } catch(Exception $e) {
        }
    }

    private static function end($request = null, $response = null)
    {
        $rs["request_method"] = $request->server["request_method"];
        $rs["request_time"]   = $request->server["request_time"];
        $rs["response_time"]  = time();
        $rs["code"]           = self::$code;
        $rs["msg"]            = self::$msg;
        $rs["data"]           = self::$data;
        $rs["query"]          = self::$query;
        $response->end(json_encode($rs));
        self::$data = [];
        return;
    }
}
OnReceive.php
 $fd,
                        "request"      => $data,
                        "server"       => "tcp",
                        "request_time" => self::$request_time,
                    ];
                    $rs = $serv->task(json_encode($task));
                    if ($rs === false) {
                        self::$code = "-1";
                        self::$msg  = "失敗";
                        self::handlerTask($serv, $fd);
                    }
                    break;

                case "SN": //單個(gè)請(qǐng)求,不等待結(jié)果
                    $task = [
                        "fd"           => $fd,
                        "request"      => $data,
                        "server"       => "tcp",
                        "request_time" => self::$request_time,
                    ];
                    $rs = $serv->task(json_encode($task));
                    if ($rs === false) {
                        self::$code = "-1";
                        self::$msg  = "失敗";
                    } else {
                        self::$code = "1";
                        self::$msg  = "成功";
                    }
                    self::handlerTask($serv, $fd);
                    break;
                default:
                    self::$code = "-1";
                    self::$msg  = "非法請(qǐng)求";
                    self::handlerTask($serv, $fd);
            }
        } catch(Exception $e) {
        }
    }

    private static function handlerTask($serv, $fd)
    {
        $rs["request_method"] = "TCP";
        $rs["request_time"]   = self::$request_time;
        $rs["response_time"]  = time();
        $rs["code"]           = self::$code;
        $rs["msg"]            = self::$msg;
        $rs["data"]           = self::$data;
        $rs["query"]          = self::$query;
        $serv->send($fd, json_encode($rs));
    }
}
小結(jié)

Demo 代碼僅供參考,里面有很多不嚴(yán)謹(jǐn)?shù)牡胤剑?/p>

服務(wù)的調(diào)用方與提供方中間需要有一個(gè)服務(wù)注冊(cè)中心,很顯然上面的代碼中沒(méi)有,需要自己去實(shí)現(xiàn)。

服務(wù)注冊(cè)中心,負(fù)責(zé)管理 IP、Port 信息,提供給調(diào)用方使用,還要能負(fù)載均衡和故障切換。

根據(jù)自己的情況,服務(wù)注冊(cè)中心實(shí)現(xiàn)可容易可復(fù)雜,用 Redis 也行,用 Zookeeper、Consul 也行。

感興趣的也可以了解下網(wǎng)關(guān) Kong ,包括 身份認(rèn)證、權(quán)限認(rèn)證、流量控制、監(jiān)控預(yù)警...

再推薦一個(gè) Swoole RPC 框架 Hprose,支持多語(yǔ)言。

就到這了,上面的 Demo 需要源碼的,加我微信。(菜單-> 加我微信-> 掃我)

推薦閱讀

系統(tǒng)的講解 - SSO 單點(diǎn)登錄

系統(tǒng)的講解 - PHP WEB 安全防御

系統(tǒng)的講解 - PHP 緩存技術(shù)

系統(tǒng)的講解 - PHP 接口簽名驗(yàn)證

系統(tǒng)的講解 - PHP 浮點(diǎn)數(shù)高精度運(yùn)算

本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請(qǐng)注明作者和出處,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/31542.html

相關(guān)文章

  • swoolefy-基于swoole擴(kuò)展實(shí)現(xiàn)高性能常駐內(nèi)存型API和Web應(yīng)用服務(wù)框架

    摘要:是一個(gè)基于擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的和應(yīng)用服務(wù)框架高度封裝了,,服務(wù)器,以及基于實(shí)現(xiàn)可擴(kuò)展的服務(wù),同時(shí)支持包方式安裝部署項(xiàng)目。基于實(shí)用,抽象事件處理類(lèi),實(shí)現(xiàn)與底層的回調(diào)的解耦,支持同步異步調(diào)用,內(nèi)置等常用組件等。 swoolefy swoolefy是一個(gè)基于swoole擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的API和Web應(yīng)用服務(wù)框架,高度封裝了http,websocket,ud...

    lewinlee 評(píng)論0 收藏0
  • Swoft 源碼剖析 - RPC 功能實(shí)現(xiàn)

    摘要:值得一提的是目前的服務(wù)即服務(wù),暫沒(méi)有其他的服務(wù)功能,所以基本上相關(guān)的配置指代的就是。會(huì)將請(qǐng)求傳遞給各個(gè)中間件,最終最終傳遞給處理。源碼剖析系列目錄 作者:bromine鏈接:https://www.jianshu.com/p/411...來(lái)源:簡(jiǎn)書(shū)著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。Swoft Github: https://github.com/swo...

    marser 評(píng)論0 收藏0
  • Swoft 源碼剖析 - Swoole和Swoft那些事 (Http/Rpc服務(wù)篇)

    摘要:和服務(wù)關(guān)系最密切的進(jìn)程是中的進(jìn)程組,絕大部分業(yè)務(wù)處理都在該進(jìn)程中進(jìn)行。隨后觸發(fā)一個(gè)事件各組件通過(guò)該事件進(jìn)行配置文件加載路由注冊(cè)。事件每個(gè)請(qǐng)求到來(lái)時(shí)僅僅會(huì)觸發(fā)事件。服務(wù)器生命周期和服務(wù)基本一致,詳情參考源碼剖析功能實(shí)現(xiàn) 作者:bromine鏈接:https://www.jianshu.com/p/4c0...來(lái)源:簡(jiǎn)書(shū)著作權(quán)歸作者所有,本文已獲得作者授權(quán)轉(zhuǎn)載,并對(duì)原文進(jìn)行了重新的排版。S...

    張漢慶 評(píng)論0 收藏0
  • PHP程序員如何簡(jiǎn)單開(kāi)展服務(wù)治理架構(gòu)(一)

    摘要:管理這些服務(wù)方案則叫服務(wù)治理。協(xié)議假定某些傳輸協(xié)議的存在,如或,為通信程序之間攜帶信息數(shù)據(jù)。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。 不涉及其他的語(yǔ)言及工具,我們從PHP本身來(lái)談如何實(shí)現(xiàn)服務(wù)治理 本猿人已經(jīng)寫(xiě)好的服務(wù)治理 https://github.com/CrazyCodes... 治理什么? 這個(gè)專(zhuān)業(yè)名詞很容易發(fā)現(xiàn)...

    superPershing 評(píng)論0 收藏0
  • Swoft 框架 1.0 正式來(lái)襲,首個(gè)基于 Swoole 原生協(xié)程 PHP 框架

    摘要:歷時(shí)年多緊鑼密鼓的開(kāi)發(fā),以及愉快而忙碌的春節(jié)假期,期間數(shù)從到快破,碼云首頁(yè)推薦,作者和社區(qū)的大力支持,正式版終于要和大家見(jiàn)面。此次更新新增了大量特性在易用性代碼復(fù)用性能方面都有所提升??梢杂糜跇?gòu)建高性能的系統(tǒng)中間件基礎(chǔ)服務(wù)等等。 歷時(shí) 1 年多緊鑼密鼓的開(kāi)發(fā),以及愉快而忙碌的春節(jié)假期,期間 github star 數(shù)從 500 到快破 1k,碼云首頁(yè)推薦,Swoole作者 Rango ...

    weij 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<