資料介紹
軟件簡介
swrpc是一個基于swoole開發的高性能rpc包,swrpc提供了注冊發現,鏈路追蹤,中間件等等功能,可以很容易集成到第三方框架,如laravel,yii等等。
功能
- 支持多進程模式或協程模式
- 支持同步,異步調用
- 支持自定義中間件
- 支持服務端按類提供對外服務
- 支持鏈路追蹤
- 支持注冊服務發現
- 支持客戶端負載均衡,包含隨機,權重兩種模式
- 支持自定義日志,包協議,序列化方式等等
安裝
php composer.phar require wuzhc/swprc ~1.0 -vvv
快速體驗
假設我們User和School兩個模塊,為了獲得用戶學校名稱,我們需要在User模塊發起rpc請求調用School模塊的服務。
School模塊
use Swrpc\LogicService;
class SchoolService extends LogicService
{
public function getUserSchool($userID) {
$name = $userID == 123 ? '火星' : '水星';
return $name.'學校';
}
}
School模塊將作為rpc服務端,對外提供服務,啟動如下:
namespace SwrpcTests;
use Swrpc\Server;
$basePath = dirname(dirname(__FILE__));
require_once $basePath . "/vendor/autoload.php";
$options = [
'enable_coroutine' => true,
'pid_file' => __DIR__ . '/swrpc.pid',
];
$server = new Server('School_Module', '127.0.0.1', 9501, 1, $options);
$server->addService(\SwrpcTests\services\SchoolService::class);
$server->start();
將SchoolService添加到server,server會自動檢索類中所有可用的public方法。
User模塊
User模塊作為客戶端,調用School模塊服務如下
namespace SwrpcTests;
use Swrpc\Request;
use Swrpc\LogicService;
use Swrpc\Client;
class UserService extends LogicService
{
public function getUserSchoolName()
{
$userID = 123;
$module = 'School_Module'; //請求目標模塊名稱,需要和服務端定義的一致
$client = Client::create($module, '127.0.0.1', 9501);
return $client->send(Request::create('\SwrpcTests\services\SchoolService_getUserSchool', [$userID]));
}
}
//調用
echo UserService::factory()->getUserSchoolName();
注意:
-
Request.method 為服務類命名 + 下劃線 + 方法名,例如上面的
\SwrpcTests\services\SchoolService_getUserSchool
,如果服務類有命名空間,記得一定要帶上命名空間
多進程和協程模式
多進程或協程模式需要和swoole配置一致,具體參考swoole配置
多進程模式
創建10進程來處理請求
$options = [ 'worker_num' => 10 'pid_file' => __DIR__ . '/swrpc.pid', ]; $server = new Server('School_Module', '127.0.0.1', 9501, 1, $options);
協程模式
目前swrpc協程模式是運行在單進程的
$options = [ 'enable_coroutine' => true, 'pid_file' => __DIR__ . '/swrpc.pid', ]; $server = new Server('School_Module', '127.0.0.1', 9501, 1, $options);
同步調用和異步調用
在客戶端發起同步調用,客戶端會一直等待服務端返回結果
$client = \Swrpc\Client::create($module, '127.0.0.1', 9501); return $client->send(SyncRequest::create('SchoolService_getUserSchool', [$userID]));
在客戶端發起異步調用,客戶端會立馬得到響應結果,請求將被swoole的task進程處理
$client = \Swrpc\Client::create($module, '127.0.0.1', 9501); return $client->send(AsyncRequest::create('SchoolService_getUserSchool', [$userID]));
自定義中間件
中間件允許程序可以對請求進行前置操作和后置操作,底層使用了責任鏈設計模式,所以為了執行下一個中間件,必須返回$next($request)
,如果想提前返回,則返回結果必須是Swrpc\Response
類型
//中間件除了用匿名函數定義,還可以用實現Swrpc\Middlewares\MiddlewareInterface接口的類 $middleware = function (\Swrpc\Request $request, Closure $next) { $start = microtime(true); //前置操作,記錄請求開始時間 $result = $next($request); echo '耗時:'.(microtime(true) - $start).PHP_EOL; //后置操作,記錄請求結束時間,從而計算請求耗時 return $result; //繼續下個中間件的處理 }; $server = new Server('School_Module', '127.0.0.1', 9501, 1, $options); $server->addService(SchoolService::class); $server->addMiddleware($middleware); //添加中間件 $server->start();
如果要提前中止中間件,可以提前在匿名函數或類方法中返回\Swrpc\Response對象,如下
$middleware = function (\Swrpc\Request $request, Closure $next) { if (empty($request->getParams())) { return \Swrpc\Response::error('參數不能為空'); //提前返回,必須是Response類型 } return $next($request); };
服務端按類提供對外服務
從上面的例子中,我們把SchoolService整個類添加的server中,這樣server就能對外提供SchoolService類所有public方法的功能。
$server = new Server('School_Module', '127.0.0.1', 9501, 1, $options); $server->addService(SchoolService::class); //提供SchoolService所有public方法功能 $server->addService(AreaService::class); //提供AreaService所有public方法功能 $server->start();
客戶端使用參考上面的快速體驗
注冊服務發現
如果服務端啟動的時候有設置注冊中心,則啟動成功會自動向注冊中心注冊服務端地址。目前swrpc提供了Consul
作為注冊中心,使用如下
$server = new Server('School_Module', '127.0.0.1', 9501, 1, $options); $server->addRegister(new Consul()); $server->addService(SchoolService::class); $server->start();
如上,使用Consul作為服務的注冊中心,通過http://127.0.0.1:8500
可以查看注冊信息,如果想用etcd等其他注冊中心,只要實現Swrpc\Middlewares\RegisterInterface
接口即可,然后在通過$server->addRegister()
添加到server
客戶端負載均衡
如果服務端啟動多個節點,例如School模塊啟動3個節點,并且注冊到了注冊中心,那么我們可以從注冊中心獲取所有服務端節點信息,然后做一些策略處理。
$register = new Consul(); $client = \Swrpc\Client::createBalancer('School_Module', $register, \Swrpc\Client::STRATEGY_WEIGHT); $result = $client->send(Request::create('SchoolService_getUserSchool', [$userID]);
目前swrpc提供兩種簡單策略模式,\Swrpc\Client::STRATEGY_WEIGHT權重模式
,\Swrpc\Client::STRATEGY_RANDOM
隨機模式
鏈路追蹤
當我們的服務非常多并且需要互相調用時候,如果其中某個調用失敗,會導致我們得不到我們想要的結果,而要調試出是哪個環節出了問題也比較麻煩,可能你需要登錄每臺機器看下有沒有錯誤日志,或者看返回的錯誤信息是哪個服務提供的。鏈路追蹤記錄了整個調用鏈過程,如果某個環節出錯,我們可以快速從調用鏈得到調用中斷地方。
class UserService extends LogicService { public function getUserSchoolName() { $userID = 123; $module = 'School_Module'; //請求目標模塊名稱,需要和服務端定義的一致 $client = Client::create($module, '127.0.0.1', 9501); return $client->send(Request::create('SchoolService_getUserSchool', [$userID], $this->getTracerContext(__FUNCTION__))); //getTracerContext()用于提供追蹤上下文 } } $users = UserService::factory() ->setModule('User_Module') //當前模塊,用于調用鏈的起點 ->setTracerUrl('http://127.0.0.1:9411/api/v2/spans') //zipkin鏈路追蹤地址 ->getUserSchoolName();
如圖,User_Module調用Class_Module,Class_Module又去調用School_Module
每個調用還記錄響應結果
自定義日志處理器
默認使用Monolog/Logger
作為日志處理器,日志信息會輸出到控制臺。可根據自己需求覆蓋默認處理器,只要日志類 實現Psr\Log\LoggerInterface
即可
use Swrpc\Server; use Monolog\Handler\StreamHandler; use Monolog\Logger; $logger = new Logger('swrpc'); $logger->pushHandler(new StreamHandler(fopen('xxxx.log','w+'), Logger::DEBUG)); $server = new Server('127.0.0.1', 9501, ['enable_coroutine'=>true]); $server->addService(UserService::class); $server->addLogger($logger); //覆蓋默認日志處理器 $server->start();
序列化方式
默認使用固定頭+包體來解決tcp粘包問題,默認配置為'package_length_type' => 'N'
,'package_body_offset' => 4
?默認序列化數據會使用serialize()
,如果swoole版本在4.5以上的自動使用swoole_substr_unserialize(),可以實現的類來覆蓋默認配置,只要實現src/Packer/PackerInterface
即可,注意服務端和客戶端需要使用一樣的協議,否則解析不了。
use Swrpc\Server; $packer = new \Swrpc\Packer\SerializeLengthPacker(); $server = new Server('127.0.0.1', 9501, ['enable_coroutine'=>true]); $server->addService(UserService::class); $server->addPacker($packer); //覆蓋默認值
安全證書配置
參考:https://wiki.swoole.com/#/server/setting?id=ssl_cert_file
服務端
$options = [ 'ssl_cert_file' => __DIR__.'/config/ssl.crt', 'ssl_key_file' => __DIR__.'/config/ssl.key', 'pid_file' => __DIR__ . '/swrpc.pid', ]; $server = new Server('School_Module', '127.0.0.1', 9501, $options, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL); $server->addService(SchoolService::class); $server->start();
注意:
-
文件必須為?
PEM
?格式,不支持?DER
?格式,可使用?openssl
?工具進行轉換
測試
使用phpuint實現的簡單測試案例,配置文件phpunit.xml
php phpunit.phar tests --debug
phpunit 測試報告
Client (SwrpcTests\Client)
[x] Client connect
[x] Client sync request
[x] Client async request
Packer (SwrpcTests\Packer)
[x] Serialize length pack
[x] Serialize lenght unpack
[x] Serialize eof pack
[x] Serialize eof unpack
Server (SwrpcTests\Server)
[x] Server register to consul
[x] Server unregister from consul
[x] Server add service
[x] Server add middleware
- 220MHz高性能差分振蕩器SiT9121 4次下載
- USB數據抓包軟件程序下載 7次下載
- 高性能Type-C/DP1.4至HDMI2.0b轉換器CS5265AN 20次下載
- 高性能電流模式PWM控制器UC2842B和UC3842B系列 9次下載
- 高性能六軸MEMS運動跟蹤裝置ICM-20602 14次下載
- 基于ARM的高密度高性能線STM32F103xC 0次下載
- MX25L6445E高性能串行閃存規范文件 20次下載
- 高性能嵌入式堆棧Azure PTOS USBX概述 10次下載
- 高效高性能LED恒流驅動電源芯片AX2028 24次下載
- 高性能低成本的藍牙模塊CSR6576原理圖 16次下載
- TQQ7101超高性能BAW雙工器的詳細數據手冊免費下載
- 如何使用KEELOQ3開發工具包作為開發工具來在目標板上仿真和調試固件
- 如何使用高性能工具包作為開發工具在目標板上仿真和調試固件
- OV971高性能視頻汽車視覺應用簡介.pdf 1次下載
- La、Co代換永磁鐵氧體的高性能化與工藝技術
- 帶你了解什么是高性能計算(HPC) 277次閱讀
- TSMaster RPC 基礎入門:編程指導和使用說明 593次閱讀
- 什么是HTTP協議?什么是RPC協議?二者如何選擇使用? 2304次閱讀
- RPC接口和HTTP接口的區別與聯系 1660次閱讀
- OpenDaylight中的RPC & Notification是什么 811次閱讀
- RPC如何在遠程過程中調用? 793次閱讀
- 淺析OSAT的高性能封裝技術 4897次閱讀
- 關于HPC的高性能計算測試方法 2112次閱讀
- OpenMV Cam上的RPC模塊 1302次閱讀
- 深入理解RPC自定義網絡協議 2384次閱讀
- 為什么需要RPC接口 2556次閱讀
- 三柵極的應用優勢及對高性能FPGA性能的影響以及 1662次閱讀
- 中國科學院開發出了多種低功耗小尺寸高性能的氣體傳感器 1295次閱讀
- 什么是RPC?為什么需要RPC? 1.4w次閱讀
- 適合高性能FPGA開發的HTG-703 1495次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多