PHP远程调用以及RPC框架

admin3年前PHP教程34
目录
前言分模块分项目CURLRPCYarThriftSOAPJSON-RPC项目拆分带来的变化项目细化人员需求文档后记
前言

一个项目,从开始到版本更新,一直到最后的版本维护。功能在不断增多,对应的代码量也在不断增加,也就意味着项目变得更不可维护,这时候,我们需要用拆分的方式将一个项目打散,以便开发团队更好的对项目进行维护。

分模块

这个阶段,一般也是项目的初级阶段,由于人手不够,一个服务端的接口项目只有一个开发进行维护,根据开发的习惯,会把项目分成若干个模块进行开发,在一个项目下进行部署。

这样做的缺点在于项目会随着版本更新而变得不可维护。

分项目

随着每个模块功能的不断完善,代码变得更加臃肿。这时候需要对项目进行拆分,比如上面的图,分成用户体系项目、支付体系项目。

CURL

开始大家会采用CURL的方式对外部资源进行访问。

比如某短信平台SDK,比如各大第三方提供的SDK,纠结到源码发现都是直接采用CURL函数的方式进行访问。

优点在于没有环境要求,能直接用。
缺点在于并发访问的资源占用问题。


//新浪微博SDK的http请求部分源码
 /**
     * Make an HTTP request
     *
     * @return string API results
     * @ignore
     */
    function http($url, $method, $postfields = NULL, $headers = array()) {
        $this->http_info = array();
        $ci = curl_init();
        /* Curl settings */
        curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent);
        curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
        curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
        curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ci, CURLOPT_ENCODING, "");
        curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
        if (version_compare(phpversion(), '5.4.0', '<')) {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 1);
        } else {
            curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, 2);
        }
        curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader'));
        curl_setopt($ci, CURLOPT_HEADER, FALSE);
 
        switch ($method) {
            case 'POST':
                curl_setopt($ci, CURLOPT_POST, TRUE);
                if (!empty($postfields)) {
                    curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
                    $this->postdata = $postfields;
                }
                break;
            case 'DELETE':
                curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
                if (!empty($postfields)) {
                    $url = "{$url}?{$postfields}";
                }
        }
 
        if ( isset($this->access_token) && $this->access_token )
            $headers[] = "Authorization: OAuth2 ".$this->access_token;
 
        if ( !empty($this->remote_ip) ) {
            if ( defined('SAE_ACCESSKEY') ) {
                $headers[] = "SaeRemoteIP: " . $this->remote_ip;
            } else {
                $headers[] = "API-RemoteIP: " . $this->remote_ip;
            }
        } else {
            if ( !defined('SAE_ACCESSKEY') ) {
//                $headers[] = "API-RemoteIP: " . $_SERVER['REMOTE_ADDR'];
            }
        }
        curl_setopt($ci, CURLOPT_URL, $url );
        curl_setopt($ci, CURLOPT_HTTPHEADER, $headers );
        curl_setopt($ci, CURLINFO_HEADER_OUT, TRUE );
 
        $response = curl_exec($ci);
        $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
        $this->http_info = array_merge($this->http_info, curl_getinfo($ci));
        $this->url = $url;
 
        if ($this->debug) {
            echo "=====post data======\r\n";
            var_dump($postfields);
 
            echo "=====headers======\r\n";
            print_r($headers);
 
            echo '=====request info====='."\r\n";
            print_r( curl_getinfo($ci) );
 
            echo '=====response====='."\r\n";
            print_r( $response );
        }
        curl_close ($ci);
        return $response;
    }
RPC

远程过程调用协议

RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

Yar

鸟哥出品的RPC框架,轻量级框架。


<?php
class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function api($parameter, $option = "foo") {
    }
 
    protected function client_can_not_see() {
    }
}
 
$service = new Yar_Server(new API());
$service->handle();
?>

调用代码


