PHP遠程調(diào)用以及RPC框架
一個項目,從開始到版本更新,一直到最后的版本維護。功能在不斷增多,對應的代碼量也在不斷增加,也就意味著項目變得更不可維護,這時候,我們需要用拆分的方式將一個項目打散,以便開發(fā)團隊更好的對項目進行維護。
分模塊這個階段,一般也是項目的初級階段,由于人手不夠,一個服務端的接口項目只有一個開發(fā)進行維護,根據(jù)開發(fā)的習慣,會把項目分成若干個模塊進行開發(fā),在一個項目下進行部署。
這樣做的缺點在于項目會隨著版本更新而變得不可維護。
隨著每個模塊功能的不斷完善,代碼變得更加臃腫。這時候需要對項目進行拆分,比如上面的圖,分成用戶體系項目、支付體系項目。
開始大家會采用CURL的方式對外部資源進行訪問。
比如某短信平臺SDK,比如各大第三方提供的SDK,糾結到源碼發(fā)現(xiàn)都是直接采用CURL函數(shù)的方式進行訪問。
優(yōu)點在于沒有環(huán)境要求,能直接用。 缺點在于并發(fā)訪問的資源占用問題。
//新浪微博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======rn'; var_dump($postfields); echo '=====headers======rn'; print_r($headers); echo ’=====request info=====’.'rn'; print_r( curl_getinfo($ci) ); echo ’=====response=====’.'rn'; print_r( $response );}curl_close ($ci);return $response; }RPC
遠程過程調(diào)用協(xié)議
RPC(Remote Procedure Call Protocol)——遠程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡從遠程計算機程序上請求服務,而不需要了解底層網(wǎng)絡技術的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發(fā)包括網(wǎng)絡分布式多程序在內(nèi)的應用程序更加容易。
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調(diào)用進程發(fā)送一個有進程參數(shù)的調(diào)用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態(tài)直到調(diào)用信息到達為止。當一個調(diào)用信息到達,服務器獲得進程參數(shù),計算結果,發(fā)送答復信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進程接收答復信息,獲得進程結果,然后調(diào)用執(zhí)行繼續(xù)進行。
Yar鳥哥出品的RPC框架,輕量級框架。
<?phpclass 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();?>
調(diào)用代碼
<?php$client = new Yar_Client('http://host/api/');$result = $client->api('parameter);?>
注意的是鳥哥出的東西文檔比較少,需要多調(diào)試。
Thriftthrift是一個軟件框架,用來進行可擴展且跨語言的服務的開發(fā)。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。
遠程調(diào)用的意義在于,不同的子項目可以用更適合自己的語言來解決,更有效率的實現(xiàn)需求。
同時,對團隊的開發(fā)來講,更能提高整體的技術水平。
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'}
]
實際上你會發(fā)現(xiàn)我們在給客戶端提供接口的返回值,就是按照這個標準來做的。
相應的,服務端對服務端的數(shù)據(jù)接收和返回,也要同樣按照這個標準來做。
項目拆分帶來的變化項目細化一個模塊對應一個項目,項目之間通過基于REST的接口標準進行面向資源的數(shù)據(jù)訪問。
人員需求項目拆分的前提是一個項目不足以滿足現(xiàn)有的業(yè)務發(fā)展要求,也就意味著拆分之后的開發(fā)人員數(shù)量的擴增。
游擊隊向正規(guī)軍編制的跨越!
文檔更多的項目也就意味著更多的接口調(diào)用文檔,適當?shù)奶幚砦臋n才能更好的提高團隊協(xié)作效率。
后記服務的遠程調(diào)用在于怎么合理的把一個正在變得不可維護的項目從焦油坑中解救出來,并提高項目整體能承載的業(yè)務量,不過,世界上沒有銀彈。
以上就是PHP遠程調(diào)用以及RPC框架的詳細內(nèi)容,更多關于PHP遠程調(diào)用的資料請關注好吧啦網(wǎng)其它相關文章!
相關文章:
1. ASP.NET MVC使用jQuery ui的progressbar實現(xiàn)進度條2. Ajax對xml信息的接收和處理操作實例分析3. Jsp中request的3個基礎實踐4. Ajax返回值類型與用法實例分析5. Java實戰(zhàn)之實現(xiàn)一個好用的MybatisPlus代碼生成器6. Python request中文亂碼問題解決方案7. python簡單實現(xiàn)9宮格圖片實例8. ASP動態(tài)include文件9. php設計模式之迭代器模式實例分析【星際爭霸游戲案例】10. php根據(jù)id生成10位不重復數(shù)字跟字母混合字符串
