成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

FWHeart / 1659人閱讀

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

概述

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

第六篇:Swoole 整合成一個小框架

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

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

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

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

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

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

“哈哈哈...”

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

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

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

還有出版社找我寫書的.

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

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

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

可能都會說時間少,時間只要擠,總會有的,每個人都 24 小時,時間對每個人是最公平的。說到這推薦大家讀一下《暗時間》這本書,這是我這本書的 讀書筆記,大家可以瞅瞅。

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

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

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

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

HTTP 請求

//代碼片段
 "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 請求

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

SW 單個請求,等待結(jié)果

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

SN 單個請求,不等待結(jié)果

發(fā)出請求后,分配給 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 請求的類名

method 請求的方法名

uid 參數(shù)一

type 參數(shù)二

返回數(shù)據(jù)

request_method 請求方式

request_time 請求開始時間

response_time 請求結(jié)束時間

code 標(biāo)識

msg 標(biāo)識值

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

query 請求參數(shù)

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

            //TODO 驗(yàn)證Token

            switch ($data["type"]) {
                case "SW": //單個請求,等待結(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": //單個請求,不等待結(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  = "非法請求";
                    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": //單個請求,不等待結(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  = "非法請求";
                    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)用方與提供方中間需要有一個服務(wù)注冊中心,很顯然上面的代碼中沒有,需要自己去實(shí)現(xiàn)。

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

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

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

再推薦一個 Swoole RPC 框架 Hprose,支持多語言。

就到這了,上面的 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ā)請注明作者和出處,謝謝!

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/31542.html

相關(guān)文章

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

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

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

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

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

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

    張漢慶 評論0 收藏0
  • PHP程序員如何簡單開展服務(wù)治理架構(gòu)(一)

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

    superPershing 評論0 收藏0
  • Swoft 框架 1.0 正式來襲,首個基于 Swoole 原生協(xié)程 PHP 框架

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

    weij 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<