perfumer / 微服务
处理 Perfumer 微服务的类集
Requires
- ext-json: *
- guzzlehttp/guzzle: ~6|~7
- ramsey/uuid: ~4
Requires (Dev)
- dev-release
- v5.6.0
- v5.5.2
- v5.5.1
- v5.5.0
- v5.4.1
- v5.4.0
- v5.3.3
- v5.3.2
- v5.3.1
- v5.3.0
- v5.2.0
- v5.1.1
- v5.1.0
- v5.0.0
- v4.6.7
- v4.6.6
- v4.6.5
- v4.6.4
- v4.6.3
- v4.6.2
- v4.6.1
- v4.6.0
- v4.5.0
- v4.4.2
- v4.4.1
- v4.4.0
- v4.3.1
- v4.3.0
- v4.2.0
- v4.1.2
- v4.1.1
- v4.1.0
- v4.0.0
- v3.8.0
- v3.7.0
- v3.6.0
- v3.5.3
- v3.5.2
- v3.5.1
- v3.5.0
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.1
- v3.3.0
- v3.2.0
- v3.1.0
- v3.0.0
- v2.2.0
- v2.1.0
- v2.0.0
- v1.4.6
- v1.4.5
- v1.4.4
- v1.4.3
- v1.4.2
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.1
- v1.0.0
- dev-master
- dev-hotfix
This package is auto-updated.
Last update: 2024-09-28 09:00:03 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
。生成后的注解创建了许多东西
- 在
generated/src/Crm/Request/User/GetUserRequest.php
处的基请求类 - 在
src/Crm/Request/User/GetUserRequest.php
处的空请求类 - 在
generated/src/Crm/Response/User/GetUserResponse.php
处的基响应类 - 在
src/Crm/Response/User/GetUserResponse.php
处的空响应类 - 在
generated/src/Crm/Crm.php
处的基类和/或类中的getUser
方法 - 如果缺少,则在
src/Crm/Crm.php
处的空类。
如您所注意到的,请求类路径是通过以下方案生成的
src/{{microservice}}/Request/{{model}}/{{action}}{{submodule}}Request.php
与响应类相同
src/{{microservice}}/Response/{{model}}/{{action}}{{submodule}}Response.php
其中 microservice
、model
、action
和 submodule
是注解属性。还有参数可以设置
url
表示将请求哪个 URL。默认等于模型值。request_method
表示要与之请求的 HTTP 方法。fields
- 要设置到请求 json 体的参数数组。response_fields
- 从响应体获取的参数数组。
为了方便,有一些预定义的注解,它们会自动设置一些参数。例如
@GetModel(microservice="crm", model="user", fields={"id"})
是上述完整注解的简写。
贡献
请随意提交任何 pull 请求。