乐趣区

关于php:PHP-基于-SWX-框架搭建RPC微服务支持

前言

官网地址:SW- X 框架 - 专一高性能便捷开发而生的 PHP-SwooleX 框架

心愿各大佬举起小手,给小弟一个 star:https://github.com/swoolex/swoolex

场景一

在 FPM 我的项目中,很多业务状况下是挺无奈的,例如某个业务须要用到发送短信。

通常这类业务不论短信是否发送胜利,都不应该应该影响该接口的执行后果,又或者是执行效率(CURL 梗塞到了上面的业务代码)。

以往,这种状况个别会把发送短信当作一个工作,投递到某种音讯队列中,而后在 php-cli 下应用多过程的形式另起一个独立的过程进行后盾耗费执行。

因为受到 PHP 过程模型的影响,如果 FPM 的过程被梗塞,该队列就有可能被间接挂掉。

同时,这种办法的性能耗费重大,也不便于日常保护。

场景二

如果是容许异步执行的逻辑,在 FPM 下还有优化的空间,那如果是须要同步执行的代码呢。

例如须要调用百度地图的经纬度解析接口,这种同时须要期待取得申请后果,能力往下执行。

假如咱们有一个我的项目,7 个接口须要用到该接口,通常状况下都会基于框架,封装成一个扩大类,又或者是一个公共的函数进行调用。

但当公司业务扩张,可能会产生不同的业务线,但不同的业务所应用的语言,框架都不肯定统一(不是所有公司都喜爱一个框架,启用多利用架构的)。

这时候扩大封装的形式就没方法应用了,因为咱们可能会 copy 有数份雷同的代码到各个利用下,当百度地图接口降级时,咱们还有可能会脱漏某一个利用下的代码没有降级实现,从而导致业务谬误,产生不可估量的损失。

场景三

如果说第三方接口还能够容许 COPY 封装的扩大到多个利用下,那公共的业务逻辑组件化封装就没方法了。

例如会员注册,当我的项目刚起步时,可能咱们须要会员注册能力下单,突然某天公司业务做大了,须要开发出渠道 API,让渠道商部署平台,其中又有会员注册的性能。

之后,公司发现如果应用二维码间接下单,又会更加不便市场推广,就变成须要反对下单时间接注册用户。

再之后,又一堆后盾创立会员、电话下单创立会员、积分兑换商城创立会员等等。

从一个会员注册的 Model,突然变成了 N 个利用的会员注册,这时候应用单个利用的 Model 封装曾经无奈承载业务了。

SW- X 的微服务

SW- X 的微服务都是为了应答以上这些场景所诞生,底层应用了 TCP 通信协定,反对基于 AES 的数据加解密反对,官网提供了 Swoole/FPM 下的 RPC 客户端,并提供了纯基于 Redis 存储管理的 RPC 服务中心,可进行 WEB 界面化的服务日常治理。

微服务的部署条件

1、须要先装置 Redis 服务,与 PHP-Redis 扩大
2、须要筹备 2 个端口,与 2 份 SW- X 框架源码,因为服务中心 (http) 与微服务服务端 (rpc) 是须要别离启动不同的服务端口。

材料筹备

先将 Redis 改成 6379 端口(默认),明码改成123456

平安组凋谢一个 9501 端口,用于搭建微服务 - 服务中心。

平安组凋谢一个 9502 端口,用于搭建微服务 - 服务端。

部署微服务 - 服务中心

1、将 SW- X 框架源码解压(拉取)到 swoole_web/ 目录下,具体地址也能够改成本人测试的。

2、批改 /config/server.php 文件下的 port 端口为9501

3、批改 /config/rpc.php 文件下的 http_rpc_is 参数为 true,示意以后 HTTP 服务为 RPC 服务中心利用。同时,该文件下的http_rpc_user_list 参数为服务中心的账号配置,默认的超级账号密码是:swoolex

4、关上 shell 界面,执行以下代码:

# 进入目录
cd /www/wwwroot/swoole_web/
# 装置服务中心 -web 组件
php sw-x rpc start

装置胜利会输入服务中心对应的路由地址,而后在 shell 界面,持续输出:

# 启动 HTTP 服务后盾运行
php sw-x start http -d

实现后,就能够在浏览器关上 IP 地址:9501/HttpRpc/login 拜访到微服务 - 服务中心登陆地址了。

具体 UI 如下图:

部署微服务 - 服务端

1、将 SW- X 框架源码解压(拉取)到 swoole_rpc/ 目录下,具体地址也能够改成本人测试的。

2、批改 /config/server.php 文件下的 port 端口为9502

3、关上 shell 界面,执行以下代码:

# 进入目录
cd /www/wwwroot/swoole_rpc/
# 启动 RPC 服务[不退后台运行]
php sw-x start rpc

服务日常治理

登入服务中心,咱们能够看到有一个框架默认的测试服务,如下:

1、服务调试

点击调试按钮,能够间接对该服务进行在线调试,如下图:

能够对调试参数进行在线设置和保留,点击调试后对应的后果会在右侧窗口滑出。

2、服务统计

同时,服务中心也反对统计单个服务在一小时内的申请量,须要在 RPC 服务端,批改 /config/rpc.php 的配置参数,如下:

[
    // +-----------------------------
    // | 服务申请统计相干
    // +-----------------------------
    // 是否开启统计
    'chat_status' => true,
    // 统计记录的 Redis 连接池标识
    'chat_redis_driver' => 'default',
    // 统计记录保留天数
    'chat_days' => 14,
];

