定制 abovesky/laravel-yar 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

abovesky/laravel-yar

Composer 安装命令:

composer require abovesky/laravel-yar

包简介

Yar的Laravel封装

README 文档

README

安装&配置

  1. 当前环境装有 yar 、 msgpack 扩展:
pecl install msgpack
pecl install yar
  1. 在当前项目下执行:
composer require abovesky/laravel-yar -vvv
  1. 配置
php artisan vendor:publish --provider="Abovesky\LaravelYar\ServiceProvider"

会复制三个配置文件到 config.php 目录下,分别为 yar.php:yar 运行时配置 yar-services.php:rpc 服务注册映射表 yar-map.php:mapName 与 接口参数对应表

  1. 改中间件 在app/Http/Middleware/VerifyCsrfToken.php 中的 except 数组中加上
protected $except = [
    '/yar/*',
];

跳过 csrf 验证

原理解释

同一个 Laravel 框架可以提供多个不同模块的服务,使用 url 表示其模块地址和服务(后文讲),在不同服务中注册不同的方法去执行。 客户端通过对应的地址执行方法,这个时候 yar 使用其自定义的规则去 curl 服务端,取回数据。在同机器上速度远远大于正常的 http 请求。 说不清。。自己百度。。

使用

服务端

我们注册了一个路由用来代替 yar example 中的 server.php ,每次访问时会通过 Abovesky/LaravelYar/Controllers/ 引导执行 app/Services目录下的服务。客户端可以通过路由地址进行访问:

http://hostname/yar/{service}

在App/Services中的文件需 extends Abovesky/LaravelYar/YarServices

Example Code

<?php
namespace App\Services;

use Abovesky\LaravelYar\YarService;

class TestService extends YarService
{
    function test_method($parameters)
    {
        return ['parameter' => $parameters];
    }
}

这样就是一个服务,我们可以直接通过浏览器访问/yar/TestServices来查看服务注册了的方法,也可以直接使用客户端请求。

客户端

客户端则是我们封装了一个类用于同步/异步请求,并进行了接口的封装。

  1. 配置。 要将所使用的服务与模块在config/yar-services.php中进行配置,默认有示例文件:
<?php
    return [
        'Example' => [
            'path' => 'http://example.test/yar/', 'services' => [
            'ExampleService' => 'Example',
            'Example2Service' => 'Example2',
        ]
    ],
];

表示有一个Example模块(这个名字可以自定义的),path则是对应的地址,注意url后的 / 要加上。 services数组下分别表示此模块下的服务别名=>服务名。 服务别名可以自定义,在当前服务中使用。对应的是服务方的服务名称。 2. 配置 map

<?php
return [
    'get_example' => [
        'module' => 'Example',
        'service' => 'ExampleService',
        'method' => 'getExample',
        'connect_timeout' => 1000,
        'read_timeout' => 5000,
    ]
];

get_example 是apiName,其中定义的就是这个接口的参数。module是模块,service是服务,method则是在service中定义的方法。使用方法必须先在yar-services中定义,目前没有做异常处理,如果调用到不存在的方法或服务会直接抛出。

  1. 使用 同步调用
  • 最简易:
<?php 
use Abovesky/LaravelYar/Yar;

$ret = Yar::test_get([123]);
var_dump($ret);
  • 最标准:
<?php

$yarClient = new \Reprover\LaravelYar\Yar('test_get');
$ret = $yarClient->call([123]);

异步调用

  • 最简易:
<?php
\Abovesky\LaravelYar\Yar::asyncCall("test_get",[123],function($ret, $callbackinfo){
    var_dump($ret);
});
\Abovesky\LaravelYar\Yar::asyncCall("test_get",[456],function($ret, $callbackinfo){
    var_dump($ret);
});
\Abovesky\LaravelYar\Yar::loop();
  • 最标准:
<?php
$yarClient = new \Abovesky\LaravelYar\Yar('test_get', true);
$yarClient->setCallback(function($ret, $callbackinfo){
                            var_dump($ret);
                        });
$yarClient->call([789]);
$yarClient::loop();

使用上需要注意的问题

  1. curl使用当前环境作为基准,也就是说,使用 Laradock 类似的环境,将 nginx 作为 docker 提供服务的,会出现 curl 找不到服务器的报错。
  2. 远程服务调用过程中,可能会出现其他人恶意访问的情况,注意添加ip白名单
  3. 鸟哥的扩展优点在于快,缺点呢个人感觉是使用上的"优雅"问题。但是这种"优雅"必然是以牺牲性能为代价的。在 Laravel 中,使用 Laravel 的方式去实现 Yar,我觉得应该是最标准的方式了。
  4. 其他比如 procotol 等慢慢添加。有问题欢迎 issue 。

abovesky/laravel-yar 适用场景与选型建议

abovesky/laravel-yar 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10 次下载、GitHub Stars 达 0, 最近一次更新时间为 2021 年 08 月 06 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 abovesky/laravel-yar 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 abovesky/laravel-yar 我们能提供哪些服务?
定制开发 / 二次开发

基于 abovesky/laravel-yar 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 10
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2021-08-06