日韩在线观看-日韩在线成人-日韩在线不卡视频-日韩在线不卡视频-国产精品99-国产精品99

Rpc-Server

場景

例如在一個商場系統(tǒng)中,我們將商品庫和系統(tǒng)公告兩個服務切分開到不同的服務器當中。當用戶打開商場首頁的時候, 我們希望 App 向某個網(wǎng)關(guān)發(fā)起請求,該網(wǎng)關(guān)可以自動地幫我們請求商品列表和系統(tǒng)公共等數(shù)據(jù),合并返回。

服務定義

每一個 Rpc 服務其實就是一個 EasySwoole\Rpc\Service\AbstractService 類,在服務下面我們又分為多個子模塊,每個子模塊提供不同的服務。 如下:

定義商品服務

<?php

namespace App\RpcServices;

use EasySwoole\Rpc\Protocol\Request;
use EasySwoole\Rpc\Service\AbstractService;

class Goods extends AbstractService
{
    /**
     *  重寫onRequest(比如可以對方法做ip攔截或其它前置操作)
     *
     * @param Request $request
     * @return bool
     */
    protected function onRequest(Request $request): bool
    {
        return true;
    }

    function serviceName(): string
    {
        return 'Goods';
    }
}

定義商品服務的子模塊

<?php

namespace App\RpcServices;

use EasySwoole\Rpc\Service\AbstractServiceModule;

class GoodsModule extends AbstractServiceModule
{
    function moduleName(): string
    {
        return 'GoodsModule';
    }

    function list()
    {
        $this->response()->setResult([
            [
                'goodsId' => '100001',
                'goodsName' => '商品1',
                'prices' => 1124
            ],
            [
                'goodsId' => '100002',
                'goodsName' => '商品2',
                'prices' => 599
            ]
        ]);
        $this->response()->setMsg('get goods list success');
    }

    function exception()
    {
        throw new \Exception('the GoodsModule exception');

    }

    protected function onException(\Throwable $throwable)
    {
        $this->response()->setStatus(-1)->setMsg($throwable->getMessage());
    }
}

定義公共服務

<?php

namespace App\RpcServices;

use EasySwoole\Rpc\Service\AbstractService;

class Common extends AbstractService
{
    function serviceName(): string
    {
        return 'Common';
    }
}

定義公共服務的子模塊

<?php

namespace App\RpcServices;

use EasySwoole\Rpc\Service\AbstractServiceModule;

class CommonModule extends AbstractServiceModule
{
    function moduleName(): string
    {
        return 'CommonModule';
    }

    public function mailBox()
    {
        // 獲取client 全局參數(shù)
        $this->request()->getClientArg();
        // 獲取參數(shù)
        $this->request()->getArg();
        $this->response()->setResult([
            [
                'mailId'=>'100001',
                'mailTitle'=>'系統(tǒng)消息1',
            ],
            [
                'mailId'=>'100001',
                'mailTitle'=>'系統(tǒng)消息1',
            ],
        ]);
        $this->response()->setMsg('get mail list success');
    }

    public function serverTime()
    {
        $this->response()->setResult(time());
        $this->response()->setMsg('get server time success');
    }
}

服務注冊

EasySwoole 全局事件(即項目根目錄的 EasySwooleEvent 文件)中,進行服務注冊。至于節(jié)點管理、服務類定義等具體用法請看對應章節(jié)。

<?php

namespace EasySwoole\EasySwoole;

use EasySwoole\EasySwoole\AbstractInterface\Event;
use EasySwoole\EasySwoole\Swoole\EventRegister;

class EasySwooleEvent implements Event
{
    public static function initialize()
    {
        date_default_timezone_set('Asia/Shanghai');
    }

    public static function mainServerCreate(EventRegister $register)
    {
        ###### 注冊 rpc 服務 ######
        /** rpc 服務端配置 */
        $config = new \EasySwoole\Rpc\Config();
        $config->setNodeId('EasySwooleRpcNode1');
        $config->setServerName('EasySwoole'); // 默認 EasySwoole
        $config->setOnException(function (\Throwable $throwable) {

        });

        $serverConfig = $config->getServer();
        // 單機部署內(nèi)部調(diào)用時可指定為 127.0.0.1
        // 分布式部署時多臺調(diào)用時請?zhí)?0.0.0.0
        $serverConfig->setServerIp('127.0.0.1');

        // rpc 具體配置請看配置章節(jié)
        $rpc = new \EasySwoole\Rpc\Rpc($config);

        // 創(chuàng)建 Goods 服務
        $goodsService = new \App\RpcServices\Goods();
        // 添加 GoodsModule 模塊到 Goods 服務中
        $goodsService->addModule(new \App\RpcServices\GoodsModule());
        // 添加 Goods 服務到服務管理器中
        $rpc->serviceManager()->addService($goodsService);

        // 創(chuàng)建 Common 服務
        $commonService = new \App\RpcServices\Common();
        // 添加 CommonModule 模塊到 Common 服務中
        $commonService->addModule(new \App\RpcServices\CommonModule());
        // 添加 Common 服務到服務管理器中
        $rpc->serviceManager()->addService($commonService);

        // 此刻的rpc實例需要保存下來 或者采用單例模式繼承整個Rpc類進行注冊 或者使用Di

        // 注冊 rpc 服務
        $rpc->attachServer(ServerManager::getInstance()->getSwooleServer());

    }
}

服務端響應狀態(tài)碼說明

狀態(tài)碼 說明
0 調(diào)用成功
1001 獲取不到服務端可用節(jié)點,調(diào)用失敗
1002 客戶端連接服務端節(jié)點超時,調(diào)用失敗
1003 服務端響應超時,調(diào)用失敗
2001 服務端讀取客戶端請求數(shù)據(jù)包超時,調(diào)用失敗
2002 客戶端發(fā)送的數(shù)據(jù)包不合法,調(diào)用失敗
3000 服務端節(jié)點宕機,調(diào)用失敗
3001 調(diào)用的服務不存在,調(diào)用失敗
3002 調(diào)用服務的子模塊不存在,調(diào)用失敗
3003 調(diào)用服務錯誤,調(diào)用失敗
其他 未知錯誤,調(diào)用失敗

為了方便測試,我把兩個服務放在同一臺機器中注冊。實際生產(chǎn)場景應該是 N 臺機注冊商品服務,N 臺機器注冊公告服務,把服務分開。

主站蜘蛛池模板: 铁血战士电影| 寻梦记| 电影《重生》| 大胆艺术| 小孩脸上一块白一块白是什么原因| 电影潘金莲| 韩佳熙的电影全部作品| 隐形人4| 美女mm| 甄子丹电影| 姐妹在线| 央视7套| 工业硫酸| 周秀娜全部三级视频| http://www.douyin.com| 秀人网 官网门户免费| 辽宁卫视在线观看| 髋关节置换术后护理ppt| 美女网站视频免费| 西安地铁2号线运营时间表| 巨乳姐妹| 什么是实现碳达峰碳中和目标的基础路径| 情难自禁电影| 轨迹地图| 罗丽·星克莱尔| 让我们的家更美好教学设计| 女生操女生| 小姐诱心国语未删减版| 钉子电影电视剧| 祝福语生日| 丰崎爱生| 郑楚一| 五年级简易方程思维导图| 邓伦是石家庄哪里的| 彻夜狂欢| 我的年轻小姨电视剧免费观看高清| 里番在线看| 女村长| 母亲电影完整版韩国| 双罗衫简谱| 母亲电影韩国完整版免费观看|