当前位置: 首页 > 后端技术 > PHP

SwooleRPC的实现

时间:2023-03-29 21:18:16 PHP

概述这是Swoole学习的第七篇:SwooleRPC的实现。Part6:Swoole集成成一个小框架Part5:Swoole多协议多端口的应用Part4:SwooleHTTP的应用Part3:SwooleWebSocket的应用Part2:SwooleTask的应用Part1:Swoole阅读器Timer的应用负责人表示,“上一篇文章下载代码后,直接运行成功,代码简洁明了,简直是Swoole入门最好的Demo。”“哈哈哈……”有读者说,“有没有一起学习的组织群,可以答疑解惑的?”真的没有这样的东西。总觉得维持一个微信群不容易,因为我不喜欢待在群里。另外,我也在很多微信群里。起初,气氛非常好。每个人都在谈论技术。后来技术聊的少了,改成了八卦。然后就渐渐安静下来了,群里也有冲突……当然,我也知道,维持一个微信群的好处是非常大的。有这方面经验的同学一起交流吧~也有出版社找我出书的。他们真的是松了口气,我肚子里的那几滴墨汁我还是知道的,但现在肯定做不到,以后再说吧。也有一些大佬加了微信,大概是出于对后辈的支持,偷偷告诉你大佬的朋友圈可以学到很多东西。我真诚的建议,做技术的还是自己多总结,把自己知道的写出来分享给大家,不要给别人带来太多的价值,反正对自己会有很大很大的帮助。想要交流的同学可以加我,我可以无私分享给大家。可谓是时间不多了,只要挤时间,总会有时间的。每个人都有24小时,时间对每个人来说都是最公平的。说到这里,推荐大家看看《暗时间》这本书。这些是我对这本书的阅读笔记。你可以看看。让我们开始今天的文章。本文实现了一个简单的RPC远程调用。在实现它之前,您需要了解什么是RPC。如果您不确定,可以阅读这篇文章《我眼中的 RPC》。下面的demo代码主要使用了Swoole的Task任务池,通过OnRequest/OnReceive获取信息交给Task处理。举个工作中的例子。电子商务系统中有两个模块,个人中心模块和订单管理模块。这两个模块是独立部署的。他们可能不在同一个机房??或一个域名。现在个人中心需要通过UserID和订单类型来获取订单数据。实现效果客户端HTTP请求//代码片段'SW','token'=>'Bb1R3YLipbkTp5p0','param'=>['class'=>'Order','method'=>'get_list','param'=>['uid'=>1,'type'=>2,],],];$ch=curl_init();$options=[CURLOPT_URL=>'http://10.211.55.4:9509/',CURLOPT_POST=>1,CURLOPT_POSTFIELDS=>json_encode($demo),];curl_setopt_array($ch,$options);curl_exec($ch);curl_close($ch);TCP请求//代码片段$demo=['type'=>'SW','token'=>'Bb1R3YLipbkTp5p0','param'=>['class'=>'Order','method'=>'get_list','param'=>['uid'=>1,'type'=>2,],],];$this->client->send(json_encode($demo));请求方式SW单次请求,等待请求结果后分配给Task,等待Task完成后再返回。SN是一个单一的请求。请求发出后不等待结果,分配给Task后直接返回。发送数据$demo=['type'=>'SW','token'=>'Bb1R3YLipbkTp5p0','param'=>['class'=>'Order','method'=>'get_list','param'=>['uid'=>1,'type'=>2,],],];type同步/异步设置token可进行权限验证类请求类名方法请求方法名uid参数-type参数返回数据request_method请求方法request_time请求开始时间response_time请求结束时间类OnRequest{私有静态$query;私人静态$代码;私人静态$味精;私人静态$数据;publicstaticfunctionrun($serv,$request,$response){try{$data=decrypt($request->rawContent());}自我::$查询=$数据;如果(empty($data)){self::$code='-1';self::$msg='非法请求';自我::结束($请求,$响应);}//TODO验证Tokenswitch($data['type']){case'SW'://单次请求,等待结果$task=['request'=>$data,'server'=>'http'];$rs=$serv->task(json_encode($task),-1,函数($serv,$task_id,$rs_data)使用($request,$response){self::$code='1';self::$msg='success';self::$data=$rs_data['response'];self::end($request,$response);});如果($rs===false){self::$code='-1';self::$msg='失败';自我::结束($请求,$响应);}休息;case'SN'://单次请求,不等待结果$task=['request'=>$data,'server'=>'http'];$rs=$serv->task(json_encode($task));如果($rs===false){self::$code='-1';self::$msg='失败';}else{self::$code='1';self::$msg='成功';}self::end($request,$response);休息;默认值:self::$code='-1';self::$msg='非法请求';自我::结束($请求,$响应);}}catch(Exception$e){}}privatestaticfunctionend($request=null,$response=null){$rs['request_method']=$request->server['request_method'];$rs['request_time']=$request->server['request_time'];$rs['response_time']=time();$rs['code']=self::$code;$rs['msg']=self::$msg;$rs['数据']=self::$data;$rs['query']=self::$query;$response->end(json_encode($rs));自我::$数据=[];返回;}}OnReceive.php$fd,'request'=>$data,'server'=>'tcp','request_time'=>self::$request_time,];$rs=$serv->task(json_encode($task));如果($rs===false){self::$code='-1';self::$msg='失败';self::handlerTask($serv,$fd);}休息;case'SN'://单次请求,不等待结果$task=['fd'=>$fd,'request'=>$data,'server'=>'tcp','request_time'=>self::$请求时间,];$rs=$serv->task(json_encode($task));如果($rs===false){self::$code='-1';self::$msg='失败';}else{self::$code='1';self::$msg='成功';}self::handlerTask($serv,$fd);休息;默认值:self::$code='-1';self::$msg='非法请求';self::handlerTask($serv,$fd);}}catch(Exception$e){}}privatestaticfunctionhandlerTask($serv,$fd){$rs['request_method']='TCP';$rs['request_time']=self::$request_time;$rs['response_time']=时间();$rs['code']=self::$code;$rs['msg']=self::$msg;$rs['数据']=self::$data;$rs['query']=self::$query;$serv->send($fd,json_encode($rs));}}总结Demo代码仅供参考,有很多不严谨的地方!在调用者和服务提供者之间需要有一个服务注册中心。显然,上面的代码中并没有服务注册中心。您需要自己实现服务注册中心。它负责管理IP和Port信息并提供给调用者。它还需要能够负载平衡和故障转移。根据自己的情况,服务注册中心的实现可简单可复杂,可以使用Redis、Zookeeper或Consul。有兴趣的也可以了解一下网关Kong,包括身份认证、权限认证、流量控制、监控预警……推荐一个支持多国语言的SwooleRPC框架Hprose。就是这样,如果需要上面demo的源码,加我微信。(菜单->加我微信->扫一扫)推荐阅读系统详解-SSO单点登录系统详解-PHPWEB安全防御系统详解-PHP缓存技术系统详解-PHP接口签名验证系统详解-PHP浮点高-精准操作一起学习