经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » PHP » 查看文章
Swoole RPC 的实现 - it-world
来源:cnblogs  作者:it-world  时间:2019/11/7 20:45:36  对本文有异议

开始今天的文章吧,这篇文章实现了一个简单的 RPC 远程调用,在实现之前需要先了解什么是 RPC,不清楚的可以看下之前发的这篇文章 《我眼中的 RPC》。

下面的演示代码主要使用了 Swoole 的 Task 任务池,通过 OnRequest/OnReceive 获得信息交给 Task 去处理。

举个工作中的例子吧,在电商系统中的两个模块,个人中心模块和订单管理模块,这两个模块是独立部署的,可能不在一个机房,可能不是一个域名,现在个人中心需要通过 用户ID 和 订单类型 获取订单数据。
实现效果
客户端

  1. HTTP 请求
  2.  
  3. //代码片段
  4. <?php
  5. $demo = [
  6. 'type' => 'SW',
  7. 'token' => 'Bb1R3YLipbkTp5p0',
  8. 'param' => [
  9. 'class' => 'Order',
  10. 'method' => 'get_list',
  11. 'param' => [
  12. 'uid' => 1,
  13. 'type' => 2,
  14. ],
  15. ],
  16. ];
  17. $ch = curl_init();
  18. $options = [
  19. CURLOPT_URL => 'http://10.211.55.4:9509/',
  20. CURLOPT_POST => 1,
  21. CURLOPT_POSTFIELDS => json_encode($demo),
  22. ];
  23. curl_setopt_array($ch, $options);
  24. curl_exec($ch);
  25. curl_close($ch);
  26.  
  27.  
  28. TCP 请求
  29.  
  30. //代码片段
  31. $demo = [
  32. 'type' => 'SW',
  33. 'token' => 'Bb1R3YLipbkTp5p0',
  34. 'param' => [
  35. 'class' => 'Order',
  36. 'method' => 'get_list',
  37. 'param' => [
  38. 'uid' => 1,
  39. 'type' => 2,
  40. ],
  41. ],
  42. ];
  43. $this->client->send(json_encode($demo));

 


请求方式

    SW 单个请求,等待结果

发出请求后,分配给 Task ,并等待 Task 执行完成后,再返回。

    SN 单个请求,不等待结果

发出请求后,分配给 Task 之后,就直接返回。
发送数据

 

  1. $demo = [
  2. 'type' => 'SW',
  3. 'token' => 'Bb1R3YLipbkTp5p0',
  4. 'param' => [
  5. 'class' => 'Order',
  6. 'method' => 'get_list',
  7. 'param' => [
  8. 'uid' => 1,
  9. 'type' => 2,
  10. ],
  11. ],
  12. ];

 


    type 同步/异步设置

    token 可进行权限验证

    class 请求的类名

    method 请求的方法名

    uid 参数一

    type 参数二

返回数据

