关闭

【PHP】远程调用以及RPC框架

标签: php框架RPC团队
9589人阅读 评论(0) 收藏 举报
分类:

前言

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

分模块

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

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

分项目

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

这里写图片描述

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("http://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的接口标准进行面向资源的数据访问。

人员需求

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

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

文档

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

后记

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

参考资料

1
0
查看评论

rpc是什么?php中流行的rpc框架有哪些。

RPC(Remote Procedure Call Protocol)——远程过程调用协议
  • yangyi2083334
  • yangyi2083334
  • 2014-08-21 11:06
  • 13065

rpc介绍,和PHP常用的rpc框架

什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个PHP中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实...
  • cs729298
  • cs729298
  • 2017-03-31 16:48
  • 1629

php的rpc扩展之soap

SOAP 是基于 XML 的简易协议,可使应用程序在 HTTP 之上进行信息交换。 要想在php中使用soap,需要在编译php时,指定configure参数--enable-soap。 一个简单的soap case: soap的server端代码 server.php: <?...
  • wangshiliang1990
  • wangshiliang1990
  • 2016-08-23 10:04
  • 463

rpc以及php使用到的rpc

目录`RPC与PHPRPC、yar:目录 rpc相关知识准备 远程调用原理 远程调用和Socket Rest的区别 流行的rpc框架 phprpc实例 yar实例rpc相关知识准备 rpc的全称是remote procedure call,翻译过来就是远程过程调用 远程调用的意思就是程序调用的方...
  • wh2691259
  • wh2691259
  • 2016-08-19 17:07
  • 1943

php rpc远程过程调用

  • 2009-01-07 21:32
  • 156KB
  • 下载

rpc是什么?php中流行的rpc框架有哪些。

什么是rpc框架 先回答第一个问题:什么是RPC框架? 如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call) 那什么是远程调用? 通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实...
  • zxjiayou1314
  • zxjiayou1314
  • 2017-03-28 12:09
  • 714

grpc简易教程 go server+php client

GRPC是google开源的一个高性能、跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,支持多种开发语言。 对于开发者而言: 1)需要使用protobuf定义接口,即.proto文件 2)然后使用compile工具生成特定语言的执行代码,比如JAVA、C...
  • xuduorui
  • xuduorui
  • 2017-08-30 22:25
  • 1602

Thrift RPC 使用指南实战(附golang&PHP代码)

Thrift RPC 使用指南实战thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript,...
  • grassroots2011
  • grassroots2011
  • 2015-05-13 17:44
  • 6632

php 调用远程url的六种方法小结

[热门]php 调用远程url的六种方法小结 收藏 (2011-11-14 16:25:28) 转载▼ 标签: 杂谈     php 调用远程url的六种方法小结 收藏   示例代码1: 用file_get_co...
  • samxx8
  • samxx8
  • 2012-04-12 19:52
  • 6013

php常见实现远程调用的几种方法-中间件

XML-RPC XML-RPC大致就是整个过程就是使用XML来进行通信。首先构造一个RPC 服务器端用来处理从RPC客户端传递过来的使用XML封装的请求,并且把处理结果通过XML的形式返回给RPC客户端,客户端就去分析XML获取自己需要的数据。 XML-RPC的服务器端必须有现成的函数提...
  • frycn
  • frycn
  • 2017-03-31 09:10
  • 938
    个人资料
    • 访问:640419次
    • 积分:9030
    • 等级:
    • 排名:第2479名
    • 原创:297篇
    • 转载:13篇
    • 译文:4篇
    • 评论:81条
    博客专栏
    微信订阅号
    欢迎加入QQ群
    玩家老黄历(微信小程序)
    谢谢支持~
    最新评论