前言:

RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用
RPC要解决的两个问题:
  1. 解决分布式系统中,服务之间的调用问题。
  2. 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑
如果模仿B/S架构的调用方式,每次调用时,都需要写一串发起http请求的代码。比如new Curl()...之类的,能不能像本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程。
实际情况下,RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议。 为什么不直接使用二进制传输。
 

安装:

pecl install yar

pecl install msgpack

服务端代码:

  1. <?php
  2.  
  3. require_once 'Email.php';
  4. require_once 'Sms.php';
  5.  
  6. class Service
  7. {
  8. private $sms;
  9. private $email;
  10.  
  11. public function __construct()
  12. {
  13. $this->sms = new Sms();
  14. $this->email = new Email();
  15. }
  16.  
  17. /**
  18. * @param $mobile
  19. * @return string
  20. */
  21. public function sendSms($mobile, $content = '短信内容')
  22. {
  23. return $this->sms->send($mobile, $content);
  24. }
  25.  
  26. /**
  27. * @param $email
  28. * @return string
  29. */
  30. public function sendEmail($email)
  31. {
  32. return $this->email->send($email);
  33. }
  34. }
  35.  
  36. $service = new Yar_Server(new Service());
  37. $service->handle();

客户端代码:

  1. <?php
  2.  
  3. // 一、直接调用
  4. //$client = new Yar_Client("http://192.168.2.138/api/");
  5. //$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
  6. //$result = $client->sendSms('18234065200', '我是短信内容');
  7. //echo $result;
  8.  
  9. // 二、并行调用
  10. // public static call ( string $uri , string $method [, array $parameters [, callable $callback [, callable $error_callback [, array $options ]]]] )
  11. // callback 回掉函数, 在远程服务的返回到达的时候被Yar调用, 从而可以处理返回内容 如果没有设置则调用loop中的callback
  12. // error_callback
  13. // $options
  14. Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendSms", ['18234065200', '欢迎注册']);
  15. Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendEmail", ['12580@qq.com'], "callback", "callError", [YAR_OPT_TIMEOUT => 10]);
  16.  
  17. // 发送请求
  18. // public static loop ([ callable $callback [, callable $error_callback ]] )
  19. Yar_Concurrent_Client::loop("loopCallback", "loopError");
  20.  
  21. function callback($retval, $callinfo)
  22. {
  23. echo 'call自己的回调:' . $callinfo['method'] . '方法返回数据' . $retval . PHP_EOL;
  24. }
  25.  
  26. // 错误回掉函数, 如果设置了, Yar在发送出所有的请求之后立即调用一次这个回掉函数(此时还没有任何请求返回), 调用的时候$callinfo参数是NULL
  27. function loopCallback($retval, $callinfo)
  28. {
  29. if (is_null($callinfo)) {
  30. echo '所有rpc请求发送完毕调用' . PHP_EOL;
  31. } else {
  32. echo '调用成功后返回' . PHP_EOL;
  33. var_dump($retval);
  34. var_dump($callinfo);
  35. }
  36. }
  37.  
  38. // 错误回调
  39. function callError()
  40. {
  41. echo '发送rpc出错' . PHP_EOL;
  42. }
  43.  
  44. // 错误回掉函数, 如果设置了, 那么Yar在出错的时候会调用这个回掉函数
  45. function loopError()
  46. {
  47. echo '发送rpc出错' . PHP_EOL;
  48. }

参考:

https://github.com/laruence/yar

http://www.laruence.com/2012/09/15/2779.html

Yar并行的RPC框架的简单使用的更多相关文章

  1. Java 实现简单的 RPC 框架

    RPC 简介 RPC,全称为 Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式,而不需要了解底层网络技术 ...

  2. FW:主流RPC框架

    主流RPC框架  2015年10月27日  zman  RPC 介绍目前在互联网公司比较流行的开源的RPC框架. RPC框架比较   语言 协议 ​服务治理 ​社区 机构 Hessian 多语言 he ...

  3. 简单RPC框架-基于Consul的服务注册与发现

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  4. 一个简单的基于BIO的RPC框架

    github地址:https://github.com/Luyu05/BioRpcExample PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc- ...

  5. 最简单的RPC框架实现

    通过java原生的序列化,Socket通信,动态代理和反射机制,实现一个简单的RPC框架,由三部分组成: 1.服务提供者,运行再服务端,负责提供服务接口定义和服务实现类 2.服务发布者,运行再RPC服 ...

  6. 分布式架构的基石.简单的 RPC 框架实现(JAVA)

    前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...

  7. Java实现简单的RPC框架

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...

  8. RPC笔记之初探RPC:DIY简单RPC框架

    一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在r ...

  9. 简单Tomcat HTTP RPC框架

    RPC基础知识 什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...

随机推荐

  1. MinGW dll导入导出类

    dll不仅可以导入导出函数,还可以导入导出类.这篇文章就来介绍如何将类导入dll中并导出. 首先我们建立一个名为dll.cpp的文件(又是这种破名字),里面写上: #include <iostr ...

  2. vue 项目太大, 导致 javascript heap out of memory

    原因: node 环境, 对单个进程的内存是有限制的, 但是现在前端项目太大, 所以我们需要根据当前机器环境, 手动加大node的内存限制 安装包 npm i increase-memory-limi ...

  3. 有关C/C++中,表达式计算顺序的问题,以及表达式内部变量“副作用”问题(转)

    经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?”m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4, ...

  4. Linux实现树莓派3B的国密SM9算法交叉编译——(一)环境部署、简单测试与eclipse工程项目测试

    这篇文章主要介绍了交叉编译的实现,包括环境部署,并简单测试交叉编译环境是否安装成功. 一.交叉编译 在一个平台上生成另一个平台上的可执行代码.为什么要大费周折的进行交叉编译呢?一句话:不得已而为之.有 ...

  5. [lua]紫猫lua教程-命令宝典-L1-01-02. 变量

    L1[变量]01. 变量命名规则 命名规则:数字字母下划线构成 但是不能数字开头 不推荐中文名 很多都是不支持中文 但是在一些其他的编辑器里面 比如触摸精灵 之类的 就可以 注意 :变量命名必须要包含 ...

  6. mybatis的8月29日

    一.select查询语句 1.mybatis的映射,jdbc预处理 <select id="selectPerson" parameterType="int&quo ...

  7. Mac 配置cron

    请参考:https://www.cnblogs.com/EasonJim/p/7819635.html 查看 crontab 是否启动 sudo launchctl list | grep cron ...

  8. java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [META-INF/services/com.alibaba.druid.filter.Filter].

    九月 11, 2019 2:56:36 下午 org.apache.catalina.loader.WebappClassLoaderBase checkStateForResourceLoading ...

  9. logging basic

    logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等. 相比print,具备如下优点:        可以通过设置不同的日志等级, ...

  10. JAVA(3)之关于运算符的优先级

    关于运算符的优先级,我做了一个小测试,区别在于平常的运算思维和计算机思维 int result=2; result =(result=result*2)*6*(result=3+result); Sy ...