ThinkPHP8框架集成Swoole實現高性能RPC服務
介紹
RPC 即遠程過程調用(Remote Procedure Call),是一種分布式計算技術,允許一個程序在不同的計算機上調用另一個程序的函數或方法,就像調用本地程序中的函數一樣簡單。RPC 隱藏了底層網絡通信的細節,使得開發者能夠像處理本地調用一樣處理遠程調用。
分布式調用
解決分布式系統中,服務之間的調用問題。遠程調用時,要能夠像本地調用一樣方便,讓調用者感知不到遠程調用的邏輯。節點角色:
- Server: 暴露服務的服務提供方
- Client: 調用遠程服務的服務消費方
- Registry: 服務注冊與發現的注冊中心
Think-Swoole 中已經實現了的基于 TCP 的 PRC,這樣我們使用傳統型框架也可以做簡單的分布式架構應用了。
PHP 擴展安裝
- 已經編譯安裝 Swoole 擴展
- 不能安裝 Xdebug 擴展
依賴包安裝
composer require topthink/think-swoole
安裝完成后會在項目 config 配置目錄生成 swoole 配置文件 swoole.php
服務端
以下配置都是在config/swoole.php 配置文件中配置
HTTP 服務配置
圖片
開啟 RPC 并注冊服務
1、配置
圖片
2、定義 RPC 接口抽象方法
3、定義 RPC 服務類,繼承 RPC 接口
<?php
declare(strict_types=1);
namespace app\rpc\service;
use app\rpc\contracts\UserInterface;
class UserSerivce implements UserInterface
{
public function add($name)
{
return "【修改】你添加名稱是:" . $name;
}
public function list()
{
return "list";
}
}
為什么一定要寫 interface,不直接實現功能?
think\swoole\rpc\server\Dispatcher下prepareServices方法看下就懂 (系統定義就必須要這么寫) 自我理解 這么寫的好處 大型項目經理直接寫完下面實現。
開啟服務(服務端)
# php think swoole start
Starting swoole http server...
Swoole http server started: <http://0.0.0.0:8787>
You can exit with `CTRL-C`
客戶端
以下配置都是在config/swoole.php 配置文件中配置
HTTP 服務配置
圖片
配置 RPC 文件配置服務端連接信息
1、配置文件
圖片
2、執行命令生成 RPC 服務接口
php think rpc:interface
以上命令執行成功后,會在項目 app 下生成一個rpc.php的文件,它就是 RPC 服務接口調用文件了。rpc.php 文件內容
<?php
/**
* This file is auto-generated.
*/
declare(strict_types=1);
namespace rpc\contract\userservice;
interface UserInterface
{
public function add($name);
public function list();
}
return ['userservice' => ['rpc\contract\userservice\UserInterface']];
注意看下最后的 return 中,就是每個服務接口的命名空間了;在控制器中使用該命名空間實例對象就可以調用
3、實際調用過程
圖片
參考代碼
use rpc\contract\userservice\UserInterface;
...
public function rpctest(UserInterface $userInterface)
{
return $userInterface->add('Tinywan');
}
4、客戶端請求訪問
圖片
熱更新
由于Swoole服務運行過程中 PHP 文件是常駐內存運行的,這樣可以避免重復讀取磁盤、重復解釋編譯 PHP,以便達到最高性能。所以更改業務代碼后必須手動reload或者restart才能生效。
think-swoole擴展提供了熱更新功能,在檢測到相關目錄的文件有更新后會自動reload,從而不需要手動進行reload操作,方便開發調試。
如果你的應用開啟了調試模式,默認是開啟熱更新的。原則上,在部署模式下不建議開啟文件監控,一方面有性能損耗,另外一方面對文件所做的任何修改都需要確認無誤才能進行更新部署。
熱更新的默認配置如下:
當我們在應用的根目錄下定義一個特殊的.env環境變量文件,里面設置了APP_DEBUG = true會默認開啟熱更新,你也可以直接把enable設置為 true。
錯誤
錯誤一 與 xdebug 沖突
Swoole\Server::start(): Using Xdebug in coroutines is extremely dangerous
php 擴展 xdebug 和 easyswoole 沖突,報警告,此時需要禁用 php 的 xdebug 擴展即可