Быстрый минималистичный фреймворк для создания распределенных сервисов на node
microservice
[cool-badles-list]
npm install microservice
const Service = const service = name: 'test-service' version: '0.0.1' await serviceawait service // subscribe to task execution result (event-driven behavour)await service // "success" // run local task using load-balancer between distributed service instancesconst result = await serviceconsole // "success" // run remote task using transport service autodiscoveryconst result2 = await serviceconsole // "success"
Features
- promise-based
- single interaction interface between services mesh
- ability to create services using most suitable transport
- versioning support
- different modes: event-sourcing, command pattern
- features support: load balancing, services autodiscovery, request routing, fault injection, encryption {depens on the choosen transport}
- internal metrics, automati service map, request profiling {not yet implemented}
API
Init service instance
.init() => Promise(serviceInstance)
Происходит подключение указаных транспортов, настройка соединений и т.п. Данная операция должна быть выполнена при старте каждого сервиса.
const Service = const service = optionsawait service
options:
Name | Description | Format |
---|---|---|
name |
Required . Readable service name. |
string : ^[a-z0-9-_]+$ |
version |
Required . Service version. |
string : semver |
transports |
Required . List of supported transports and their settings. Default: [{"name":"local","type":"local","default":true}] |
array |
routes |
Routing table for external requests (in case if transport does not support routing). | object |
timeout |
Default task timeout in ms. | number |
slow |
Emit "slow" event after specified delay in ms. | number |
local |
Do not emit task events globally. Default: false |
boolean |
Add new service task
.add(task, method) => Promise()
.add(options | taskName, method) => Promise()
Name | Description | Format |
---|---|---|
task |
Required . undefined |
string : ^[a-z0-9-_.]+$ |
version |
string : version |
Run local task with distributed load-balancing environment
.run(task, ...arguments) => Promise(result)
.run(options, ...arguments) => Promise(result)
This task will be launched by the most suitable service instace. Other services can .subscribe
to the execution result.
Name | Description | Format |
---|---|---|
task |
Required . undefined |
string : ^[a-z0-9-_.]+$ |
local |
undefined Default: false |
boolean |
skipEvent |
undefined Default: false |
boolean |
timeout |
number |
|
slow |
number |
Run task from remote service.
.request(service, task, ...arguments) => Promise(result)
.request(options, ...arguments) => Promise(result)
Name | Description | Format |
---|---|---|
task |
Required . undefined |
string : ^[a-z0-9-_.]+$ |
service |
Required . undefined |
string : ^[a-z0-9-_]+$ |
timeout |
number |
|
slow |
number |
|
services |
array |
Subscribe to task execution result.
.subscribe(eventHandler) => Promise()
.subscribe(task, eventHandler) => Promise()
.subscribe(task, service, eventHandler) => Promise()
.subscribe(options, eventHandler) => Promise()
Name | Description | Format |
---|---|---|
task |
string : ^[a-z0-9-_.]+$ |
|
source |
string : ^[a-z0-9-_]+$ |
|
match |
object |
events
slow
Transports
Name | Description | Format |
---|---|---|
name |
Required . Transport name. |
string : ^[a-z0-9-_]+$ |
type |
Required . Transport driver name. |
string : ^[a-z0-9-_]+$ |
default |
Act as default transport. Default: false |
boolean |
Tests
To run the test suite, first install the dependencies, then run npm test:
$ npm install$ npm test