背景:團隊中所有的項目都是php開發(fā)的,且都是用的php-fpm??偣材壳坝?項目,這幾個項目的核心數(shù)據(jù)都是在一個數(shù)據(jù)庫中,現(xiàn)在如果改動一個小功能,可能這幾個項目都會去改動,效率低下。所以考慮將一些公共的服務(wù)和數(shù)據(jù)獨立拆分出來,有統(tǒng)一的讀和寫入口。
問題:那這個6個項目是怎么相互調(diào)用的呢?新項目又怎么調(diào)用呢?
創(chuàng)建一個和這6個項目目錄平級的新的項目(codebase),這個項目是一個公共的調(diào)用項目。其他所有項目index.php都include codebase中的autoload.php文件。為什么沒有選擇用composer的方式將新的codebase加入到項目中。因為上線太麻煩了,在codebase中修改一個功能,需要協(xié)調(diào)6個項目組中的人去composer update ,同時去上線、測試。這個流程就太漫長了,也不滿足我們設(shè)計這套方案的初衷。目前只要是新功能都會產(chǎn)生一個獨立的項目,如果這幾個端口和新功能有關(guān)系,那么都是通過rpc的方式來調(diào)用。
協(xié)議選擇:protobuffer、thrift、json-rpc、yar。對于Pb和thrift我感覺還是重了一點,團隊中至少目前跨語言還沒有出現(xiàn)。json-rpc沒有找到運用得比較廣泛的應(yīng)用、且關(guān)注的人比較少。所以最后選擇鳥哥的yar。
yar是一個php的擴展,需要安裝,安裝方法參考最后鏈接說明。
rpc的優(yōu)勢是可以調(diào)用本地方法一樣調(diào)用遠程的方法,且可以捕獲異常,非常方面。
客戶端:需要注意的是client設(shè)置超時時間YAR_OPT_TIMEOUT,單位為秒。
以下是copy鳥哥的說明:
<?php
$client = new Yar_Client("http://host/api/");
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
$client->SetOpt(YAR_OPT_HEADER, array("hd1: val", "hd2: val"));
//調(diào)用遠端服務(wù)
$result = $client->some_method("parameter");
服務(wù)端:一個普通的php-fpm,不是像swoole這種常駐進程。
<?php
class API {
public function some_method($parameter, $option = "foo") {
}
protected function client_can_not_see() {
}
}
$service = new Yar_Server(new API());
$service->handle();