白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述PHP 基于 SW-X 框架,搭建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.x/client_rpc_assembly.html#a14
根据项目的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());
【PHP 基于 SW-X 框架,搭建RPC微服务支持】创建一个?
?/app/index/controller/Callback.php?
?控制器,用于记录异步处理回调通知结果:< ?php
namespace app\\index\\controller;
use think\\Controller;
class Callback extends推荐阅读
- nginx编译安装脚本 | 端口检测
- zabbix5.0版本部署
- Win10网页打不开提示DNS_PROBE_POSSIBLE错误解决
- Vue 开发之插槽(slot)的理解和使用
- LibreOffice 支持无障碍辅助的 5 种方式
- Docker网络与资源控制
- Rsync+Crond实现定时备份介绍#yyds干货盘点#
- prometheus中pushgateway方式收集数据
- Windows10 系统安装微软商店(ms-windows-store)