Yar是鸟哥开发的轻量级rpc框架,纯 C 语言编写。闲话少叙,开始干活
安装&配置
pecl install msgpack //用于二进制流传输
pecl install yar //安装PHP yar扩展
composer require reprover/laravel-yar -vvv //安装扩展包
php artisan vendor:publish --tag="laravel-yar" //生成配置文件
将根目录下的/vendor/reprover/laravel-yar/config中的三个文件( yar.php:yar 运行时配置 yar-services.php:rpc 服务注册映射表 yar-map.php:mapName 与 接口参数对应表)复制到根目录的config目录下
服务端修改中间件 跳过 csrf 验证
app/Http/Middleware/VerifyCsrfToken.php 中的 except 数组中加上
protected $except = [
'/yar/*',
];
使用
每次访问/yar时会通过 Reprover/LaravelYar/Controllers/ 引导执行 app/Services目录下的服务。客户端可以通过路由地址进行访问:http://127.0.0.1:80/yar/TestServices //解释:默认路由到/app/Services/TestService.php
TestService.php
namespace App\Services;
use Reprover\LaravelYar\YarService;
class TestServices extends YarService
{
public static function test_method($parameters)
{
return $parameters;
}
public function Example()
{
echo 111;
}
}
image.png
客户端
1.配置三个文件 yar.php:yar 运行时配置 yar-services.php:rpc 服务注册映射表 yar-map.php:mapName 与 接口参数对应表)
/config/yar-services.php
/*
* 配置不同的模块对应的服务端基本信息,对应的uri和服务名称
* */
return [
'Example' => [
'path' => 'http://127.0.0.1/yar/', 'services' => [//services数组下分别表示此模块下的服务别名=>服务名。 服务别名可以自定义,在当前服务中使用。服务名对应的是服务方的服务名称。
'TestServices' => 'TestServices',//可以对应很多service
'TestServices1' => 'TestServices1',//可以对应很多service
]
],
'Example2' => [
'path' => 'http://127.0.0.1/.com/yar/', 'services' => [
'TestServices' => 'TestServices',//可以对应很多service
]
],
];
/config/yar-map.php
/*
* 指定使用某个模块的某个服务的某个方法
* */
return [
'get_example' => [
'module' => 'Example',
'service' => 'TestServices',
'method' => 'test_method',
'connect_timeout' => 1000,
'read_timeout' => 5000,
]
];
同步调用
最简易:
use Reprover/LaravelYar/Yar;
$ret = Yar::get_example([123]);
var_dump($ret);
最标准:
$yarClient = new \Reprover\LaravelYar\Yar('get_example');
$ret = $yarClient->call([123]);
异步调用
最简易:
\Reprover\LaravelYar\Yar::asyncCall("get_example",[123],function($ret, $callbackinfo){
var_dump($ret);
});
\Reprover\LaravelYar\Yar::asyncCall("get_example",[456],function($ret, $callbackinfo){
var_dump($ret);
});
\Reprover\LaravelYar\Yar::loop();
最标准:
$yarClient = new \Reprover\LaravelYar\Yar('test_get', true);
$yarClient->setCallback(function($ret, $callbackinfo){
var_dump($ret);
});
$yarClient->call([789]);
$yarClient::loop();