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 服务器端本地的方法。php
github: https://github.com/zhoumengkang/yar-java-client
您的 star 就是对咱们小菜的最大的鼓励,O(∩_∩)O~~html
执行速度快,依旧保持鸟哥初衷,框架轻,使用简单java
支持并行的 RPC 调用git
方法的使用和参数的和 PHP 版本保持一致github
两个 rpc api ,模拟的业务场景是点赞赠送金币和发布帖子赠送金币。api
<?php 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();
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类型接受,而后使用时再根据接口定义的数据类型进行转换。服务器
这里的方法的命令皆以 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(); } }
github: https://github.com/zhoumengkang/yar-java-client
您的 star 就是对咱们小菜的最大的鼓励,O(∩_∩)O~~async