前言官网地址:SW-X框架-PHP-SwooleX框架,专注于高性能便捷开发。希望大家举手给小弟一个star:https://github.com/swoolex/swoolex场景1在FPM项目中,在很多业务情况下是比较无奈的,比如某业务需要发简讯。通常这种服务应该不会影响接口的执行结果,也不会影响执行效率(CURL被屏蔽到后面的业务代码),不管短信是否发送成功。以往在这种情况下,发送短信一般是作为一个任务,投递到某种消息队列中,然后在php-cli下使用多进程模式,设置一个独立的进程进行后台消费和执行。由于PHP进程模型的影响,如果FPM进程被阻塞,可能会直接挂掉队列。同时这种方式性能消耗严重,不方便日常维护。场景二:如果逻辑允许异步执行,FPM下还有优化空间。需要同步执行的代码呢?比如需要调用百度地图的经纬度分析接口,需要等待请求结果才能继续。假设我们有一个项目,有7个接口需要用到这个接口,一般是基于框架,封装成一个扩展类,或者一个公共函数来调用。但是当公司业务扩大时,可能会出现不同的业务线,但是不同业务使用的语言和框架不一定一致(并不是所有的公司都喜欢能够实现多应用架构的框架)。这时候不能使用扩展封装的方式,因为我们可能会为每个应用程序复制无数份相同的代码。在百度地图界面升级的时候,我们可能会漏掉某个没有升级的应用下的代码。结果,出现业务错误和不可估量的损失。场景三如果第三方接口也可以让COPY封装扩展到多个应用,那么就没有办法对通用的业务逻辑组件进行封装了。比如会员注册。项目刚开始的时候,我们可能需要注册会员才能下单。突然,有一天公司的业务做大了,需要开发一个渠道API,让渠道商部署平台,同时也有会员注册的功能。后来公司发现用二维码直接下单营销会更方便,所以有必要支持下单时用户直接注册。之后又创建了一堆后台会员,创建了电话订单,在积分兑换商城创建了会员等等。从一个会员注册模式,一下子变成了N个应用的会员注册。这时候单个应用的Model包已经不能承载业务了。SW-X的微服务SW-X的微服务都是为应对上述场景而生。底层使用TCP通信协议,支持基于AES的数据加解密支持。官方提供了Swoole/FPM下的RPC客户端。还提供了一个纯基于Redis存储管理的RPC服务中心,可以通过WEB界面对服务进行日常管理。微服务的部署条件1、需要先安装Redis服务,需要PHP-Redis扩展。2、需要准备两个端口和两个SW-X框架源码,因为服务中心(http)和微服务服务器(rpc)是不同的服务端口,需要分别启动。准备数据,先将Redis改成6379端口(默认),密码改成123456,安全组开放9501端口,用于搭建微服务-服务中心。安全组开放9502端口用于构建microservice-server。部署微服务-服务中心1、将SW-X框架源码解压(pull)到swoole_web/目录下,具体地址也可以改成自己测试。2、修改/config/server.php文件下的port端口为95013,修改/config/rpc.php文件下的http_rpc_is参数为true,表示当前HTTP服务为RPC服务中心应用。同时这个文件下的http_rpc_user_list参数是服务中心的账号配置,默认的超级账号密码是:swoolex。4、打开shell界面,执行如下代码:#进入目录cd/www/wwwroot/swoole_web/#安装服务中心-web组件phpsw-xrpcstart如果安装成功,则路由地址对应servicecenter会输出,然后在shell界面,继续输入:#启动HTTP服务,后台运行phpsw-xstarthttp-d。完成后即可在浏览器中打开IP地址:9501/HttpRpc/login访问微服务-服务中心登录地址。具体UI如下图所示:部署microservice-server1.将SW-X框架源码解压(pull)到swoole_rpc/目录下,具体地址也可以改成自己测试。2、修改/config/server.php文件下的port端口为95023,打开shell界面,执行以下代码:#进入目录cd/www/wwwroot/swoole_rpc/#启动RPC服务【运行在后台不返回]phpsw-x启动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.在AddService下,我们新建一个order/test->run服务,这是一个表示的服务,该服务调用/app/rpc/order/test.php控制器下的run()方法。具体过程如下图所示:然后在swoole_rpc/server端,创建/app/rpc/order/test.php文件,写入如下代码:runservicepublicfunctionrun(){//可以这样获取请求头$headers=$this->标题();//可以这样获取请求参数$param=$this->param();//返回值为调用结果值return$param;}}如果不启用hotreload,调试前需要重启服务器,服务中心调试结果如下:4.FPM安装微服务客户端打开官网:https://www.sw-x.cn/word/v2.5...根据项目的PHP版本,下载对应的FPM客户端扩展包,解压到应用的/extend/custom扩展应用目录下(无论是TP还是La会有这种支持)。下面以ThinkPHP5.1项目为例,下载PHP5.3+版本的客户端包。解压后修改/SwooleXRpc/config/rpc.php文件,主要是修改里面的配置参数与微服务服务中心的/config/rpc.php和/config/redis.php配置保持一致。然后修改TP默认控制器代码/app/index/controller/Index.php为如下代码:route('order/test')//路由地址->func('run')//方法->param([//请求参数'longitude'=>'113.383523','latitude'=>'23.131044'])->header(array())//请求头->max(3)//当RPC请求失败时,最多递归几个服务节点,直到成功,default1//->task()//是否发送异步任务池//->callback('http://baidu.com','post')//异步任务可以设置回调notification->send();//发送请求//结果集dump($body);//状态码==200==成功dump($Rpc->getStatus());//错误原因dump($Rpc->getMsg());}}最后访问controller查看调用结果。5、异步下发调用SW-X的微服务被客户端调用时,可以将服务请求下发到异步任务池中,当前请求会返回true,表示任务下发成功。发送成功的任务会从Swoole的onReceive事件转发到onTask事件进行处理。在服务中心添加如下服务,用于测试异步调用:然后在swoole_rpc/server端创建/app/rpc/order/task.php文件,写入如下代码:runservicepublicfunctionrun(){//可以这样获取请求参数$param=$this->参数();//记录日志看服务调用是否成功error_log(json_encode($param).PHP_EOL,3,ROOT_PATH.'/task_test.log');//返回值为调用结果值,如果设置了回调通知地址将发送到return$param;}}如果没有开启hotreload,调试前需要重启服务器。然后,修改TP默认控制器代码/app/index/controller/Index.php为如下代码:调用微服务客户端$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.phpcontroller用于记录异步处理回调通知结果:
