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

簡介

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

特性

  1. 執行速度快,依舊保持鳥哥初衷,框架輕,使用簡單java

  2. 支持並行的 RPC 調用git

  3. 方法的使用和參數的和 PHP 版本保持一致github

範例

PHP服務器端提供了服務

兩個 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();

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~~async