640?wx_fmt=png

    request_method 请求方式

    request_time 请求开始时间

    response_time 请求结束时间

    code 标识

    msg 标识值

    data 约定数据

    query 请求参数

  1. 代码
  2. OnRequest.php
  3.  
  4. <?php
  5. if (!defined('SERVER_PATH')) exit("No Access");
  6. class OnRequest
  7. {
  8. private static $query;
  9. private static $code;
  10. private static $msg;
  11. private static $data;
  12. public static function run($serv, $request, $response)
  13. {
  14. try {
  15. $data = decrypt($request->rawContent());
  16. self::$query = $data;
  17. if (empty($data)) {
  18. self::$code = '-1';
  19. self::$msg = '非法请求';
  20. self::end($request, $response);
  21. }
  22. //TODO 验证Token
  23. switch ($data['type']) {
  24. case 'SW': //单个请求,等待结果
  25. $task = [
  26. 'request' => $data,
  27. 'server' => 'http'
  28. ];
  29. $rs = $serv->task(json_encode($task), -1, function ($serv, $task_id, $rs_data) use ($request, $response) {
  30. self::$code = '1';
  31. self::$msg = '成功';
  32. self::$data = $rs_data['response'];
  33. self::end($request, $response);
  34. });
  35. if ($rs === false) {
  36. self::$code = '-1';
  37. self::$msg = '失败';
  38. self::end($request, $response);
  39. }
  40. break;
  41. case 'SN': //单个请求,不等待结果
  42. $task = [
  43. 'request' => $data,
  44. 'server' => 'http'
  45. ];
  46. $rs = $serv->task(json_encode($task));
  47. if ($rs === false) {
  48. self::$code = '-1';
  49. self::$msg = '失败';
  50. } else {
  51. self::$code = '1';
  52. self::$msg = '成功';
  53. }
  54. self::end($request, $response);
  55. break;
  56. default:
  57. self::$code = '-1';
  58. self::$msg = '非法请求';
  59. self::end($request, $response);
  60. }
  61. } catch(Exception $e) {
  62. }
  63. }
  64. private static function end($request = null, $response = null)
  65. {
  66. $rs['request_method'] = $request->server['request_method'];
  67. $rs['request_time'] = $request->server['request_time'];
  68. $rs['response_time'] = time();
  69. $rs['code'] = self::$code;
  70. $rs['msg'] = self::$msg;
  71. $rs['data'] = self::$data;
  72. $rs['query'] = self::$query;
  73. $response->end(json_encode($rs));
  74. self::$data = [];
  75. return;
  76. }
  77. }

 



  1. OnReceive.php
  2.  
  3. <?php
  4. if (!defined('SERVER_PATH')) exit("No Access");
  5. class OnReceive
  6. {
  7. private static $request_time;
  8. private static $query;
  9. private static $code;
  10. private static $msg;
  11. private static $data;
  12. public static function run($serv, $fd, $reactor_id, $data)
  13. {
  14. try {
  15. self::$request_time = time();
  16. $data = decrypt($data);
  17. self::$query = $data;
  18. //TODO 验证Token
  19. switch ($data['type']) {
  20. case 'SW': //单个请求,等待结果
  21. $task = [
  22. 'fd' => $fd,
  23. 'request' => $data,
  24. 'server' => 'tcp',
  25. 'request_time' => self::$request_time,
  26. ];
  27. $rs = $serv->task(json_encode($task));
  28. if ($rs === false) {
  29. self::$code = '-1';
  30. self::$msg = '失败';
  31. self::handlerTask($serv, $fd);
  32. }
  33. break;
  34. case 'SN': //单个请求,不等待结果
  35. $task = [
  36. 'fd' => $fd,
  37. 'request' => $data,
  38. 'server' => 'tcp',
  39. 'request_time' => self::$request_time,
  40. ];
  41. $rs = $serv->task(json_encode($task));
  42. if ($rs === false) {
  43. self::$code = '-1';
  44. self::$msg = '失败';
  45. } else {
  46. self::$code = '1';
  47. self::$msg = '成功';
  48. }
  49. self::handlerTask($serv, $fd);
  50. break;
  51. default:
  52. self::$code = '-1';
  53. self::$msg = '非法请求';
  54. self::handlerTask($serv, $fd);
  55. }
  56. } catch(Exception $e) {
  57. }
  58. }
  59. private static function handlerTask($serv, $fd)
  60. {
  61. $rs['request_method'] = 'TCP';
  62. $rs['request_time'] = self::$request_time;
  63. $rs['response_time'] = time();
  64. $rs['code'] = self::$code;
  65. $rs['msg'] = self::$msg;
  66. $rs['data'] = self::$data;
  67. $rs['query'] = self::$query;
  68. $serv->send($fd, json_encode($rs));
  69. }
  70. }

 

原文链接:http://www.cnblogs.com/it-3327/p/11812745.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号