什么是RPC

RPC,全称是Remote Procedure Call,远程服务调用,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简单一点来理解就是网络上的一个节点请求另一个节点提供的服务。

什么是YAF

Yaf,全称 Yet Another Framework,使用C语言编写,是一个以PHP扩展形式提供的PHP开发框架。相比于一般的PHP框架,它更快、更轻便,它提供了Bootstrap、路由、分发、视图、插件,是一个全功能的PHP框架。

YAF框架如何下载安装

什么是YAR

Yar,全称Yet Another RPC framework for PHP, 是一个轻量级, 高效的RPC框架, 它提供了一种简单方法来让PHP项目之间可以互相远程调用对方的本地方法. 并且Yar也提供了并行调用的能力. 可以支持同时调用多个远程服务的方法。

YAR扩展如何安装

YAR文档

准备工作

使用上面的YAF框架安装教程部署2个一模一样的项目,并绑定域名a.myyaf.com做服务端,绑定域名b.myyaf.com做客户端。

服务端实现

0x01,新建application/library/servers/CalculatorServer.php

<?php
namespace Servers;class CalculatorServer {/*** 加法* @param $left* @param $right* @return mixed*/public function plus($left,$right) {return $left + $right;}/*** 减法* @param $left* @param $right* @return mixed*/public function minus($left,$right){return $left - $right;}/*** 乘法* @param $left* @param $right* @return mixed*/public function mul($left,$right){return $left * $right;}/*** 除法* @param $left* @param $right* @return mixed*/public function div($left, $right){return $left / $right;}
}

0x02,新建application/controllers/Rpc.php

<?phpclass RpcController extends \Yaf\Controller_Abstract {public function calculatorAction() {$server = new \Yar_Server(new \MyRpc\Servers\CalculatorServer());$server->handle();return false;}}

使用get方法请求链接,可以查看对应server的接口列表和注释。

客户端实现

0x01,调用远程服务

编辑application\controllers\Index.php

<?php
class IndexController extends \Yaf\Controller_Abstract {public function indexAction() {$client = new \Yar_Client('http://a.myyaf.com/rpc/calculator');$left = 1;$right = 2;$result = $client->plus($left,$right);echo "{$left} + {$right} = {$result}";return false;}
}

访问b.myyaf.com查看下效果

0x02,并行调用远程服务

编辑application\controllers\Index.php,新增loopAction、callBack、errorCallBack三个函数

<?php
class IndexController extends \Yaf\Controller_Abstract {public function loopAction(){\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','plus',[1,2]);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','minus',[5,3]);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','mul',[3,4]);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','div',[9,3]);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);return false;}public function callBack($retval, $callinfo){echo '调用成功回调<hr/>';}public function errorCallBack($type, $error, $callinfo){echo '调用失败回调<hr/>';}
}

访问b.myyaf.com/index/loop查看下效果

0x03,并行调用指定回调函数、错误回调函数

上面调用结果是5个调用成功回调,这个是因为\Yar_Concurrent_Client::call未设置回调函数,默认会使用\Yar_Concurrent_Client::loop的回调函数。可以分别指定每个\Yar_Concurrent_Client::call的回调函数、错误回调函数。
<?php
class IndexController extends \Yaf\Controller_Abstract {# 并行调用public function loopAction(){\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','plus',[1,2],[$this,'plusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','minus',[5,3],[$this,'minusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','mul',[3,4],[$this,'mulCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','div',[9,3],[$this,'divCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);return false;}public function callBack($retval, $callinfo){echo '调用成功回调<hr/>';}public function errorCallBack($type, $error, $callinfo){echo '调用失败回调<hr/>';}public function plusCallBack($retval, $callinfo){echo "加法回调,结果:{$retval}<hr/>";}public function minusCallBack($retval, $callinfo){echo "减法回调,结果:{$retval}<hr/>";}public function mulCallBack($retval, $callinfo){echo "乘法回调,结果:{$retval}<hr/>";}public function divCallBack($retval, $callinfo){echo "除法回调,结果:{$retval}<hr/>";}
}

再次访问b.myyaf.com/index/loop查看下效果

0x04,多次调用loop

如果在一次请求里面多次使用loop,后面的loop会携带上次loop的请求结果。

服务端编辑application/library/servers/CalculatorServer.php,新增square函数

<?php
namespace Servers;class CalculatorServer {/*** 加法* @param $left* @param $right* @return mixed*/public function plus($left,$right) {return $left + $right;}/*** 减法* @param $left* @param $right* @return mixed*/public function minus($left,$right){return $left - $right;}/*** 乘法* @param $left* @param $right* @return mixed*/public function mul($left,$right){return $left * $right;}/*** 除法* @param $left* @param $right* @return mixed*/public function div($left, $right){return $left / $right;}/*** 平方* @param $a* @return float|int*/public function square($a){return $a * $a;}
}

客户端编辑application\controllers\Index.php

<?php
class IndexController extends \Yaf\Controller_Abstract {# 并行调用public function loopAction(){\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','plus',[1,2],[$this,'plusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','minus',[5,3],[$this,'minusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','mul',[3,4],[$this,'mulCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','div',[9,3],[$this,'divCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','square',[6],[$this,'squareCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);return false;}public function callBack($retval, $callinfo){echo '调用成功回调<hr/>';}public function errorCallBack($type, $error, $callinfo){echo '调用失败回调<hr/>';}public function plusCallBack($retval, $callinfo){echo "加法回调,结果:{$retval}<hr/>";}public function minusCallBack($retval, $callinfo){echo "减法回调,结果:{$retval}<hr/>";}public function mulCallBack($retval, $callinfo){echo "乘法回调,结果:{$retval}<hr/>";}public function divCallBack($retval, $callinfo){echo "除法回调,结果:{$retval}<hr/>";}public function squareCallBack($retval, $callinfo){echo "平方回调,结果:{$retval}<hr/>";}
}

可以在loop之前使用\Yar_Concurrent_Client::reset()清空上一次loop的结果

<?php
class IndexController extends \Yaf\Controller_Abstract {# 并行调用public function loopAction(){\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','plus',[1,2],[$this,'plusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','minus',[5,3],[$this,'minusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','mul',[3,4],[$this,'mulCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','div',[9,3],[$this,'divCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);Yar_Concurrent_Client::reset();\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','square',[6],[$this,'squareCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);return false;}public function callBack($retval, $callinfo){echo '调用成功回调<hr/>';}public function errorCallBack($type, $error, $callinfo){echo '调用失败回调<hr/>';}public function plusCallBack($retval, $callinfo){echo "加法回调,结果:{$retval}<hr/>";}public function minusCallBack($retval, $callinfo){echo "减法回调,结果:{$retval}<hr/>";}public function mulCallBack($retval, $callinfo){echo "乘法回调,结果:{$retval}<hr/>";}public function divCallBack($retval, $callinfo){echo "除法回调,结果:{$retval}<hr/>";}public function squareCallBack($retval, $callinfo){echo "平方回调,结果:{$retval}<hr/>";}
}

0x05,运行时配置

yar的配置项包含以下内容:

yar.timeout,处理超时,默认5000ms

yar.connect_timeout,连接超时,默认1000ms

yar.packager,打包方式,有php、json、msgpack三种方式,默认是php,当使用--enable-msgpack构建时默认“msgpack”

yar.debug,默认关闭

yar.content_type,默认是application/octet-stream

yar.allow_persistent,持续连接,默认关闭

接下来,我们来测试下处理超时的情况。

服务端编辑application/library/servers/CalculatorServer.php,修改plus函数

<?php
namespace Servers;class CalculatorServer {/*** 加法* @param $left* @param $right* @return mixed*/public function plus($left,$right) {sleep(5);return $left + $right;}/*** 减法* @param $left* @param $right* @return mixed*/public function minus($left,$right){return $left - $right;}/*** 乘法* @param $left* @param $right* @return mixed*/public function mul($left,$right){return $left * $right;}/*** 除法* @param $left* @param $right* @return mixed*/public function div($left, $right){return $left / $right;}/*** 平方* @param $a* @return float|int*/public function square($a){return $a * $a;}
}

客户端编辑application\controllers\Index.php,修改indexAction函数

<?php
class IndexController extends \Yaf\Controller_Abstract {public function indexAction() {$client = new \Yar_Client('http://a.myyaf.com/rpc/calculator');$client->setOpt(YAR_OPT_CONNECT_TIMEOUT,1);$client->setOpt(YAR_OPT_TIMEOUT,1);$left = 1;$right = 2;$result = $client->plus($left,$right);echo "{$left} + {$right} = {$result}";return false;}}

并行调用也可以设置配置。

<?php
class IndexController extends \Yaf\Controller_Abstract {# 并行调用public function loopAction(){\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','plus',[1,2],[$this,'plusCallBack'],[$this,'plusErrorCallBack'],[YAR_OPT_TIMEOUT=>1,YAR_OPT_CONNECT_TIMEOUT=>1]);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','minus',[5,3],[$this,'minusCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','mul',[3,4],[$this,'mulCallBack']);\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','div',[9,3],[$this,'divCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);Yar_Concurrent_Client::reset();\Yar_Concurrent_Client::call('http://a.myyaf.com/rpc/calculator','square',[6],[$this,'squareCallBack']);Yar_Concurrent_Client::loop([$this,'callback'], [$this,'errorCallBack']);return false;}public function callBack($retval, $callinfo){echo '调用成功回调<hr/>';}public function errorCallBack($type, $error, $callinfo){echo '调用失败回调<hr/>';}public function plusCallBack($retval, $callinfo){echo "加法回调,结果:{$retval}<hr/>";}public function plusErrorCallBack($type, $error, $callinfo){echo "加法错误回调:{$error}<hr/>";}public function minusCallBack($retval, $callinfo){echo "减法回调,结果:{$retval}<hr/>";}public function mulCallBack($retval, $callinfo){echo "乘法回调,结果:{$retval}<hr/>";}public function divCallBack($retval, $callinfo){echo "除法回调,结果:{$retval}<hr/>";}public function squareCallBack($retval, $callinfo){echo "平方回调,结果:{$retval}<hr/>";}
}