chat_status 参数改为true,因为微服务的统计是依赖 Redis 计数器实现,所有微服务服务端也须要配置好 Redis 连接池(连接数必须大于 1),而后重启 RPC 服务端即可。

最初回到服务中心,多发送几次调试申请,再点击统计按钮,就能够查看到下图成果:

3、增加服务

上面,咱们就来创立一个 order/test->run 的服务,该服务是示意,服务调用于 /app/rpc/order/test.php 控制器下的 run() 办法。

具体流程如下图:

而后在 swoole_rpc/ 服务端,创立 /app/rpc/order/test.php 文件,并写入以下代码:

<?php
// 微服务 - 同步调用演示
namespace app\rpc\order;
use x\controller\Rpc;

class test extends Rpc{
    // 对应 order/test->run 服务
    public function run() {
        // 能够这样获取申请头
        $headers = $this->headers();
        // 能够这样获取申请参数
        $param = $this->param();

        // 能够 return 值就是调用后果值
        return $param;
    }
}

如果你没有开启热重载,就须要先重启服务端,能力进行调试,上面是在服务中心里的调试后果:

4、FPM 装置微服务客户端

关上官网:https://www.sw-x.cn/word/v2.5…

依据我的项目的 PHP 版本,下载对应的 FPM 客户端扩大包,解压到利用的 /extend/ 自定义扩大利用目录下(不论是 TP 还是 La 都会有该反对)。

上面以一个 ThinkPHP5.1 的我的项目为例,下载 PHP5.3+ 版本的客户端包。

解压后,批改 /SwooleXRpc/config/rpc.php 文件,次要是将外面的配置参数,改成与微服务服务中心的 /config/rpc.php/config/redis.php配置统一即可。

而后批改 TP 默认控制器代码/app/index/controller/Index.php,为如下代码:

<?php
namespace app\index\controller;
use think\Controller;

class Index extends Controller{public function index() {
        // 调用微服务客户端
        $Rpc = new \SwooleXRpc\RpcClient();
        // 申请 RPC 服务
        $body = $Rpc->route('order/test') // 路由地址
        ->func('run') // 办法
        ->param([ // 申请参数
            'longitude' => '113.383523',
            'latitude' => '23.131044'
        ])
        ->header(array()) // 申请头
        ->max(3) // 当 RPC 申请失败时,最多递归几个服务节点直至胜利为止,默认 1
        // ->task() // 是否投递异步工作池
        // ->callback('http://baidu.com', 'post') // 异步工作能够设置回调告诉
        ->send(); // 发送申请

        // 后果集
        dump($body);
        // 状态码 == 200 == 胜利
        dump($Rpc->getStatus());
        // 谬误起因
        dump($Rpc->getMsg());
    }
}

最初拜访该控制器查看调用后果即可。

5、异步投递调用

SW- X 的微服务在客户端调用时,能够把该次服务申请投递到异步工作池,以后申请会即可返回true,示意工作投递胜利。

投递胜利的工作会从 Swoole 的 onReceive 事件,转发到 onTask 事件进行解决。

在服务中心增加以下服务,用于测试异步调用:

而后在 swoole_rpc/ 服务端,创立 /app/rpc/order/task.php 文件,并写入以下代码:

<?php
// 微服务 - 异步调用演示
namespace app\rpc\order;
use x\controller\Rpc;

class task extends Rpc{
    // 对应 order/task->run 服务
    public function run() {
        // 能够这样获取申请参数
        $param = $this->param();

        // 记录日志,看看服务是否调用胜利
        error_log(json_encode($param).PHP_EOL, 3, ROOT_PATH.'/task_test.log');

        // 能够 return 值就是调用后果值,如果是设置了回调告诉地址,就会发送过来
        return $param;
    }
}

如果你没有开启热重载,就须要先重启服务端,能力进行调试。

再而后,批改 TP 默认控制器代码/app/index/controller/Index.php,为如下代码:

<?php
namespace app\index\controller;
use think\Controller;

class Index extends Controller{public function index() {
        // 调用微服务客户端
        $Rpc = new \SwooleXRpc\RpcClient();
        // 申请 RPC 服务
        $body = $Rpc->route('order/task') // 路由地址
        ->func('run') // 办法
        ->param([ // 申请参数
            'longitude' => '113.383523',
            'latitude' => '23.131044'
        ])
        ->header(array()) // 申请头
        ->max(3) // 当 RPC 申请失败时,最多递归几个服务节点直至胜利为止,默认 1
        ->task() // 投递异步工作池
        ->callback('http:// 你的 TP 测试地址 /index.php/callback/index', 'post') // 异步工作能够设置回调告诉,如果不须要回调告诉,能够不设置
        ->send(); // 发送申请

        // 后果集
        dump($body);
        // 状态码 == 200 == 胜利
        dump($Rpc->getStatus());
        // 谬误起因
        dump($Rpc->getMsg());
    }
}

创立一个 /app/index/controller/Callback.php 控制器,用于记录异步解决回调告诉后果:

<?php
namespace app\index\controller;
use think\Controller;

class Callback extends Controller{
    // 测试 - 记录异步服务调用回调告诉
    public function index() {$param = \think\facade\Request::param();
        error_log(json_encode($param).PHP_EOL, 3, 'task_test.log');
    }
}

之后,就能够在浏览器拜访 TP 的 index/index 控制器进行测试了,调用实现后别离查看两个 task_test.log 文件的记录后果。

更多的客户端反对,能够在 SW- X 官网中进行查看:https://www.sw-x.cn/word/v2.5…

退出移动版