<?php
$client = new Yar_Client("host/api/");
$result = $client->api("parameter);
?>

注意的是鸟哥出的东西文档比较少,需要多调试。

Thrift

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

远程调用的意义在于,不同的子项目可以用更适合自己的语言来解决,更有效率的实现需求。

同时,对团队的开发来讲,更能提高整体的技术水平。

SOAP

由于用的XML就不多描述了,毕竟还是json用的多。

JSON-RPC

下面是返回值的标准

--> [

    {"jsonrpc": "2.0", "method": "sum", "params": [1,2,4], "id": "1"},

    {"jsonrpc": "2.0", "method": "notify_hello", "params": [7]},

    {"jsonrpc": "2.0", "method": "subtract", "params": [42,23], "id": "2"},

    {"foo": "boo"},

    {"jsonrpc": "2.0", "method": "foo.get", "params": {"name": "myself"}, "id": "5"},

    {"jsonrpc": "2.0", "method": "get_data", "id": "9"} 

    ]

<-- [

    {"jsonrpc": "2.0", "result": 7, "id": "1"},

    {"jsonrpc": "2.0", "result": 19, "id": "2"},

    {"jsonrpc": "2.0", "error": {"code": -32600, "message": "Invalid Request"}, "id": null},

    {"jsonrpc": "2.0", "error": {"code": -32601, "message": "Method not found"}, "id": "5"},

    {"jsonrpc": "2.0", "result": ["hello", 5], "id": "9"}

    ]

实际上你会发现我们在给客户端提供接口的返回值,就是按照这个标准来做的。

相应的,服务端对服务端的数据接收和返回,也要同样按照这个标准来做。

项目拆分带来的变化

项目细化

一个模块对应一个项目,项目之间通过基于REST的接口标准进行面向资源的数据访问。

人员需求

项目拆分的前提是一个项目不足以满足现有的业务发展要求,也就意味着拆分之后的开发人员数量的扩增。

游击队向正规军编制的跨越!

文档

更多的项目也就意味着更多的接口调用文档,适当的处理文档才能更好的提高团队协作效率。

后记

服务的远程调用在于怎么合理的把一个正在变得不可维护的项目从焦油坑中解救出来,并提高项目整体能承载的业务量,不过,世界上没有银弹。

以上就是PHP远程调用以及RPC框架的详细内容,更多关于PHP远程调用的资料请关注其它相关文章!

免责声明:本文内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。请核实广告和内容真实性,谨慎使用。

相关文章

美国大带宽服务器的安全防御措施有哪些

美国大带宽服务器的安全防御措施有哪些?美国大带宽服务器的安全防御措施通常包括以下方面:防火墙:防火墙是保护服务器免受网络攻击的关键。它可以监控网络流量,过滤恶意流量并阻止入侵尝试。DDoS防护:DDo...

使用台湾多IP服务器有哪些好处

以下是一篇关于台湾多IP服务器的文章,希望对您有所帮助:台湾多IP服务器是一种网络服务器,可以为您提供多个IP地址。这意味着您可以使用不同的IP地址来访问互联网,从而提高您的网络安全和隐私保护。此外,...

香港拨号vps租用有哪些优势

香港拨号vps租用的优势有:1、香港拨号VPS采用操作系统虚拟化技术,能实现软件和硬件的隔离,且能实现服务器维护和更新时零宕机;2、香港拨号VPS拥有独立的服务器的资源,包括驱动器、CPU、内存、硬盘...

php操作ElasticSearch搜索引擎流程详解

目录一、安装二、使用三、新建ES数据库四、创建表五、插入数据六、 查询所有数据七、查询单条数据八、搜索九、测试代码〝 古人学问遗无力,少壮功夫老始成 〞如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥...

浅谈swoole的作用与原理

目录PHP 中的 Node ?Swoole 到底是什么?如何让它运行?使用 Docker 运行 SwooleSwoole 可以做什么?基于 Swoole 实现 HTTP 服务HTTP Server 标...

租用国外站群服务器有哪些注意事项呢

在网站优化工作中,站长们常常使用国外站群服务器来作为辅助工具,国外站群服务器具有多IP的优势,帮助站群优化网站的排名引入更多优质流量。那么租用国外站群服务器有哪些注意事项呢?下面小编就给大家说说。一、...