也可以使用ini_set()设置

ini_set('yar.timeout',1000);
ini_set('yar.connect_timeout',1000);

也可以直接修改php.ini设置

yar.timeout = 1000

yar.connect_time = 1000

使用yaf+yar实现基于http的rpc服务相关推荐

  1. 基于yaf+yar微服务解决方案教程

    基于yaf+yar微服务解决方案教程 大纲 主要内容 [课程地址](https://edu.csdn.net/course/detail/9933) 大纲 主要内容 课程地址

  2. php yar 扩展,php的基于yaf+yar+yac环境搭建

    php项目基于yaf+yar+yac环境搭建 具体配置步骤(尽量缩短文字描述): 1.php的yaf扩展安装: **      pecl install   yaf   ** 将   extensio ...

  3. 深入理解 RPC : 基于 Python 自建分布式高并发 RPC 服务

    RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...

  4. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...

    原文:NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成 本篇内容属于非实用性(拿来即用)介绍,如对框架设计没兴趣的朋友,请略过. 快一个月没有写博 ...

  5. voyage java_GitHub - yezilong9/voyage: 采用Java实现的基于netty轻量的高性能分布式RPC服务框架...

    Voyage Overview 采用Java实现的基于netty轻量的高性能分布式RPC服务框架.实现了RPC的基本功能,开发者也可以自定义扩展,简单,易用,高效. Features 服务端支持注解配 ...

  6. 基于 Python 自建分布式高并发 RPC 服务

    RPC(Remote Procedure Call)服务,也即远程过程调用,在互联网企业技术架构中占据了举足轻重的地位,尤其在当下微服务化逐步成为大中型分布式系统架构的主流背景下,RPC 更扮演了重要 ...

  7. 基于消息中间件RabbitMQ实现简单的RPC服务

    转载自  基于消息中间件RabbitMQ实现简单的RPC服务 RPC(Remote Procedure Call,远程过程调用),是一种计算机通信协议.对于两台机器而言,就是A服务器上的应用程序调用B ...

  8. 基于Netty的RPC简易实现

    代码地址如下: http://www.demodashi.com/demo/13448.html 可以给你提供思路 也可以让你学到Netty相关的知识 当然,这只是一种实现方式 需求 看下图,其实这个 ...

  9. 基于Netty的RPC架构实战演练

    基于Netty的RPC架构实战演练 NIO netty服务端 netty客户端 netty线程模型源码分析(一) netty线程模型源码分析(二) netty5案例学习 netty学习之心跳 prot ...

  10. 【SemiDrive源码分析】【MailBox核间通信】43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇)

    [SemiDrive源码分析][MailBox核间通信]43 - 基于Mailbox IPCC RPC 实现核间通信(代码实现篇) 一.RTOS侧 IPCC RPC 代码实现 二.Android侧 I ...

最新文章

  1. Linux篇---ftp服务器的搭建
  2. ELK安装配置及nginx日志分析
  3. Pytorch基础(八)——正则化
  4. 730阵列卡支持多大硬盘_凯捷月销破2万,配6座头等舱空间,到底有多舒服?试驾了才知道...
  5. 如何击败腾讯_击败股市
  6. GCC10.1.0最新版编译
  7. Python map() ==>根据提供的函数对指定序列做映射
  8. jQuery EasyUI API 中文文档 - ValidateBox验证框
  9. LinkedHashMap入门
  10. 京东基础架构部招聘GO/JAVA架构师两名(T7+)
  11. 格式化U盘并测试读写速度
  12. AFDX(ARINC664)的交换机规范
  13. Edge浏览器保存主页视频的方法
  14. Java层Binder框架通信原理(转自Cloud Chou's Tech Blog)
  15. 优秀工程师必备的一项技能,你解锁了吗?
  16. win10系统日语输入法只能打出英文字母无法切换微软输入法无法使用
  17. (随笔备忘)装系统—— centos7下制作U盘启动盘还是失败待试,换大白菜
  18. iPhone手机 app加密和换图标
  19. 《计算机程序的构造和解释》阅读笔记:准备(3)【python3简单实现lisp解释器(3)】
  20. C语言之通讯录的制作并用文件存储

热门文章

  1. android MediaPlayer SurfaceView 网络视频播放器
  2. Linux 应用调试神器- ASan
  3. ik分词 动态增加词库 mysql_Elasticsearch7.8.0集成IK分词器改源码实现MySql5.7.2实现动态词库实时更新...
  4. Vmware安装Ubuntu20.04
  5. oracle 删除 快照,创建和销毁 ZFS 快照
  6. 扫描qr code_如何在Android手机上扫描QR码
  7. python海贼王logo_中年大叔学编程-Python下载海贼王漫画图片
  8. 【Linux系列文章】软件包管理
  9. 科研入门必备知识之论文种类--Journal、magazine、transactions、proceedings
  10. Fresher的特殊求和