Yar并行的RPC框架的简单使用
前言:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑
安装:
$ pecl install yar
$ pecl install msgpack
服务端代码:
<?php require_once 'Email.php';
require_once 'Sms.php'; class Service
{
private $sms;
private $email; public function __construct()
{
$this->sms = new Sms();
$this->email = new Email();
} /**
* @param $mobile
* @return string
*/
public function sendSms($mobile, $content = '短信内容')
{
return $this->sms->send($mobile, $content);
} /**
* @param $email
* @return string
*/
public function sendEmail($email)
{
return $this->email->send($email);
}
} $service = new Yar_Server(new Service());
$service->handle();
客户端代码:
<?php // 一、直接调用
//$client = new Yar_Client("http://192.168.2.138/api/");
//$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
//$result = $client->sendSms('18234065200', '我是短信内容');
//echo $result; // 二、并行调用
// public static call ( string $uri , string $method [, array $parameters [, callable $callback [, callable $error_callback [, array $options ]]]] )
// callback 回掉函数, 在远程服务的返回到达的时候被Yar调用, 从而可以处理返回内容 如果没有设置则调用loop中的callback
// error_callback
// $options
Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendSms", ['18234065200', '欢迎注册']);
Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendEmail", ['12580@qq.com'], "callback", "callError", [YAR_OPT_TIMEOUT => 10]); // 发送请求
// public static loop ([ callable $callback [, callable $error_callback ]] )
Yar_Concurrent_Client::loop("loopCallback", "loopError"); function callback($retval, $callinfo)
{
echo 'call自己的回调:' . $callinfo['method'] . '方法返回数据' . $retval . PHP_EOL;
} // 错误回掉函数, 如果设置了, Yar在发送出所有的请求之后立即调用一次这个回掉函数(此时还没有任何请求返回), 调用的时候$callinfo参数是NULL
function loopCallback($retval, $callinfo)
{
if (is_null($callinfo)) {
echo '所有rpc请求发送完毕调用' . PHP_EOL;
} else {
echo '调用成功后返回' . PHP_EOL;
var_dump($retval);
var_dump($callinfo);
}
} // 错误回调
function callError()
{
echo '发送rpc出错' . PHP_EOL;
} // 错误回掉函数, 如果设置了, 那么Yar在出错的时候会调用这个回掉函数
function loopError()
{
echo '发送rpc出错' . PHP_EOL;
}

参考:
https://github.com/laruence/yar
http://www.laruence.com/2012/09/15/2779.html
Yar并行的RPC框架的简单使用的更多相关文章
- Java 实现简单的 RPC 框架
RPC 简介 RPC,全称为 Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式,而不需要了解底层网络技术 ...
- FW:主流RPC框架
主流RPC框架 2015年10月27日 zman RPC 介绍目前在互联网公司比较流行的开源的RPC框架. RPC框架比较 语言 协议 服务治理 社区 机构 Hessian 多语言 he ...
- 简单RPC框架-基于Consul的服务注册与发现
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- 一个简单的基于BIO的RPC框架
github地址:https://github.com/Luyu05/BioRpcExample PART1:先来整体看下项目的构成 其中bio-rpc-core就是所谓的rpc框架 bio-rpc- ...
- 最简单的RPC框架实现
通过java原生的序列化,Socket通信,动态代理和反射机制,实现一个简单的RPC框架,由三部分组成: 1.服务提供者,运行再服务端,负责提供服务接口定义和服务实现类 2.服务发布者,运行再RPC服 ...
- 分布式架构的基石.简单的 RPC 框架实现(JAVA)
前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...
- Java实现简单的RPC框架
一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...
- RPC笔记之初探RPC:DIY简单RPC框架
一.什么是RPC RPC(Remote Procedure Call)即远程过程调用,简单的说就是在A机器上去调用B机器上的某个方法,在分布式系统中极其常用. rpc原理其实很简单,比较容易理解,在r ...
- 简单Tomcat HTTP RPC框架
RPC基础知识 什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. ...
随机推荐
- Redis 配置文件杂项。
protected-mode -----------------保护模式 redis3.2版本后新增protected-mode配置,默认是yes,即开启.设置外部网络连接redis服务,设置方式如下 ...
- Nginx之server和location配置使用
配置server代码段: server { server_name www.meiduo.site; listen ; root /home/python/Desktop/meiduo_mall_ad ...
- RESTful api设计风格
简介 REST(Representational State Transfer):表象层状态转变 RESTful对api进行规范和约束,使得api统一规范,增强api的可读性,便于开发. 设计 ...
- Qt5 error LNK2019 无法解析的外部符号的解决办法
今天在使用Qt Create 4.5.2时遇到一个莫名其妙的问题: 在原有工程里添加一个新类(有界面的),在调用的mainwindow.cpp中添加#include "a.h",然 ...
- 协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题(A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Carbon Emission Trading)
协同ADMM求解考虑碳排放约束直流潮流问题的对偶问题 (A Distributed Dual Consensus ADMM Based on Partition for DC-DOPF with Ca ...
- [蓝桥杯][基础训练]FJ的字符串
Description FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律 ...
- python字典里面列表排序
#coding=utf8 #获取到的数据库ip,和负载数据,需要按照负载情况排序 a={u'1.8.1.14': [379, 368, 361, 358, 1363], u'9.2.4.3': [42 ...
- rabbitmq - 简单认识
1. 概述 与 rabbitmq 做交互 amqp 最著名的实现 与 jms 最明显的区别 消息 不是去找 queue 而是去找 exchange 2. rabbitmq 基本组件 sender 发送 ...
- 使用JDBC完成分类表CRUD的操作
工具类 通过之前的案例回顾,不难发现,有很多的代码操作是重复的,比如“获取链接”和“释放资源”等,将来在增删改查中经常遇到,开发中遇到这种情况,将采用工具类的方法进行抽取,从而达到代码的重复利用. 此 ...
- 【Python】文件下载小助手
import requests from contextlib import closing class ProgressBar(object): def __init__(self, title, ...