本文實例講述了PHP程序員簡單的開展服務治理架構操作。分享給大家供大家參考,具體如下:
不涉及其他的語言及工具,我們從PHP本身來談如何實現服務治理
本猿人已經寫好的服務治理 https://github.com/CrazyCodes/Service-Govern.git
治理什么?
這個專業名詞很容易發現治理的是服務,而服務則是我們的項目。管理這些服務方案則叫服務治理。
現在在Server上有四項服務,分別為
- UserService
- ShopService
- GoodsService
- LiveService
這些服務我們叫它服務提供者(既提供對內服務的應用)
調用服務的應用我們稱它為服務消費者,例如
- User-Api
- Shop-Api
- Goods-Api
- Live-Api
Service 是對內服務的而Api是對外服務的
服務治理考慮的問題就是如何管理這四項服務,讓它們如何對外服務,如何監控服務進程
依托實現
在實現服務治理之前,需要了解以下幾塊知識點
- thrift
- rpc
- swoole
thrift
暫時大可理解為可以通過它去調用其他開發語言的方法
rpc
RPC(Remote Procedure Call)—遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
服務與服務之間通信可以通過RPC通信,當然也可以選擇UDP等
swoole
PHP圈內跨世紀的產物,使用他的原因是因為Swoole本身支持RPC通信,所以我們本章通過Swoole Rpc的方法去實現消費者與服務提供者之間的通信
實現RPC通信
服務治理非常重要的一個環節,要在無感知的情況讓消費者A調用服務提供者A,B,C,當然實際情況下,這是永遠不可能的,根本不在一個內存空間中,我們需要自己模擬出來這種使用方式
1
2
3
|
$userSerivce = $client ->client ( 'UserService' ); $result = $userSerivce ->getUserInfo ([ 'user_id' => 100]); var_dump( $result ); |
在消費者內沒有UserService,更沒有getUserInfo 方法,這些都在服務提供者的應用中,如何去調用它們?
首先通過php的__call 方法去截取一個不存在的方法
1
2
3
4
5
6
7
8
9
|
public function __call( $name , $arguments ) { $client = new ClientRpc( $this ->serviceName); $response = $client ->send ( $this ->serviceName, $name , $arguments ); return (json_decode ( $response , true)); } |
獲取后調用自己寫的send 方法,swoole出場
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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]); // 重組參數,組合成你希望的格式,最后轉成json發送到服務提供者 $this ->client->send (json_encode (( array ) $request )); return $this ->client->recv (); } public function __destruct() { $this ->client->close (); unset( $this ->client); } } |
希望本文所述對大家PHP程序設計有所幫助。
原文鏈接:https://segmentfault.com/a/1190000013481688