博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP远程调用, 为什么需要使用RPC
阅读量:6799 次
发布时间:2019-06-26

本文共 5407 字,大约阅读时间需要 18 分钟。

hot3.png

前言

 

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

分模块

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

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

148ad73709225d91667cf5c87abd0db1346.jpg

分项目

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

11f1fc129ccf1a0beb2bec07fe3bce4b002.jpg

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框架,轻量级框架。

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

人员需求

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

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

文档

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

后记

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

转载于:https://my.oschina.net/u/2364788/blog/2878104

你可能感兴趣的文章
如何远程调试Python代码
查看>>
你会用Python写洗脑神曲吗?
查看>>
kubernetes集群配置serviceaccount
查看>>
MyBatis多参数传递之默认命名方式示例——MyBatis学习笔记之十二
查看>>
Exchange 2013部署系列之(六)配置邮件流和客户端访问
查看>>
创业三年,走通一条路
查看>>
Mac 平台下功能强大的Shimo软件使用指南
查看>>
Hyper-V 3中虚拟机CPU竞争机制
查看>>
移动搜索的4个主要入口
查看>>
Win32 文件(3)
查看>>
Redhat Linux AS,ES,WS有何区别?CentOS是什么?和Redhat什么关系?
查看>>
将动态aspx页面转换成为静态html页面的几种方法
查看>>
Asp.net模板页的使用
查看>>
WCF 第十三章 可编程站点 寄宿站点
查看>>
分享Silverlight/WPF/Windows Phone一周学习导读(06月06日-06月11日)
查看>>
SharePoint 2007 Choice Field 不能更新
查看>>
Heavy-tailed distribution 重尾分布
查看>>
Web 高性能开发汇总
查看>>
虚方法virtual与抽象方法abstract的区别
查看>>
关于C#反射操作类
查看>>