摘要:概述這是關(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.phprawContent()); 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
摘要:是一個(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...
摘要:值得一提的是目前的服務(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...
摘要:和服務(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...
摘要:管理這些服務(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)...
摘要:歷時(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 ...
閱讀 1961·2021-11-15 17:58
閱讀 2141·2021-10-19 11:45
閱讀 3512·2021-09-02 15:40
閱讀 2606·2021-07-25 10:50
閱讀 3758·2019-08-30 15:56
閱讀 3158·2019-08-30 12:44
閱讀 1040·2019-08-26 13:38
閱讀 1883·2019-08-23 18:29