<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>swrpc基于swoole開發的高性能rpc包

swrpc基于swoole開發的高性能rpc包

2022-06-29 | zip | 0.04 MB | 次下載 | 免費

資料介紹

授權協議 MIT
開發語言 PHP
操作系統 跨平臺
軟件類型 開源軟件
所屬分類 Web應用開發、 RPC/XMLRPC項目

軟件簡介

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作為日志處理器,日志信息會輸出到控制臺??筛鶕约盒枨蟾采w默認處理器,只要日志類 實現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
?

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>