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

資訊專欄INFORMATION COLUMN

RPC-PHP-SDK 設(shè)計(jì)

anyway / 544人閱讀

摘要:服務(wù)端可自定義方法供客戶端遠(yuǎn)程調(diào)用服務(wù)端遠(yuǎn)程調(diào)用函數(shù)參數(shù)順序數(shù)量變化不會(huì)導(dǎo)致客戶端服務(wù)端版本不兼容問題支持多種傳輸協(xié)議支持多種通訊方式阻塞非阻塞阻塞非阻塞等支持自定義傳輸協(xié)議引入接口高冷一定要高冷設(shè)計(jì)一定要高冷傳輸相關(guān)服務(wù)端非阻塞通訊端口

Feature

服務(wù)端可自定義方法供客戶端遠(yuǎn)程調(diào)用

服務(wù)端遠(yuǎn)程調(diào)用函數(shù)參數(shù)(順序,數(shù)量)變化, 不會(huì)導(dǎo)致客戶端服務(wù)端版本不兼容問題

支持多種傳輸協(xié)議 (protocolbuffer, msgpack, json, serialize)

支持多種通訊方式 (阻塞, 非阻塞, SSL阻塞, SSL非阻塞等)

支持自定義傳輸協(xié)議 (引入RpcProtocolInterface接口)

高冷, 一定要高冷, API設(shè)計(jì)一定要高冷

API
/**
 * 傳輸相關(guān)
 */
// 服務(wù)端非阻塞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; //傳輸超時(shí), 支持浮點(diǎn)數(shù), 單位:sec
    protected $_socket; //傳輸句柄
    abstract public function on(string $event, mixed $callback);
}
// 服務(wù)端傳輸
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);
    }
}
/**
 *  協(xié)議相關(guān)
 */
//傳輸協(xié)議工廠類
class rpc_protocol
{
    protected $_transport = null; //傳輸
    protected $_protocol = null; //協(xié)議(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);
    }
}
//傳輸協(xié)議接口
interface rpc_protocol_interface
{
    public function pack($message);
    public function unpack($message);
}
//JSON傳輸協(xié)議(打個(gè)樣)
class rpc_protocol_json implements rpc_protocol_interface
{
    public function pack($message){
        ...
    }
    public function unpack($message){
        ...
    }
}
...
/**
 * 服務(wù)端
 */
// 服務(wù)端抽象類
abstract class rpc_server_service
{
    public function __call(){
        // do something
    }
}
// 服務(wù)端
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;
    }
}    
//客戶端回調(diào)函數(shù)抽象類
abstract class rpc_async_client_callback
{
    private $_response = null;
    public function getResult() { 
        // 返回結(jié)果值
        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();

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

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

相關(guān)文章

  • 被誤讀的設(shè)計(jì)模式

    摘要:可以說,如果問題是我們的敵人,代碼是我們的劍,設(shè)計(jì)模式就是高手心中的劍譜。中級(jí)選手,在編程的時(shí)候知道何時(shí)該用什么設(shè)計(jì)模式,而什么時(shí)候不該用。設(shè)計(jì)模式被用來簡(jiǎn)化設(shè)計(jì),讓設(shè)計(jì)更優(yōu)雅。其中最具有普遍性的方案往往就是我們的設(shè)計(jì)模式的內(nèi)容。 showImg(https://segmentfault.com/img/remote/1460000019100076?w=800&h=440); 目錄概...

    William_Sang 評(píng)論0 收藏0
  • PHP設(shè)計(jì)模式(七):設(shè)計(jì)模式分類

    摘要:原文地址設(shè)計(jì)模式七設(shè)計(jì)模式分類根據(jù)目的和范圍,設(shè)計(jì)模式可以分為五類。按照目的分為創(chuàng)建設(shè)計(jì)模式,結(jié)構(gòu)設(shè)計(jì)模式,以及行為設(shè)計(jì)模式。與類的設(shè)計(jì)模式不同,對(duì)象設(shè)計(jì)模式主要用于運(yùn)行期對(duì)象的狀態(tài)改變動(dòng)態(tài)行為變更等。 原文地址:PHP設(shè)計(jì)模式(七):設(shè)計(jì)模式分類 Introduction 根據(jù)目的和范圍,設(shè)計(jì)模式可以分為五類。按照目的分為:創(chuàng)建設(shè)計(jì)模式,結(jié)構(gòu)設(shè)計(jì)模式,以及行為設(shè)計(jì)模式。按照范圍分為:...

    tracymac7 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

    Dionysus_go 評(píng)論0 收藏0
  • php設(shè)計(jì)模式

    摘要:我們今天也來做一個(gè)萬(wàn)能遙控器設(shè)計(jì)模式適配器模式將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。今天要介紹的仍然是創(chuàng)建型設(shè)計(jì)模式的一種建造者模式。設(shè)計(jì)模式的理論知識(shí)固然重要,但 計(jì)算機(jī)程序的思維邏輯 (54) - 剖析 Collections - 設(shè)計(jì)模式 上節(jié)我們提到,類 Collections 中大概有兩類功能,第一類是對(duì)容器接口對(duì)象進(jìn)行操作,第二類是返回一個(gè)容器接口對(duì)象,上節(jié)我們介紹了...

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

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

0條評(píng)論

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