Dora-RPC, DoraRPC是一个用Swoole的PHP MicroService的RPC

分享于 

11分钟阅读

GitHub

  繁體 雙語
DoraRPC is an RPC Base on PHP Swoole Extension
  • 源代码名称:Dora-RPC
  • 源代码网址:http://www.github.com/xcl3721/Dora-RPC
  • Dora-RPC源代码文档
  • Dora-RPC源代码下载
  • Git URL:
    git://www.github.com/xcl3721/Dora-RPC.git
    Git Clone代码到本地:
    git clone http://www.github.com/xcl3721/Dora-RPC
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/xcl3721/Dora-RPC
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    Dora

    Build StatusLatest Stable VersionLatest Unstable VersionLicense

    简介( 介绍)

    问题提交:问题

    对于复杂项目分离,可以通过API项目管理来更好地维护项目。

    • Dora是一个基本的Swoole固定 header Proctol RPC
    • 现在支持一个简单的PHP版本
    • 如果发现错误,请提交问题
    • 为其他程序语言添加http协议和 KeepAlive
    设计思路( 设计) 功能支持( 函数)
    • 单一 API RPC多API并发 RPC
    • Asynchronous,synchronization不需要通过手动获取result,同步结果
    • 请访问Swoole官方了解详情
    • 在请求完成后保持客户端的连接
    • 发送 <-> recive时检查 guid
    • 服务发现。
    • 基于Redis的高可用服务发现

    请安装依赖( 依赖)

    • Swoole 1.8.x +
    • PHP 5.4 +
    • 用于压缩包的zlib

    ##Installation

    
    composer require"xcl3721/dora-rpc"
    
    
    
    

    文件功能简介( 文件)

    dora-rpc/src/Client.php

    • 简单的客户机,简单而简单的实现多假线程,你可以通过这个分发RPC来加速 API。

    dora-rpc/src/BackEndServer.php

    • 返回结果是一个数组分两部分,第一层是通讯状态code,第二层是处理状态代码
    • 强大的API服务器
    • 你必须扩展swserver并实现dowork函数
    • 它用于减少开发周期。
    • 当你设置时,服务器将将这里服务器 register 设置为服务发现。
    • 结果是两个级别arrayFirst正在通信状态'代码字段',第二个是dowork状态

    dora-rpc/src/Monitor.php

    • 发现控制器客户端 that:scan 所有redis并获取可用的服务和通用配置文件的列表到特殊路径

    dora-rpc/src/groupclient.php ( 结合到 client.php )

    • 服务发现(monitor客户端一般配置来自redis)的配置,你可以直接使用配置

    使用方法( 示例)

    任务下发模式介绍( 任务部署模式)

    TCP客户端( TCP客户端)

    $config=include("client.conf.php");//define the mode$mode=array("type"=>1, "group"=>"group1");$maxrequest=0;//new obj$obj=newDoraRPCClient($config);//change connect mode$obj->changeMode($mode);for ($i=0; $i<10000; $i++) {//echo $i. PHP_EOL;//single$time=microtime(true);//single && sync$ret=$obj->singleAPI("/module_a/abc".$i, array("mark"=>234, "foo"=>$i), DoraRPCDoraConst::SW_MODE_WAITRESULT, 1);var_dump("single sync", $ret);//single call && async$ret=$obj->singleAPI("/module_b/abc".$i, array("yes"=>21321, "foo"=>$i), DoraRPCDoraConst::SW_MODE_NORESULT, 1);var_dump("single async", $ret);//single call && async$ret=$obj->singleAPI("/module_c/abd".$i, array("yes"=>233, "foo"=>$i), DoraRPCDoraConst::SW_MODE_ASYNCRESULT, 1);var_dump("single async result", $ret);//multi//multi && sync$data=array("oak"=>array("name"=>"/module_c/dd".$i, "param"=>array("uid"=>"ff")),"cd"=>array("name"=>"/module_f/ef".$i, "param"=>array("pathid"=>"fds")), );$ret=$obj->multiAPI($data, DoraRPCDoraConst::SW_MODE_WAITRESULT, 1);var_dump("multi sync", $ret);//multi && async$data=array("oak"=>array("name"=>"/module_d/oakdf".$i, "param"=>array("dsaf"=>"32111321")),"cd"=>array("name"=>"/module_e/oakdfff".$i, "param"=>array("codo"=>"f11ds")), );$ret=$obj->multiAPI($data, DoraRPCDoraConst::SW_MODE_NORESULT, 1);var_dump("multi async", $ret);//multi && async$data=array("oak"=>array("name"=>"/module_a/oakdf".$i, "param"=>array("dsaf"=>"11")),"cd"=>array("name"=>"/module_b/oakdfff".$i, "param"=>array("codo"=>"f11ds")), );$ret=$obj->multiAPI($data, DoraRPCDoraConst::SW_MODE_ASYNCRESULT, 1);var_dump("multi async result", $ret);//get all the async result$data=$obj->getAsyncData();var_dump("allresult", $data);//compare each request$time=bcsub(microtime(true), $time, 5);if ($time>$maxrequest) {$maxrequest=$time; }echo$i." cost:".$time.PHP_EOL;}echo"max:".$maxrequest.PHP_EOL;

    HTTP客户端( Http客户端)

    用于它的他语言的http协议使用性能 common.suggest 使用tcp客户端

    for ($i=0; $i<10000; $i++) {$time=microtime(true);//mutil call sync wait result$data=array("guid"=>md5(mt_rand(1000000, 9999999) .mt_rand(1000000, 9999999) .microtime(true)),"api"=>array("oak"=>array("name"=>"/module_d/oakdf", "param"=>array("dsaf"=>"32111321")),"cd"=>array("name"=>"/module_e/oakdfff", "param"=>array("codo"=>"f11ds")), ),  );$data_string="params=".urlencode(json_encode($data));$ch=curl_init('http://127.0.0.1:9566/api/multisync');curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Keep-Alive','Keep-Alive: 300', ) );$result=curl_exec($ch);var_dump(json_decode($result, true));//multi call no wait result$data=array("guid"=>md5(mt_rand(1000000, 9999999) .mt_rand(1000000, 9999999) .microtime(true)),"api"=>array("oak"=>array("name"=>"/module_d/oakdf", "param"=>array("dsaf"=>"32111321")),"cd"=>array("name"=>"/module_e/oakdfff", "param"=>array("codo"=>"f11ds")), ),  );$data_string="params=".urlencode(json_encode($data));$ch=curl_init('http://127.0.0.1:9566/api/multinoresult');curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Keep-Alive','Keep-Alive: 300', ) );$result=curl_exec($ch);var_dump(json_decode($result, true));$time=bcsub(microtime(true), $time, 5);if ($time>$maxrequest) {$maxrequest=$time; }echo$i." cost:".$time.PHP_EOL;//var_dump($ret);}echo"max:".$maxrequest.PHP_EOL;

    服务端( 服务器)

    classServerextendsDoraRPCServer {//all of this config for optimize performance//以下配置为优化服务性能用,请实际压测调试protected$externalConfig=array(//to improve the accept performance, suggest the number of cpu X 2//如果想提高请求接收能力,更改这个,推荐cpu个数x2'reactor_num'=>32,//packet decode process,change by condition//包处理进程,根据情况调整数量'worker_num'=>40,//the number of task logical process progcessor run you business code//实际业务处理进程,根据需要进行调整'task_worker_num'=>20, );functioninitServer($server){//the callback of the server init 附加服务初始化//such as swoole atomic table or buffer 可以放置swoole的计数器,table等 }functiondoWork($param){//process you logical 业务实际处理代码仍这里//return the result 使用return返回处理结果returnarray("hehe"=>"ohyes"); }functioninitTask($server, $worker_id){//require_once() 你要加载的处理方法函数等 what's you want load (such as framework init) }}$res=newServer();

    ###客户端监控器(Client 本地监视器)

    include"src/Doraconst.php";include"src/Packet.php";include"src/Monitor.php";//redis for service discovery register//when you on product env please prepare more redis to registe service for high available$redisconfig=array(array(//first reporter"ip"=>"127.0.0.1","port"=>"6379", ),array(//next reporter"ip"=>"127.0.0.1","port"=>"6379", ),);//ok start server$res=newDoraRPCMonitor("0.0.0.0", 9569, $redisconfig, "./client.conf.php");//this server will auto get the node server list from redis and general the client config on special path

    • php democlient.php
    • php demoserver.php

    错误码及含义( 错误代码)

    • 0 成功工作
    • 100001异步任务成功
    • 100002未知任务类型
    • 100003你必须在请求时填充api参数
    • 100005签名检查错误
    • 100006包解码类型错误
    • 100007套接字错误recive数据包长度错误
    • 100008返回guid错误可以能是套接字trasfer错误数据
    • 100009 recive错误或者超时
    • 100010没有服务器可以连接
    • 100011未知控制器的cmd
    • 100012获取异步结果失败: 客户端已经关闭。
    • 100099未知的通信模式已经设置
    • 100100 guid wront请重试。

    性能( 性能)

    • 英特尔I7英特尔 2.2 Mhz
    • 具有虚拟机 1内核的Vagrant
    • 1G内存
    • 使用示例代码( 循环永远)

    测试结果Result

    • 网络成本:每秒0 002~0.004/秒
    • CPU 10 ~25% 以上还有很大优化空间还有很多优化空间

    
    vim demoserver.php
    
    
    to see $externalConfig var
    
    
    and swoole offcial document
    
    
    
    如果想优化性能请参考以上文件的$externalConfig配置
    
    
    
    

    服务器配置优化

    Apache

    QQ群

    QQ Group:346840633


    PHP  micr  RPC  
    相关文章