php 并行框架,并行的RPC框架(Concurrent RPC Framework) Yar Java Client

Yar是一个由鸟哥创建的轻量级、高效的RPC框架,专注于PHP项目的远程方法调用。它支持并行调用,允许Java客户端通过YarJavaClient与PHP服务器端进行跨语言交互。在Java客户端中,可以通过YarClient进行同步调用,并使用YarConcurrentClient实现并行调用。这个框架简化了不同语言间的服务调用,提高了执行效率。
摘要由CSDN通过智能技术生成

简介

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

Yar 鸟哥博客介绍 http://www.laruence.com/2012/09/15/2779.html

Yar 鸟哥原始项目 https://github.com/laruence/yar

Yar Java Client 则实现了跨语言的远程调用。使得 Java 客户端能够调用 Yar PHP 服务器端本地的方法。

特性

执行速度快,依旧保持鸟哥初衷,框架轻,使用简单

支持并行的 RPC 调用

方法的使用和参数的和 PHP 版本保持一致

范例

PHP服务器端提供了服务

两个 rpc api ,模拟的业务场景是点赞赠送金币和发布帖子赠送金币。

class RewardScoreService {

/**

* $uid 给 $fid 点赞

* @param $fid interge

* @param $uid interge

* @return void

*/

public function support($uid,$fid){

return "support:uid:$uid:fid:$fid";

}

/**

* $uid 发布了帖子 $fid

* @param $fid interge

* @param $uid interge

* @return void

*/

public function post($uid,$fid){

return "post:uid:$uid:fid:$fid";

}

}

$yar_server = new Yar_server(new RewardScoreService());

$yar_server->handle();

Java客户端同步调用这两个服务

public class YarClientTest extends TestCase {

/**

* 定义 rpc 接口

*/

public interface RewardScoreService{

String support(int uid,int fid);

String post(int uid,int fid);

}

/**

* rpc api 地址

*/

static String uri = "http://mengkang.net/demo/yar-server/RewardScoreService.php";

public void testUserService(){

// 第一种调用方式

YarClient yarClient = new YarClient(uri);

RewardScoreService rewardScoreService = (RewardScoreService) yarClient.useService(RewardScoreService.class);

for (int i = 0; i < 10; i++) {

System.out.println(rewardScoreService.support(1, 2));

}

// 第二种调用方式

YarClientOptions yarClientOptions = new YarClientOptions();

yarClientOptions.setConnect_timeout(2000);

YarClient yarClient2 = new YarClient(uri,yarClientOptions);

RewardScoreService rewardScoreService2 = (RewardScoreService) yarClient2.useService(RewardScoreService.class);

for (int i = 0; i < 10; i++) {

System.out.println(rewardScoreService2.post(1, 20));

}

}

}

考虑到 Java 和 PHP 的数据类型的不同,这里做了一个折中的处理,返回数据类型客户端框架统一以Object类型接受,然后使用时再根据接口定义的数据类型进行转换。

Java客户端并行调用这两个服务

这里的方法的命令皆以 Yar 原版为准则。

YarConcurrentClient.call方法注册,

YarConcurrentClient.loop并行调用,

YarConcurrentClient.reset清空任务。

回调函数需要继承实现YarConcurrentCallback里面定义了两个方法:async是针对并行调用发出之后立即执行的任务,而success则是每个请求之后返回的结果。

public class YarConcurrentClientTest extends TestCase {

/**

* rpc api 地址

*/

static String uri = "http://mengkang.net/demo/yar-server/RewardScoreService.php";

public class callback extends YarConcurrentCallback {

public void async() {

System.out.println("现在, 所有的请求都发出去了, 还没有任何请求返回");

}

public Object success() {

return retValue;

}

}

public class errorCallback extends YarConcurrentErrorCallback {

@Override

void error() {

System.out.println("出错了");

}

}

public void testLoop() throws Exception {

String packagerName = YarConfig.getString("yar.packager");

YarClientOptions yarClientOptions = new YarClientOptions();

yarClientOptions.setConnect_timeout(2000);

for (int i = 0; i < 10; i++) {

// 第一种调用方式

YarConcurrentClient.call(new YarConcurrentTask(uri, "support", new Object[]{1, 2}, packagerName, new callback()));

// 第二种调用方式 增加一些额外配置选项

YarConcurrentClient.call(new YarConcurrentTask(uri, "support", new Object[]{1, 2}, packagerName, new callback(),yarClientOptions));

}

for (int i = 0; i < 10; i++) {

// 第三种调用方式 有正确的回调和错误的回调

YarConcurrentClient.call(new YarConcurrentTask(uri,"post",new Object[]{1,2},packagerName,new callback(),new errorCallback()));

// 第四种调用方式 在第三种的基础上增加额外的配置选项

YarConcurrentClient.call(new YarConcurrentTask(uri,"post",new Object[]{1,2},packagerName,new callback(),new errorCallback(),yarClientOptions));

}

YarConcurrentClient.loop(new callback());

YarConcurrentClient.reset();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值