{"id":17010473,"url":"https://github.com/zhoumengkang/yar-java-client","last_synced_at":"2025-03-22T16:30:59.162Z","repository":{"id":69971130,"uuid":"48217636","full_name":"zhoumengkang/yar-java-client","owner":"zhoumengkang","description":"Java client for laruence’s yar, concurrent async request supported.","archived":false,"fork":false,"pushed_at":"2016-01-07T10:56:56.000Z","size":31,"stargazers_count":83,"open_issues_count":0,"forks_count":28,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-03-18T13:32:51.133Z","etag":null,"topics":["rpc","yar"],"latest_commit_sha":null,"homepage":"http://mengkang.net","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhoumengkang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-12-18T06:06:11.000Z","updated_at":"2024-06-23T03:18:33.000Z","dependencies_parsed_at":"2023-03-09T23:31:06.140Z","dependency_job_id":null,"html_url":"https://github.com/zhoumengkang/yar-java-client","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhoumengkang%2Fyar-java-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhoumengkang%2Fyar-java-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhoumengkang%2Fyar-java-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhoumengkang%2Fyar-java-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhoumengkang","download_url":"https://codeload.github.com/zhoumengkang/yar-java-client/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244986419,"owners_count":20543011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["rpc","yar"],"created_at":"2024-10-14T06:04:37.531Z","updated_at":"2025-03-22T16:30:58.738Z","avatar_url":"https://github.com/zhoumengkang.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 简介\n\n[![Build Status](https://travis-ci.org/zhoumengkang/yar-java-client.svg)](https://travis-ci.org/zhoumengkang/yar-java-client)\n\nYar 是一个轻量级, 高效的 RPC 框架, 它提供了一种简单方法来让 PHP 项目之间可以互相远程调用对方的本地方法. 并且 Yar 也提供了并行调用的能力. 可以支持同时调用多个远程服务的方法.\n\nYar 鸟哥博客介绍 http://www.laruence.com/2012/09/15/2779.html\n\nYar 鸟哥原始项目 https://github.com/laruence/yar\n\nYar Java Client 则实现了跨语言的远程调用。使得 Java 客户端能够调用 Yar PHP 服务器端本地的方法。\n\n# 特性\n\n1. 执行速度快，依旧保持鸟哥初衷，框架轻，使用简单\n\n2. 支持并行的 RPC 调用\n\n3. 方法的使用和参数的和 PHP 版本保持一致\n\n# 范例\n\n\u003e 更详细的使用说明请参考 [wiki](https://github.com/zhoumengkang/yar-java-client/wiki/Manual)\n\nPHP服务器端\n---\n\n提供了两个 rpc api ，模拟的业务场景是点赞赠送金币和发布帖子赠送金币。\n\n```php\n\u003c?php\n \nclass RewardScoreService {\n    /**\n     * $uid 给 $fid 点赞\n     * @param $fid  interge\n     * @param $uid  interge\n     * @return void\n     */\n    public function support($uid,$fid){\n        return \"support:uid:$uid:fid:$fid\";\n    }\n \n    /**\n     * $uid 发布了帖子 $fid \n     * @param $fid  interge\n     * @param $uid  interge\n     * @return void\n     */\n    public function post($uid,$fid){\n        return \"post:uid:$uid:fid:$fid\";\n    }\n}\n \n$yar_server = new Yar_server(new RewardScoreService());\n$yar_server-\u003ehandle();\n```\n\nJava客户端同步调用这两个服务\n---\n\n```java\npublic class YarClientTest extends TestCase {\n    /**\n     * 定义 rpc 接口\n     */\n    public interface RewardScoreService{\n        String support(int uid,int fid);\n        String post(int uid,int fid);\n    }\n\n    /**\n     * rpc api 地址\n     */\n    static String uri = \"http://mengkang.net/demo/yar-server/RewardScoreService.php\";\n\n    public void testUserService(){\n        // 第一种调用方式\n        YarClient yarClient  = new YarClient(uri);\n        RewardScoreService rewardScoreService = (RewardScoreService) yarClient.useService(RewardScoreService.class);\n        System.out.println(rewardScoreService.support(1, 2));\n        \n        // 第二种调用方式\n        YarClientOptions yarClientOptions = new YarClientOptions();\n        yarClientOptions.setConnect_timeout(2000);\n        \n        YarClient yarClient2  = new YarClient(uri,yarClientOptions);\n        RewardScoreService rewardScoreService2 = (RewardScoreService) yarClient2.useService(RewardScoreService.class);\n        System.out.println(rewardScoreService2.post(1, 20));\n    }\n\n}\n```\n\nJava客户端并行调用这两个服务\n---\n\n并发调用的 api 均按照 php c 扩展版本的 yar 协议为准 原版 api http://php.net/manual/zh/class.yar-concurrent-client.php\n\n`YarConcurrentClient.call`方法注册，\n\n`YarConcurrentClient.loop`并行调用，\n\n`YarConcurrentClient.reset`清空任务。\n\n回调函数需要继承实现`YarConcurrentCallback`里面定义了两个方法：`async`是针对并行调用发出之后立即执行的任务，而`success`则是每个请求之后返回的结果。\n\n```java\npublic class YarConcurrentClientTest extends TestCase {\n\n    /**\n     * rpc api 地址\n     */\n    static String uri = \"http://mengkang.net/demo/yar-server/RewardScoreService.php\";\n\n    public class callback extends YarConcurrentCallback {\n\n        public void async() {\n            System.out.println(\"现在, 所有的请求都发出去了, 还没有任何请求返回\");\n        }\n\n        public Object success() {\n            return retValue;\n        }\n\n    }\n\n    public class errorCallback extends YarConcurrentErrorCallback {\n        @Override\n        void error() {\n            System.out.println(\"出错了\");\n        }\n    }\n\n    public void testLoop() throws Exception {\n\n        String packagerName = YarConfig.getString(\"yar.packager\");\n        YarClientOptions yarClientOptions = new YarClientOptions();\n        yarClientOptions.setConnect_timeout(2000);\n\n        // 第一种调用方式\n        YarConcurrentClient.call(new YarConcurrentTask(uri, \"support\", new Object[]{1, 2}, packagerName, new callback()));\n        \n        // 第二种调用方式 增加一些额外配置选项\n        YarConcurrentClient.call(new YarConcurrentTask(uri, \"support\", new Object[]{1, 2}, packagerName, new callback(),yarClientOptions));\n\n        // 第三种调用方式 有正确的回调和错误的回调\n        YarConcurrentClient.call(new YarConcurrentTask(uri,\"post\",new Object[]{1,2},packagerName,new callback(),new errorCallback()));\n        \n        // 第四种调用方式 在第三种的基础上增加额外的配置选项\n        YarConcurrentClient.call(new YarConcurrentTask(uri,\"post\",new Object[]{1,2},packagerName,new callback(),new errorCallback(),yarClientOptions));\n\n        YarConcurrentClient.loop(new callback());\n        YarConcurrentClient.reset();\n    }\n}\n```\n# 其他\n更多详细的说明，请查看 [wiki](https://github.com/zhoumengkang/yar-java-client/wiki)\n\n有任何使用的问题和技术交流，欢迎使用 [issues](https://github.com/zhoumengkang/yar-java-client/issues)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhoumengkang%2Fyar-java-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhoumengkang%2Fyar-java-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhoumengkang%2Fyar-java-client/lists"}