yar是鸟哥(laruence)开发的一个并行的RPC框架。据说sina weibo已经在大规模使用这个框架了。今天初步使用了下,觉得还是挺爽的一个工具。

什么情况适用这个工具呢?

比如一般你有个微博这样的一个项目,这个项目的特点是有多个子项目组成,即有web版,手机客户端版,wap版等。

一般有这么多个子项目,且项目的页面逻辑是分开的,我们自然会建立多个项目,然后分拆给不同的人负责。

但是呢,这么多版本,它的功能实际都是相似的,比如必须都有个获取好友的功能,必须有个获取好友动态的接口,那么虽然这个接口的表现形式可能是不一样的,但是它的数据逻辑是一样的,如果使用MVC的分层模型来说,Controller和View层各个项目是不一样的,但是Model层实际上是完全相同的。那么怎么能让他们使用同样的model层呢?这个时候就想到了使用RPC。使用RPC就能让各个项目像访问自己的Model层一样访问RPC提供的服务了。换句话说,RPC可以提供业务数据的封装。这个对于公司来说,很爽。为毛呢?因为把业务数据一封装,写一篇足够完善的文档解释提供的rpc文章,这样招一批实习生就只要套套模板就能实现一个很完整的项目了。

需要考虑什么?

但是呢?RPC本质上也是一个网络请求,既然是请求,对于效率来说,就需要考虑了。

首先,基于什么协议层来做网络传输呢,yar是基于http来做的。

其次,能不能多个请求并发呢?

当然可以,yar实现了多个请求并发执行。这里就直接套用yar的文档例子做个演示:

<?php
function callback($retval, $callinfo) {
var_dump($retval);
} function error_callback($type, $error, $callinfo) {
error_log($error);
} Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters")); // if the callback is not specificed,
// callback in loop will be used
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", array(YAR_OPT_PACKAGER => "json"));
//this server accept json packager
Yar_Concurrent_Client::call("http://host/api/", "some_method", array("parameters"), "callback", array(YAR_OPT_TIMEOUT=>1));
//custom timeout Yar_Concurrent_Client::loop("callback", "error_callback"); //send the requests,
//the error_callback is optional
?>

再其次,缓存

既然Model层已经统一了,复用性这么高,那么缓存做在model层就很有用了,因为命中率很高嘛。

缓存yar可没有帮你做,但是我们基于yar做个通用的缓存是很容易的事情,比如你可以使用文件缓存做容灾处理,使用redis做内容缓存加速。

再再其次,安全

提供rpc的机器不能对外提供服务,需要使用签名机制,那么调用rpc的客户端就需要有个做签名的过程,提供rpc的服务端就需要有个解签名的过程。

那么可以这么搞:

意思就是做一个通用的SDK安装在客户端,然后各个项目调用这个SDK,这个SDK可以做什么事情呢?

1 RPC缓存

2 优化调用接口

3 做日志统计

4 做签名验证

怎么搭建?

步骤在github上都已经说很清楚了:

1 php安装yar扩展(可选择安装msgpack扩展)msgpack扩展是一个高效的二进制打包协议。rpc的服务端和rpc的客户端都需要安装这个扩展。

2 服务端写model类

3 服务端提供对外的rpc的api服务程序,这个程序大致像这样:

<?php
class API {
/**
* the doc info will be generated automatically into service info page.
* @params
* @return
*/
public function api($parameter, $option = "foo") {
} protected function client_can_not_see() {
}
} $service = new Yar_Server(new API());
$service->handle();
?>

有的人说我希望这个提供rpc的类是我自定义的,那么你就可以使用$_REQUEST将class参数传入进来,然后在服务端new $class,再使用Yar_Server封装,这样就能加上签名验证,就能将所有的Model类作为rpc提供给客户端了。

4 客户端使用Yar_Client来调用服务端的rpc服务。

