PHP程序員如何簡單的開展服務治理架構(一)

不涉及其餘的語言及工具,咱們從PHP自己來談如何實現服務治理php

本猿人已經寫好的服務治理 https://github.com/CrazyCodes...

治理什麼?

這個專業名詞很容易發現治理的是服務,而服務則是咱們的項目。管理這些服務方案則叫服務治理。git

如今在Server上有四項服務,分別爲github

  • UserService
  • ShopService
  • GoodsService
  • LiveService

這些服務咱們叫它服務提供者(既提供對內服務的應用)json

調用服務的應用咱們稱它爲服務消費者,例如服務器

  • User-Api
  • Shop-Api
  • Goods-Api
  • Live-Api

Service 是對內服務的而Api是對外服務的swoole

clipboard.png
圖片來源 http://blog.csdn.net/suifeng3...網絡

服務治理考慮的問題就是如何管理這四項服務,讓它們如何對外服務,如何監控服務進程分佈式

依託實現

在實現服務治理以前,須要瞭解如下幾塊知識點工具

  • thrift
  • rpc
  • swoole

thrift

暫時大可理解爲能夠經過它去調用其餘開發語言的方法ui

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,固然實際狀況下,這是永遠不可能的,根本不在一個內存空間中,咱們須要本身模擬出來這種使用方式

$userSerivce = $client->client ('UserService');
$result = $userSerivce->getUserInfo (['user_id' => 100]);
var_dump($result);

在消費者內沒有UserService,更沒有getUserInfo 方法,這些都在服務提供者的應用中,如何去調用它們?

首先經過php的__call 方法去截取一個不存在的方法

public function __call($name, $arguments)
{
    $client = new ClientRpc($this->serviceName);
            
    $response = $client->send ($this->serviceName, $name, $arguments);
            
    return (json_decode ($response, true));
            
}

獲取後調用本身寫的send 方法,swoole出場

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);
    }
}

鳴謝

周夢康 [https://mengkang.net/]

相關文章
相關標籤/搜索