首页 > 作文

Swoole RPC 的实现

更新时间:2023-04-06 07:33:35 阅读: 评论:0

目录

概述

这是关于 swoole 学习的第七篇文章:swoole rpc 的实现。

第六篇:swoole 整合成一个小框架第五篇:swoole 多协议 多端口 的应用第四篇:swoole http 的应用第三篇:swoole websocket 的应用第二篇:swoole task 的应用第一篇:swoole timer 的应用

有位读者说 “上篇文章,下载代码后直接运行成功,代码简洁明了,简直是 swoole 入门最好的 demo ”。

“哈哈哈…”

还有读者说 “有一起学习的组织群吗,可以在里面进行疑难答疑?”

这个还真没有,总觉得维护一个微信群不容易,因为自己本身就不爱在群里说话,另外,自己也在很多微信群中,开始氛围挺好的,大家都聊聊技术,后来技术聊的少了改成聊八卦啦,再后来慢慢就安静了,还有在群里起冲突的…

当然我也知道维护一个微信群的好处是非常大的,如果有这方面经验的同学,咱们一起交流交流 ~

还有出版社找我写书的.

他们也真是放心,我自己肚子里几滴墨水还是知道的,目前肯定是不行,以后嘛,再说。

还有一些大佬加了微信,可能是出于对晚辈的提携吧,偷偷告诉你,从大佬的朋友圈能学到很多东西。

我真诚的建议,做技术的应该自己多总结总结,将自己会的东西写出来分享给大家,先不说给别人带来太多的价值,反正对自己的帮助是非常非常大的,这方面想交流的同学,可以加我,我可以给你无私分享。

可能都会说时间少,时间只要挤,总会有的,每个人都 24 小时,时间对每个人是最公平的。说到这推荐大家读一下《暗时间》这本书,这是我这本书的 读书笔记,大家可以瞅瞅。

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

下面的演示代码主要使用了 swoole 的 task 任务池,通过 onrequest/onreceive 获得信息交给 task 去处理。

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

实现效果

客户端

http 请求
//代码片段<?php$demo = [圆心距    'type'  => '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_topt_array($撤诉申请书范本ch, $options);curl_exec($ch);curl_clo($ch);
tcp 请求
//代码片段$demo = [    'type'  => 'sw',    'token' => 'bb1r3ylipbktp5p0',    'param' => [        'class'  => 'order',        'method' => 'get_list',        'param' => [            'uid'  => 1,            'type' => 2,        ],    ],];$this->client->nd(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 可进行权限验证class 请求的类名method 请求的方法名uid 参数一type 参数二

返回数据

request_method 请求方式request_time 请求开始时间respon_time 请求结束时间code 标识msg 标识值data 约定数据query 请求参数

代码

onrequest.php

<?phpif (!defined('rver_path')) exit("no access");class onrequest{    private static $query;    private static $code;    private static $msg;    private static $data;    public static function run($rv, $request, $respon)    {        try {            $data = decrypt($request->rawcontent());            lf::$query   = $data;            if (empty($data)) {                lf::$code = '-1';                lf::$msg  = '非法请求';                lf::end($request, $respon);            }            //todo 验证token            switch ($data['type']) {                ca 'sw': //单个请求,等待结果                    $task = [                        'request' => $data,                        'rver'  => 'http'                    ];                    $rs = $rv->task(json_encode($task), -1, function ($rv, $task_id, $rs_data) u ($request, $respon) {                        lf::$code = '1';                        lf::$msg  = '成功';                        lf::$data = $rs_data['respon'];                        lf::end($request, $respon);                    });                    if ($rs === fal) {                        lf::$code = '-1';                        lf::$msg  = '失败';                        lf::end($request, $respon);                    }                    break;                ca 'sn': //单个请求,不等待结果                    $task = [                        'request' => $data,                        'rver'  => 'http'                    ];                   平凡的世界摘抄 $rs = $rv->task(json_encode($task));                    if ($rs === fal) {                        lf::$code = '-1';                        lf::$msg  = '失败';                    } el {                        lf::$code = '1';                        lf::$msg  = '成功';                    }                    lf::end($request, $respon);                    break;                default:                    lf::$code = '-1';                    lf::$msg  = '非法请求';                    lf::end($request, $respon);            }        } catch(exception $e) {        }    }    private static function end($request = null, $respon = null)    {        $rs['request_method'] = $request->rver['request_method'];        $rs['request_time']   = $request->rver['request_time'];        $rs['respon_time']  = time();        $rs['code']           = lf::$code;        $rs['msg']            = lf::$msg;        $rs['data']           = lf::$data;        $rs['query']          = lf::$query;        $respon->end(json_encode($rs));        lf::$data = [];        return;    }}

onreceive.php

<?phpif (!defined('rver_path')) exit("no access");class onreceive{    private static $request_time;    private static $query;    private static $code;    private static $msg;    private static $data;    public static function run($rv, $f精彩一瞬间d, $reactor_id, $data)    {        try {            lf::$request_time = time();            $data = decrypt($data);            lf::$query = $data;            //todo 验证token                        switch ($data['type']) {                ca 'sw': //单个请求,等待结果                    $task = [                        'fd'           => $fd,                        'request'      => $data,                        'rver'       => 'tcp',                        'request_time' => lf::$request_time,                    ];                    $rs = $rv->task(json_encode($task));                    if ($rs === fal) {                        lf::$code = '-1';                        lf::$msg  = '失败';                        lf::handlertask($rv, $fd);                    }                    break;                ca 'sn': //单个请求,不等待结果                    $task = [                        'fd'           => $fd,                        'request'      => $data,                        'rver'       => 'tcp',                        'request_time' => lf::$request_time,                    ];                    $rs = $rv->task(json_encode($task));                    if ($rs === fal) {                        lf::$code = '-1';                        lf::$msg  = '失败';                    } el {                        lf::$code = '1';                        lf::$msg  = '成功';                    }                    lf::handlertask($rv, $fd);                    break;                default:                    lf::$code = '-1';                    lf::$msg  = '非法请求';                    lf::handlertask($rv, $fd);            }        } catch(exception $e) {        }    }    private static function handlertask($rv, $fd)    {        $rs['request_method'] = 'tcp';        $rs['request_time']   = lf::$request_time;        $rs['respon_time']  = time();        $rs['code']           = lf::$code;        $rs['msg']            = lf::$msg;        $rs['data']           = lf::$data;        $rs['query']          = l弟弟英文f::$query;        $rv->nd($fd, json_encode($rs));    }}

小结

demo 代码仅供参考,里面有很多不严谨的地方!

服务的调用方与提供方中间需要有一个服务注册中心,很显然上面的代码中没有,需要自己去实现。

服务注册中心,负责管理 ip、port 信息,提供给调用方使用,还要能负载均衡和故障切换。

根据自己的情况,服务注册中心实现可容易可复杂,用 redis 也行,用 zookeeper、consul 也行。

感兴趣的也可以了解下网关 kong ,包括 身份认证、权限认证、流量控制、监控预警…

再推荐一个 swoole rpc 框架 hpro,支持多语言。

就到这了,上面的 demo 需要源码的,加我微信。(菜单-> 加我微信-> 扫我)

本文欢迎转发,转发请注明作者和出处,谢谢!

本文发布于:2023-04-06 07:33:18,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/2075db54c5659fbaab8cc291140a0eb1.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Swoole RPC 的实现.doc

本文 PDF 下载地址:Swoole RPC 的实现.pdf

标签:代码   时间   大佬   中心
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图