目錄
- 前言
- 分模塊
- 分項目
- CURL
- RPC
- Yar
- Thrift
- SOAP
- JSON-RPC
- 項目拆分帶來的變化
前言
一個項目,從開始到版本更新,一直到最后的版本維護(hù)。功能在不斷增多,對應(yīng)的代碼量也在不斷增加,也就意味著項目變得更不可維護(hù),這時候,我們需要用拆分的方式將一個項目打散,以便開發(fā)團(tuán)隊更好的對項目進(jìn)行維護(hù)。
分模塊
這個階段,一般也是項目的初級階段,由于人手不夠,一個服務(wù)端的接口項目只有一個開發(fā)進(jìn)行維護(hù),根據(jù)開發(fā)的習(xí)慣,會把項目分成若干個模塊進(jìn)行開發(fā),在一個項目下進(jìn)行部署。
這樣做的缺點在于項目會隨著版本更新而變得不可維護(hù)。
分項目
隨著每個模塊功能的不斷完善,代碼變得更加臃腫。這時候需要對項目進(jìn)行拆分,比如上面的圖,分成用戶體系項目、支付體系項目。
CURL
開始大家會采用CURL的方式對外部資源進(jìn)行訪問。
比如某短信平臺SDK,比如各大第三方提供的SDK,糾結(jié)到源碼發(fā)現(xiàn)都是直接采用CURL函數(shù)的方式進(jìn)行訪問。
優(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======\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
遠(yuǎn)程過程調(diào)用協(xié)議
RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機(jī)程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。RPC協(xié)議假定某些傳輸協(xié)議的存在,如TCP或UDP,為通信程序之間攜帶信息數(shù)據(jù)。在OSI網(wǎng)絡(luò)通信模型中,RPC跨越了傳輸層和應(yīng)用層。RPC使得開發(fā)包括網(wǎng)絡(luò)分布式多程序在內(nèi)的應(yīng)用程序更加容易。
RPC采用客戶機(jī)/服務(wù)器模式。請求程序就是一個客戶機(jī),而服務(wù)提供程序就是一個服務(wù)器。首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
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();
?>
調(diào)用代碼
?php
$client = new Yar_Client("http://host/api/");
$result = $client->api("parameter);
?>
注意的是鳥哥出的東西文檔比較少,需要多調(diào)試。
Thrift
thrift是一個軟件框架,用來進(jìn)行可擴(kuò)展且跨語言的服務(wù)的開發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以構(gòu)建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結(jié)合的、高效的服務(wù)。
遠(yuǎn)程調(diào)用的意義在于,不同的子項目可以用更適合自己的語言來解決,更有效率的實現(xiàn)需求。
同時,對團(tuán)隊的開發(fā)來講,更能提高整體的技術(shù)水平。
SOAP
由于用的XML就不多描述了,畢竟還是json用的多。
JSON-RPC
下面是返回值的標(biāo)準(zhǔn)
--> [
{"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)我們在給客戶端提供接口的返回值,就是按照這個標(biāo)準(zhǔn)來做的。
相應(yīng)的,服務(wù)端對服務(wù)端的數(shù)據(jù)接收和返回,也要同樣按照這個標(biāo)準(zhǔn)來做。
項目拆分帶來的變化
項目細(xì)化
一個模塊對應(yīng)一個項目,項目之間通過基于REST的接口標(biāo)準(zhǔn)進(jìn)行面向資源的數(shù)據(jù)訪問。
人員需求
項目拆分的前提是一個項目不足以滿足現(xiàn)有的業(yè)務(wù)發(fā)展要求,也就意味著拆分之后的開發(fā)人員數(shù)量的擴(kuò)增。
游擊隊向正規(guī)軍編制的跨越!
文檔
更多的項目也就意味著更多的接口調(diào)用文檔,適當(dāng)?shù)奶幚砦臋n才能更好的提高團(tuán)隊協(xié)作效率。
后記
服務(wù)的遠(yuǎn)程調(diào)用在于怎么合理的把一個正在變得不可維護(hù)的項目從焦油坑中解救出來,并提高項目整體能承載的業(yè)務(wù)量,不過,世界上沒有銀彈。
以上就是PHP遠(yuǎn)程調(diào)用以及RPC框架的詳細(xì)內(nèi)容,更多關(guān)于PHP遠(yuǎn)程調(diào)用的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- PHP實現(xiàn)創(chuàng)建一個RPC服務(wù)操作示例
- php實現(xiàn)的一個簡單json rpc框架實例
- ThinkPHP內(nèi)置jsonRPC的缺陷分析
- PHP采用XML-RPC構(gòu)造Web Service實例教程
- 使用PHPRPC實現(xiàn)Ajax安全登錄
- php中關(guān)于codeigniter的xmlrpc的類在進(jìn)行數(shù)據(jù)交換時的類型問題
- AMFPHP php遠(yuǎn)程調(diào)用(RPC, Remote Procedure Call)工具 快速入門教程
- php xml-rpc遠(yuǎn)程調(diào)用
- 詳解php中流行的rpc框架