yar粗略使用记录的更多相关文章

  1. yar框架使用笔记

    Yar是什么 Yar是并行的RPC框架(Concurrent RPC framework),Laruence开发. 安装 下载地址:http://pecl.php.net/package/yar wi ...

  2. [vue折线图] 记录SpringBoot+Vue3.0折线图订单信息展示

    因公司业务需求,需要做一份订单相关的折线图, 如果其中有一天没有订单的话,这一天就是空缺的,在绘制折线图的时候是不允许的,所有要求把没有订单数据的日期也要在图表显示. 使用技术vue3.0+sprin ...

  3. Programming Entity Framework 翻译

    刚开始接触.net,c#语法应该说还没掌握好.学习实践的旅程就从linq和EF开始吧.感觉相比之前的开发方式,linq和EF方便好多. linq入门用了好久,因为c#不行,补习了2.0的泛型,3.0和 ...

  4. [Python]爬虫v0.1

    #coding:utf-8 import urllib ###### #爬虫v0.1 利用urlib2 和 字符串内建函数 ###### # 获取网页内容 def getHtml(url): page ...

  5. 项目由Windows2003 迁移到Windows 2008 过程,报 JS错误

    这两天在做服务器迁移,遇到了一些小的问题,现在做个粗略的记录 原服务器环境:Windows 2003 现服务器环境:Windows 2008 其中SSB项目在迁移部署后发现,报 JS的错误. 我在想除 ...

  6. 浅介HTML DOM

    什么是DOM? DOM是Document Object Model(文档对象模型)的缩写. DOM是W3C(万维网联盟)的标准. DOM定义了访问HTML和XML文档的标准: “W3C文档对象模型(D ...

  7. http请求与传参

    这并不算是文章,暂时只做粗略地记录,以免忘记,因此会显得杂乱无章,随便抓了几个包和对postman截图,日后有空再完善 1.get方式 只有一种方式,那就是在url后面跟参数 2.post方式 1)表 ...

  8. Node.js学习笔记(2) - Node.js安装及入门hello world

    今天来简单的记录一下Node.js的安装配置以及简单的入门 一.Node.js的安装 1.windows下的安装 windows下的安装很简单,只需要去官网http://nodejs.org中,找到w ...

  9. Docker安装之路

    从3月初到现在,一直在安装docker 的路上越走越远,大概就在1个小时前,我终于成功了,那一刻,我觉得我拥有了整个世界,于是乎,拥有了整个世界的我决定草率的并粗略的记录一下安装过程中遇到的我能记住的 ...

随机推荐

  1. C#中的using和yield return混合使用

    最近写代码为了为了省事儿用了几个yield return,因为我不想New一个List<T>或者T[]对象再往里放元素,就直接返回IEnumerable<T>了.我的代码里还有 ...

  2. URI和URL、URN区别

    URI不能读取/写入资源,这是统一的资源定位器(URL)的任务.URL是一种URI,它的schema是已知的网络协议,并且它把URI与某种协议处理程序联系起来(一种与资源通讯的读/写机制).URI一般 ...

  3. input输入内容时放大问题

    最近做的微信网站有一个关于input输入框页面放大的问题.比如登录页面刚打开时正常,但用户输入信息登录时,页面就会放大.解决这个问题,首先需要在头部加一个 <meta name="vi ...

  4. IT小喇叭-企业品牌宣传、产品营销推广的首选

    IT小喇叭-企业品牌宣传.产品营销推广的首选 IT小喇叭,成立于2015年6月初,成都芮嘉科技有限公司旗下产品,主要进行媒体资源整合.宣传报道:使移动互联网等相关企业的产品宣传.品牌营销变得更加方便. ...

  5. Mac电脑配置IOS React Native开发环境配置笔记

    React Native(以下简称RN)的开发环境配置直接参考官方文档即可完成,不过对小白来说东西有点多,有些名词不是很好理解,这里就官方的安装文档稍微展开说一下. 中文版配置说明:不错的中文说明.官 ...

  6. 利用xtraBackup实现不停master服务做主从同步

    MySQL主从同步原理: MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态 ...

  7. First Missing Positive && missing number

    https://leetcode.com/problems/first-missing-positive/ 我原以为数组中不会有重复的数字,所以利用min.max分别记录给定数组中出现的最小正整数和最 ...

  8. React Ntive 学习手记

    React使今年来比较热门的前端库,之所以说是库呢,因为React.js是应用于MVC中的V层, 它并不是一个完整的MVC框架,所以,我也不知称之为框架了. 不过这并不影响React的火热. 混合应用 ...

  9. viojs1908无线网路发射器选址

      描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的 129 条东西向街道和 129 条南北向街道所形成的网格状,并且 ...

  10. C#的对象赋值

    例如 Class A {       int x = 0;       int y = 0; }   public void test() {       A test1 = new A( );   ...