目錄
- 治理什么?
- 依托實(shí)現(xiàn)
- 實(shí)現(xiàn)RPC通信
本文實(shí)例講述了PHP程序員簡(jiǎn)單的開展服務(wù)治理架構(gòu)操作。分享給大家供大家參考,具體如下:
不涉及其他的語(yǔ)言及工具,我們從PHP本身來談如何實(shí)現(xiàn)服務(wù)治理
本猿人已經(jīng)寫好的服務(wù)治理 https://github.com/CrazyCodes/Service-Govern.git
治理什么?
這個(gè)專業(yè)名詞很容易發(fā)現(xiàn)治理的是服務(wù),而服務(wù)則是我們的項(xiàng)目。管理這些服務(wù)方案則叫服務(wù)治理。
現(xiàn)在在Server上有四項(xiàng)服務(wù),分別為
- UserService
- ShopService
- GoodsService
- LiveService
這些服務(wù)我們叫它服務(wù)提供者(既提供對(duì)內(nèi)服務(wù)的應(yīng)用)
調(diào)用服務(wù)的應(yīng)用我們稱它為服務(wù)消費(fèi)者,例如
- User-Api
- Shop-Api
- Goods-Api
- Live-Api
Service 是對(duì)內(nèi)服務(wù)的而Api是對(duì)外服務(wù)的

服務(wù)治理考慮的問題就是如何管理這四項(xiàng)服務(wù),讓它們?nèi)绾螌?duì)外服務(wù),如何監(jiān)控服務(wù)進(jìn)程
依托實(shí)現(xiàn)
在實(shí)現(xiàn)服務(wù)治理之前,需要了解以下幾塊知識(shí)點(diǎn)
thrift
暫時(shí)大可理解為可以通過它去調(diào)用其他開發(fā)語(yǔ)言的方法
rpc
RPC(Remote Procedure Call)—遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請(qǐng)求服務(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ù)器模式。請(qǐng)求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息,然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。
服務(wù)與服務(wù)之間通信可以通過RPC通信,當(dāng)然也可以選擇UDP等
swoole
PHP圈內(nèi)跨世紀(jì)的產(chǎn)物,使用他的原因是因?yàn)镾woole本身支持RPC通信,所以我們本章通過Swoole Rpc的方法去實(shí)現(xiàn)消費(fèi)者與服務(wù)提供者之間的通信
實(shí)現(xiàn)RPC通信
服務(wù)治理非常重要的一個(gè)環(huán)節(jié),要在無感知的情況讓消費(fèi)者A調(diào)用服務(wù)提供者A,B,C,當(dāng)然實(shí)際情況下,這是永遠(yuǎn)不可能的,根本不在一個(gè)內(nèi)存空間中,我們需要自己模擬出來這種使用方式
$userSerivce = $client->client ('UserService');
$result = $userSerivce->getUserInfo (['user_id' => 100]);
var_dump($result);
在消費(fèi)者內(nèi)沒有UserService,更沒有g(shù)etUserInfo 方法,這些都在服務(wù)提供者的應(yīng)用中,如何去調(diào)用它們?
首先通過php的__call 方法去截取一個(gè)不存在的方法
public function __call($name, $arguments)
{
$client = new ClientRpc($this->serviceName);
$response = $client->send ($this->serviceName, $name, $arguments);
return (json_decode ($response, true));
}
獲取后調(diào)用自己寫的send 方法,swoole出場(chǎng)
class ClientRpc
{
protected $client;
public function __construct($service_name, $centerConfig)
{
$this->client = new \swoole_client(SWOOLE_SOCK_TCP);
$center = Dispatcher::loadBalance ($service_name, $centerConfig);
$this->client->connect ($center['ip'], $center['port'], 0.5);
}
public function send($service, $action, $arguments)
{
$request = new Request();
$request->setService ($service);
$request->setAction ($action);
$request->setParameters ($arguments[0]);
// 重組參數(shù),組合成你希望的格式,最后轉(zhuǎn)成json發(fā)送到服務(wù)提供者
$this->client->send (json_encode ((array)$request));
return $this->client->recv ();
}
public function __destruct()
{
$this->client->close ();
unset($this->client);
}
}
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《PHP數(shù)組(Array)操作技巧大全》、《PHP基本語(yǔ)法入門教程》、《PHP運(yùn)算與運(yùn)算符用法總結(jié)》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫(kù)操作入門教程》及《php常見數(shù)據(jù)庫(kù)操作技巧匯總》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- PHP程序員簡(jiǎn)單的開展服務(wù)治理架構(gòu)操作詳解(三)
- PHP程序員簡(jiǎn)單的開展服務(wù)治理架構(gòu)操作詳解(二)
- PHP數(shù)據(jù)源架構(gòu)模式之表入口模式實(shí)例分析
- PHP架構(gòu)及原理知識(shí)點(diǎn)詳解
- thinkPHP5.0框架整體架構(gòu)總覽【應(yīng)用,模塊,MVC,驅(qū)動(dòng),行為,命名空間等】
- php代碼架構(gòu)的八點(diǎn)注意事項(xiàng)
- 四種php中webservice實(shí)現(xiàn)的簡(jiǎn)單架構(gòu)方法及實(shí)例
- php之深入理解架構(gòu)布局講解