资讯专栏INFORMATION COLUMN

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

wh469012917 / 2045人阅读

摘要:客户端并行调用这两个服务这里的方法的命令皆以原版为准则。回调函数需要继承实现里面定义了两个方法是针对并行调用发出之后立即执行的任务,而则是每个请求之后返回的结果。

简介

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 服务器端本地的方法。

github: https://github.com/zhoumengkang/yar-java-client
您的 star 就是对我们小菜的最大的鼓励,O(∩_∩)O~~

特性

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

支持并行的 RPC 调用

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

范例 PHP服务器端提供了服务

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

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();
    }
}

github: https://github.com/zhoumengkang/yar-java-client
您的 star 就是对我们小菜的最大的鼓励,O(∩_∩)O~~

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65326.html

相关文章

  • phpcms 里面 Yar 使用

    摘要:的框架的话语言的话首选的当然是鸟哥的,支持并行等等,总之有很多优点。首先查看了鸟哥的文章并行的框架,对的基本原理有了一个认识,做了一个简单的请求页面,具体见鸟哥博客,没问题,接下来就是对现有项目的改造了。最后感谢鸟哥写出这么牛掰的东西。 公司新上了个频道,需要我负责的几个频道提供接口,因为进度比较赶,就直接写了web的 http 接口供同事访问。 后来访问量越来越大,出现了很多问题,...

    chnmagnus 评论0 收藏0
  • SOA面向服务基础

    摘要:面向服务面向服务的基础面向服务的三层应用层,服务层,数据层应用层用于给用户展示,,,,安卓。在服务器端,进程保持睡眠状态直到调用信息到达为止。编译完成,提示我们已经在下了。 面向服务 面向服务的基础 面向服务的三层:应用层,服务层,数据层 * 应用层:用于给用户展示,PC,H5,IOS,安卓。 * 服务层:业务逻辑,提供接口(商品,订单,支付,用户,物流)。 * 数据层:提供数据支持(...

    songze 评论0 收藏0
  • 服务治理深入浅出(2)- 远程方法调用实现

    摘要:需求在了解了前面我们关于服务治理出现的必要性之后。我们知道服务治理是建立在众多服务基础之上的,那么,第一步,打通这些服务是基础,也就是我们常说的远程调用。上面执行远程调用也类似。 需求 在了解了前面我们关于服务治理出现的必要性之后。我们知道服务治理是建立在众多服务基础之上的,那么,第一步,打通这些服务是基础,也就是我们常说的 RPC 远程调用。要像调用本地方法一样调用远程服务器上的方法...

    hidogs 评论0 收藏0
  • 记JVM堆外内存泄漏Bug查找

    摘要:服务本身是一个,开起的线程数为,再加上一些其他线程,总的线程数不会超过服务内自己没有显示创建线程或者使用线程池。问题解决找到所在后,结局方案很简单,只需将的通过单例的方式注入到服务中,即可解决堆外内存泄漏的问题。 内存泄漏Bug现场 一个做BI数据展示的服务在一个晚上重启了5次,由于是通过k8s容器编排,服务挂了以后会自动重启,所以服务还能继续提供服务。 第一时间先上日志系统查看错误日...

    hiYoHoo 评论0 收藏0
  • 基于YarWordPress微博墙插件

    摘要:微博墙就是这样的一个工具,这不是一款普通的插件,这是一款搭建在基于的插件。这是一款基于的插件,底层语言开发,性能卓越。 在现在移动互联网时代,微博已经成为了每个人生活中必不可少的一个社交工具。而WordPress是全世界最为流行的博客系统,把你的博客接入新浪微博,借助微博的强大用户群,不仅能给你的网站提供巨大的流量,而且还能带来不可估量价值。 WordPress微博墙就是这样的一个工具...

    james 评论0 收藏0

发表评论

0条评论

wh469012917

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<