perfumer/微服务

本包的最新版本(v5.6.0)没有提供许可信息。

处理 Perfumer 微服务的类集

v5.6.0 2024-08-23 12:38 UTC

README

这是一个用于请求 Perfumerlabs 微服务的库。目前支持以下微服务:

所有类都是基于注解自动生成的。

快速示例

use Perfumer\Microservices\Forms\Forms;
use Perfumer\Microservices\Forms\Request\Modules\GetModulesRequest;

/** @var Forms $service */
$service = $container->get('microservices.forms');

$request = new GetModulesRequest();

$response = $service->getModules($request);

var_dump($response->modules);

HTTP 事务

库支持 HTTP 事务。机制非常简单。您连接存储提供者。然后写入事务,之后在 commit 方法中,事务中的所有 http-requests 都会存储到该存储中。

如果请求失败,则其数据将持久化到存储中。然后您可以在守护程序或 crontab 中重试请求。

事务示例

use Perfumer\Microservices\Transaction\Transaction;
use Perfumer\Microservices\Transaction\TransactionProvider\PropelProvider;
use Perfumer\Microservices\Forms\Request\Module\CreateModuleRequest;

/** @var Forms $service */
$service = $container->get('microservices.forms');

// You can add your own providers
// Currently only PropelProvider is here
$transaction = new Transaction(new PropelProvider());

$request1       = new CreateModuleRequest();
$request1->name = 'foo';

$transaction->add(
    $service,
    $request1,
    function (Forms $service, $request1) {
        return $sed->createModule($request1);
    }
);

$request2       = new CreateModuleRequest();
$request2->name = 'bar';

$transaction->add(
    $service,
    $request2,
    function (Forms $service, $request2) {
        return $sed->createModule($request2);
    }
);

$transaction->commit();

示例:我们使用的守护程序工作进程重新发送请求

while (true) {
    $transaction_service = new Transaction(new PropelProvider());

    $transaction_request = TransactionRequestQuery::create()
        ->filterByUpdatedAt((new \DateTime())->modify('-1 minute'), Criteria::LESS_EQUAL)
        ->orderByUpdatedAt()
        ->findOne();

    if ($transaction_request) {
        $http_request = new HttpRequest();
        $http_request->url = $transaction_request->getUrl();
        $http_request->method = $transaction_request->getMethod();
        $http_request->timeout = $transaction_request->getTimeout();
        $http_request->json = $transaction_request->getJson();
        $http_request->headers = $transaction_request->getHeaders();

        try {
            $response = $transaction_service->sendHttpRequest($http_request);

            if (in_array($response->getStatusCode(), [200, 201])) {
                $transaction_request->delete();
            }
        } catch (\Throwable $e) {

        }

        if (!$transaction_request->isDeleted()) {
            $transaction_request->setUpdatedAt(new \DateTime());
            $transaction_request->save();
        }
    } else {
        sleep(5);
    }
}

请求调试

如果向 Request 类提供了 _debug=true,那么在请求期间微服务将 Guzzle 客户端的 debug=true 选项设置为 true。如果启用,Guzzle 将打印一些有关请求的信息到 stdout。

use Perfumer\Microservices\Microservice;
use Perfumer\Microservices\Request;

$request = new Request();
$request->_request_method = 'post';
$request->_request_url = '/my-url';
$request->_debug = true;
$request->setBody(['foo' => 'bar']);

$microservice = new Microservice([
    'host' => 'https://example.com'
]);

$microservice->request($request);

请求捕获

库还支持任何请求捕获服务器,以便更方便地进行调试。请求捕获服务器将请求原样打印出来。在谷歌搜索中有很多免费的在线请求捕获服务。

任何微服务类都允许在构造函数选项中指定 request_catcher_host 参数。如果已定义,并且向 Request 类提供了 _catch=true,则微服务类也将向该主机发送特殊请求。该请求包含请求和响应的完整详细信息。

use Perfumer\Microservices\Microservice;
use Perfumer\Microservices\Request;

$request = new Request();
$request->_request_method = 'post';
$request->_request_url = '/my-url';
$request->_catch = true;
$request->setBody(['foo' => 'bar']);

$microservice = new Microservice([
    'host' => 'https://example.com',
    'request_catcher_host' => 'https://request-catcher-server.com'
]);

// HTTP request details as-is are sent to `https://request-catcher-server.com` also
$microservice->request($request);

如何编写 HTTP 方法的注解

例如,我们有一个 Crm 服务,并希望为 GET /user 请求生成注解。我们打开 src/Contract/Crm.php 并添加类似以下的类注解:

@RequestModel(microservice="crm", model="user", action="get", submodel="User", url="/user", fields={"id"}, response_fields={"user"}, request_method="get")

要执行生成,请启动 php generate.php。生成后的注解创建了许多东西

  1. generated/src/Crm/Request/User/GetUserRequest.php 处的基请求类
  2. src/Crm/Request/User/GetUserRequest.php 处的空请求类
  3. generated/src/Crm/Response/User/GetUserResponse.php 处的基响应类
  4. src/Crm/Response/User/GetUserResponse.php 处的空响应类
  5. generated/src/Crm/Crm.php 处的基类和/或类中的 getUser 方法
  6. 如果缺少,则在 src/Crm/Crm.php 处的空类。

如您所注意到的,请求类路径是通过以下方案生成的

src/{{microservice}}/Request/{{model}}/{{action}}{{submodule}}Request.php

与响应类相同

src/{{microservice}}/Response/{{model}}/{{action}}{{submodule}}Response.php

其中 microservicemodelactionsubmodule 是注解属性。还有参数可以设置

  • url 表示将请求哪个 URL。默认等于模型值。
  • request_method 表示要与之请求的 HTTP 方法。
  • fields - 要设置到请求 json 体的参数数组。
  • response_fields - 从响应体获取的参数数组。

为了方便,有一些预定义的注解,它们会自动设置一些参数。例如

@GetModel(microservice="crm", model="user", fields={"id"})

是上述完整注解的简写。

贡献

请随意提交任何 pull 请求。