摘要:服務端可自定義方法供客戶端遠程調用服務端遠程調用函數參數順序數量變化不會導致客戶端服務端版本不兼容問題支持多種傳輸協議支持多種通訊方式阻塞非阻塞阻塞非阻塞等支持自定義傳輸協議引入接口高冷一定要高冷設計一定要高冷傳輸相關服務端非阻塞通訊端口
Feature
服務端可自定義方法供客戶端遠程調用
服務端遠程調用函數參數(順序,數量)變化, 不會導致客戶端服務端版本不兼容問題
支持多種傳輸協議 (protocolbuffer, msgpack, json, serialize)
支持多種通訊方式 (阻塞, 非阻塞, SSL阻塞, SSL非阻塞等)
支持自定義傳輸協議 (引入RpcProtocolInterface接口)
高冷, 一定要高冷, API設計一定要高冷
API/** * 傳輸相關 */ // 服務端非阻塞socket class rpc_transport_server_socket { protected $_port; //通訊端口 final public function __construct(int $port){ $this->_port = $port; } } // 客戶端阻塞socket class rpc_transport_client_socket { protected $_host; //通訊地址 protected $_port; //通訊端口 final public function __construct(string $host, int $port) { $this->_host = $host; $this->_port = $port; } } // 客戶端非阻塞socket class rpc_transport_async_client_socket extends rpc_transport_client_socket { // do something } // 傳輸層抽象類 abstract class rpc_transport { protected $_timeout; //傳輸超時, 支持浮點數, 單位:sec protected $_socket; //傳輸句柄 abstract public function on(string $event, mixed $callback); } // 服務端傳輸 class rpc_transport_server extends rpc_transport { final public function __construct(rpc_transport_server_socket $socket, float $timeout){ $this->_socket = $socket; $this->_timeout = $timeout; } public static function factory(int $port, float $timeout){ $this->_socket = new rpc_transport_server_socket($port); $this->_timeout = $timeout; } public function on(string $event, mixed $callback){ SERVER->on(string $event, mixed $callback); } } // 客戶端傳輸 class rpc_transport_client extends rpc_transport { final public function __construct(rpc_transport_client_socket $socket, float $timeout){ $this->_socket = $socket; $this->_timeout = $timeout; } public static function factory(string $host, int $port, float $timeout){ $this->_socket = new rpc_transport_client_socket($host, $port); $this->_timeout = $timeout; } } // 客戶端傳輸 class rpc_transport_async_client extends rpc_transport { final public function __construct(rpc_transport_async_client_socket $socket, float $timeout){ $this->_socket = $socket; $this->_timeout = $timeout; } public static function factory(string $host, int $port, float $timeout){ $this->_socket = new rpc_transport_async_client_socket($host, $port); $this->_timeout = $timeout; } public function on(string $event, mixed $callback){ CLIENT->on(string $event, mixed $callback); } } /** * 協議相關 */ //傳輸協議工廠類 class rpc_protocol { protected $_transport = null; //傳輸 protected $_protocol = null; //協議(protocolbuffer, msgpack, json, serialize) private function __construct($protocol, rpc_transport $transport = NULL){ return self::factory($protocol, $transport); } public static function factory($protocol, rpc_transport $transport = NULL){ if(!isset($transport)) { $this->_transport = $transport; } if(class_exists("rpc_protocol_" . $protocol)) { $this->_protocol = new "rpc_protocol_" . $protocol; } return $this; } public function getTransport(){ return $this->_transport; } public function setTransport($transport){ $this->_transport = $transport; } public function getProtocol(){ return $this->_protocol; } public function setProtocol($protocol){ $this->_protocol = $protocol; } public function pack($message) { return $this->_protocol->pack($message); } public function unpack($message){ return $this->_protocol->unpack($message); } } //傳輸協議接口 interface rpc_protocol_interface { public function pack($message); public function unpack($message); } //JSON傳輸協議(打個樣) class rpc_protocol_json implements rpc_protocol_interface { public function pack($message){ ... } public function unpack($message){ ... } } ... /** * 服務端 */ // 服務端抽象類 abstract class rpc_server_service { public function __call(){ // do something } } // 服務端 class rpc_server { final public function __construct(rpc_server_interface $server_interface, rpc_protocol $protocol); } /** * 客戶端 */ // 客戶端 class rpc_client { private $_protocol = null; public function __call(string $method, array $parameters){ // call $server_interface } final public function __construct(rpc_protocol $protocol){ $this->_protocol = $protocol; } } //客戶端回調函數抽象類 abstract class rpc_async_client_callback { private $_response = null; public function getResult() { // 返回結果值 return $this->_response; } public function onComplete($response){ $this->_response = $response; } public function onError($error){ throw new Exception($error); } } // 非阻塞客戶端 class rpc_async_client { private $_protocol = null; private $_callback = null; public function __call(string $method, array $parameters){ $callback = array_pop($parameters); $response = $this->_protocol->getTransport()->receive(); $this->_protocol->getTransport()->on("complete", $callback->onComplete($response)); $this->_protocol->getTransport()->on("error", $callback->onError($error)); } final public function __construct(rpc_protocol $protocol){ $this->_protocol = $protocol; } }Example
// server class server_hello extends rpc_server_service { public function hello($message) { echo $message; } } $service = server_hello(); $server_transport = new rpc_transport_server(8080, 0.1); $server_transport->on("connect", function(){ echo "Server:Connect. "; }); $server_protocol = new rpc_protocol::factory("json", $server_transport); $server = new rpc_server($server_protocol, $service); $server->serve(); // client $client_transport = new rpc_transport_client("127.0.0.1", 8080, 0.1); $client_transport->on("connect", function(){ echo "Client:Connect. "; }); $client_protocol = new rpc_protocol::factory("json", $client_transport); $client = new rpc_client($client_protocol); $client_transport->open(); $client->hello("world"); $client_transport->close();
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21119.html
摘要:可以說,如果問題是我們的敵人,代碼是我們的劍,設計模式就是高手心中的劍譜。中級選手,在編程的時候知道何時該用什么設計模式,而什么時候不該用。設計模式被用來簡化設計,讓設計更優雅。其中最具有普遍性的方案往往就是我們的設計模式的內容。 showImg(https://segmentfault.com/img/remote/1460000019100076?w=800&h=440); 目錄概...
摘要:原文地址設計模式七設計模式分類根據目的和范圍,設計模式可以分為五類。按照目的分為創建設計模式,結構設計模式,以及行為設計模式。與類的設計模式不同,對象設計模式主要用于運行期對象的狀態改變動態行為變更等。 原文地址:PHP設計模式(七):設計模式分類 Introduction 根據目的和范圍,設計模式可以分為五類。按照目的分為:創建設計模式,結構設計模式,以及行為設計模式。按照范圍分為:...
摘要:我們今天也來做一個萬能遙控器設計模式適配器模式將一個類的接口轉換成客戶希望的另外一個接口。今天要介紹的仍然是創建型設計模式的一種建造者模式。設計模式的理論知識固然重要,但 計算機程序的思維邏輯 (54) - 剖析 Collections - 設計模式 上節我們提到,類 Collections 中大概有兩類功能,第一類是對容器接口對象進行操作,第二類是返回一個容器接口對象,上節我們介紹了...
閱讀 3724·2021-11-24 10:23
閱讀 2771·2021-09-06 15:02
閱讀 1274·2021-08-23 09:43
閱讀 2351·2019-08-30 15:44
閱讀 3045·2019-08-30 13:18
閱讀 779·2019-08-23 16:56
閱讀 1743·2019-08-23 16:10
閱讀 536·2019-08-23 15:08