brightecapital / service-schema
微服务服务模式
1.10.0
2022-12-06 21:26 UTC
Requires
- php: ^7.1|^8.1
- justinrainbow/json-schema: ^5.2
- psr/container: ^1.0
- psr/log: ^1.0.2
Requires (Dev)
- phpspec/prophecy: ^1.16
- phpunit/phpunit: ^9.5
- squizlabs/php_codesniffer: ^3.5
- dev-master
- 1.10.0
- 1.9.7
- 1.9.6
- 1.9.5
- 1.9.4
- 1.9.3
- 1.9.2
- 1.9.1
- 1.9.0
- 1.4.3
- 1.4.2
- 1.4.1
- 1.4.0
- 1.3.9
- 1.3.8
- 1.3.7
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.9
- 1.2.8
- 1.2.7
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.9
- 1.1.8
- 1.1.7
- 1.1.6
- 1.1.5
- 1.1.4
- 1.1.3
- 1.1.2
- 1.1.1
- 1.1.0
- 1.0.9
- 1.0.8
- 1.0.7
- 1.0.6
- 1.0.5
- 1.0.4
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-fix/move-out-uuid-package
- dev-add-logger-to-service-factory
- dev-feature/phpcs
- dev-feature/BH-5865
- dev-add-logger
- dev-feature/BH-5351-producer-plain
- dev-feature/BH-5351
- dev-version2
- dev-feature/issue#1-namespacing
- dev-fix-tests
This package is auto-updated.
Last update: 2024-09-07 01:23:08 UTC
README
Service-schema 是一个工具,用于处理从代理或微服务之间的消息,实现了事件存储和 Saga 模式。基于“事件模式优先”的概念,service-schema 通过引入每个服务的模式来进一步提高效率,以便通过配置在不同事件中重复使用服务和模式。
- 每个事件可能有一个或多个监听它的服务
- 每个服务有一个模式,将用于验证输入的 JSON
配置
"require": { "brightecapital/service-schema": "^1.0.0" }
示例代码
configs
events.json
[ { "event": "Users.afterSaveCommit.Create", "services": [ "ServiceSchema\\Tests\\Service\\Samples\\CreateContact", "ServiceSchema\\Tests\\Service\\Samples\\CreateTask" ] }, { "event": "Users.afterSaveCommit.Update", "services": [ "ServiceSchema\\Tests\\Service\\Samples\\UpdateContact" ] } ]
在此 events.json 中
- 微服务正在监听 02 个事件:“Users.afterSaveCommit.Create”,“Users.afterSaveCommit.Update”
- 每个事件都有一个监听该事件的服务的列表
services.json
[ { "service": "ServiceSchema\\Tests\\Service\\Samples\\CreateContact", "schema": "/jsons/schemas/CreateContact.json", "callbacks": [ "ServiceSchema\\Tests\\Service\\Samples\\PushMessageToSqs", "ServiceSchema\\Tests\\Service\\Samples\\PushMessageToLog" ] }, { "service": "ServiceSchema\\Tests\\Service\\Samples\\UpdateContact", "schema": "/jsons/schemas/UpdateContact.json", "callbacks": [ "ServiceSchema\\Tests\\Service\\Samples\\PushMessageToLog" ] }, { "service": "ServiceSchema\\Tests\\Service\\Samples\\CreateTask", "schema": "/jsons/schemas/CreateTask.json" } ]
在此 services.json 中
- 有 03 个服务:“ServiceSchema\Tests\Service\Samples\CreateContact”,“ServiceSchema\Tests\Service\Samples\UpdateContact”,“ServiceSchema\Tests\Service\Samples\CreateTask”
- 每个服务都有一个模式和一系列回调服务
服务模式
CreateContact.json
{ "type": "object", "properties": { "event": { "type": "string", "minLength": 0, "maxLength": 256 }, "time": { "type": "string", "minLength": 0, "maxLength": 256 }, "payload": { "type": "object", "properties": { "user": { "type": "object", "properties": { "data": { "type": "object" }, "class": { "type": "string", "default": "\\App\\Entity\\User" } }, "required": [ "data" ] }, "account": { "type": "object", "properties": { "data": { "type": "object" }, "class": { "type": "string", "default": "\\App\\Entity\\Account" } }, "required": [ "data" ] } }, "required": [ "user", "account" ], "additionalProperties": false } }, "required": [ "event", "payload" ], "additionalProperties": true }
在此 CreateContact.json 中
- 消息需要包含 "name" 和 "payload" 字段
- "payload" 需要 "user" 和 "account" 字段
- "user" 需要 "data" 字段
- "account" 需要 "data" 字段
事件
$event = new Event(); $event->setName("Users.afterSaveCommit.Create"); $event->setTime("20190730123000"); $event->setPayload(["user" => ["data" => ["name" => "Ken"]], "account" => ["data" => ["name" => "Brighte"]]]); $message = $event->toJson(); // '{"name":"Users.afterSaveCommit.Create","time":"20190730123000","payload":{"user":{"data":{"name":"Ken"}},"account":{"data":{"name":"Brighte"}}}}' // this message is used to push to SQS or other services
服务
namespace ServiceSchema\Tests\Service\Samples; use ServiceSchema\Event\Message; use ServiceSchema\Event\MessageInterface; use ServiceSchema\Service\Service; use ServiceSchema\Service\ServiceInterface; class CreateContact extends Service implements ServiceInterface { public function consume(MessageInterface $event = null) { echo "CreateContact"; return new Message(); } }
处理器
// Receive message from SQS or other services $message = '{"name":"Users.afterSaveCommit.Create","time":"20190730123000","payload":{"user":{"data":{"name":"Ken"}},"account":{"data":{"name":"Brighte"}}}}'; // config the Processor $processor = new Processor(["events.json"], ["services.json"], "serviceSchemaDir"); // process the message $result = $processor->process($message); /* * In this example, event "Users.afterSaveCommit.Create" has 02 services listening to it (configued in events.json) * "ServiceSchema\\Tests\\Service\\Samples\\CreateContact", "ServiceSchema\\Tests\\Service\\Samples\\CreateTask" * When $processor->process(message): CreateContact->run(Event) and CreateTask->run(Event) will be executed. * Service CreateContact has 02 callback services (configured in services.json): * "ServiceSchema\\Tests\\Service\\Samples\\PushMessageToSqs","ServiceSchema\\Tests\\Service\\Samples\\PushMessageToLog" * When CreateContact->run(Event) returns an Event then PushMessageToSqs->run(Event) and PushMessageToLog->run(Event) will be executed */
UUID
使用 Ramsey/Uuid 生成事件 ID
测试
请参阅测试,了解事件、服务、模式和处理器使用的示例配置
- tests/jsons/configs/events.json:事件的配置
- tests/jsons/config/services.json:服务的配置
- tests/jsons/configs/schemas/:示例服务模式(CreateContact.json、CreateTask.json、UpdateContact.json)
- tests/Main/ProcessorTest.php:如何配置和运行处理器