Moleculer suporta middlewares. É o mesmo que plugins em outros frameworks. O middleware é um Object
com funções wrapper & hook. Ele permite encapsular manipuladores de ação, manipuladores de eventos, métodos do broker e hook de eventos de ciclo de vida.
Exemplo
// awesome.middleware.js |
Encapsulando Manipuladores
Alguns hooks podem ser encapsulados. Significa que você pode encapsular o manipulador original e retornar uma nova Função. Hooks encapsuláveis são os quais o primeiro parâmetro é next
.
Encapsular manipulador de ação local
const MyDoSomethingMiddleware = { |
Exemplo do middleware validador
const MyValidator = { |
O next
é o manipulador original ou o seguinte manipulador encapsulado. O middleware deve retornar o handler
original ou um novo manipulador encapsulado. Como você pode ver acima, o middleware verifica se a ação tem uma propriedade params
. Se sim, ele retornará um manipulador encapsulado que chama o módulo do validador antes de chamar o handler
original. Se a propriedade params
não for definida, simplesmente retorna o handler
original (ignorando o encapsulamento).
Se você não chamar o original
next
no middleware ele quebrará a requisição. Isto pode ser usado em cachers. Por exemplo, se ele encontrar os dados solicitados no cache, retornará os dados em cache ao invés de chamar onext
.
Exemplo de middleware cacher
const MyCacher = { |
O
next()
sempre retorna umaPromise
. Então você também pode ter acesso a respostas e manipulá-las.
Decorar módulos centrais (estender funcionalidade)
As funções Middleware podem ser usadas para adicionar novos recursos às classes ServiceBroker
ou Service
.
Decore o broker com um novo método allCall
// moleculer.config.js |
Chame o novo método para chamar $node.health
em cada um dos nós:
const res = await broker.allCall("$node.health"); |
Hooks
localAction(next, action)
Este hook encapsula os manipuladores de ações locais.
// my.middleware.js |
remoteAction(next, action)
Este hook encapsula os manipuladores de ações remotas.
// my.middleware.js |
localEvent(next, event)
Este hook encapsula os manipuladores de eventos locais.
// my.middleware.js |
localMethod(next, method)
Este hook encapsula métodos de serviços locais.
// my.middleware.js |
createService(next)
Este hook encapsula o método broker.createService
.
// my.middleware.js |
destroyService(next)
Este hook encapsula o método broker.destroyService
// my.middleware.js |
call(next)
Este hook encapsula o método broker.call
.
// my.middleware.js |
mcall(next)
Este hook encapsula o método broker.mcall
.
// my.middleware.js |
emit(next)
Este hook encapsula o método broker.emit
.
// my.middleware.js |
broadcast(next)
Este hook encapsula o método broker.broadcast
.
// my.middleware.js |
broadcastLocal(next)
Este hook encapsula o método broker.broadcastLocal
.
// my.middleware.js |
serviceCreated(service)
(sync)
Este hook é chamado após a criação de um serviço local.
// my.middleware.js |
serviceStarting(service)
(async)
Este hook é chamado antes do início do serviço.
// my.middleware.js |
serviceStarted(service)
(async)
Este hook é chamado após o início do serviço.
// my.middleware.js |
serviceStopping(service)
(async)
Este hook é chamado antes da parada do serviço.
// my.middleware.js |
serviceStopped(service)
(async)
Este hook é chamado após a parada do serviço.
// my.middleware.js |
registerLocalService(next)
Este hook encapsula o método de registro de serviços locais.
// my.middleware.js |
serviceCreating(service, schema)
Este hook é chamado durante a criação de serviço local (depois que os mixins são aplicados, portanto o esquema de serviço está mesclado completamente).
// my.middleware.js |
transitPublish(next)
Este hook é chamado antes de enviar um pacote de comunicação.
// my.middleware.js |
transitMessageHandler(next)
Este gancho é chamado antes que o módulo de trânsito receba & analise uma mensagem recebida.
// my.middleware.js |
transporterSend(next)
Este hook é chamado após a serialização, mas antes do transportador enviar um pacote de comunicação.
// my.middleware.js |
transporterReceive(next)
Este hook é chamado depois que o transportador recebeu um pacote de comunicação, mas antes da serialização.
// my.middleware.js |
newLogEntry(type, args, bindings)
(sync)
Este hook é chamado quando um novo log de mensagens é criado.
// my.middleware.js |
created(broker)
(async)
Este hook é chamado quando o broker é criado.
// my.middleware.js |
starting(broker)
(async)
Este hook é chamado antes do broker iniciar.
// my.middleware.js |
started(broker)
(async)
Este hook é chamado após o broker iniciar.
// my.middleware.js |
stopping(broker)
(async)
Este hook é chamado antes do broker parar.
// my.middleware.js |
stopped(broker)
(async)
Este hook é chamado após o broker parar.
// my.middleware.js |
Middlewares internos
Muitos recursos integrados foram expostos como middlewares internos. Estes middlewares são carregados por padrão quando o broker é criado. No entanto, eles podem ser desativados definindo internalMiddlewares: false
nas opções do broker. Neste caso, você deve especificar explicitamente os middlewares necessários na opção middlewares: []
do broker.
Middlewares internos
Nome da classe | Tipo | Descrição |
---|---|---|
ActionHook |
Opcional | Hook de ações. Leia mais |
Validator |
Opcional | Validações de parâmetros. Leia mais |
Bulkhead |
Opcional | Funcionalidade Bulkhead. Leia mais |
Cacher |
Opcional | Middleware de cacher. Leia mais |
ContextTracker |
Opcional | Funcionalidade de rasteamento do Context. Leia mais |
CircuitBreaker |
Opcional | Funcionalidade Disjuntor. Leia mais |
Timeout |
Sempre | Funcionalidade Timeout. Leia mais |
Retry |
Sempre | Funcionaidade Retentativa. Leia mais |
Fallback |
Sempre | Funcionalidade Fallback. Leia mais |
ErrorHandler |
Sempre | Manipulação de erros. |
Rastreamento |
Opcional | Funcionalidade de rastreamento. Leia mais |
Métricas |
Opcional | Funcionalidade de métricas. Leia mais |
Debounce |
Opcional | Funcionalidade debounce. Leia mais |
Throttle |
Opcional | Funcionalidade Throttle. Leia mais |
Transmit.Encryption |
Opcional | Middleware de transmissão criptografada. Leia mais |
Transmit.Compression |
Opcional | Middleware de transmissão comprimida. Leia mais |
Debugging.TransitLogger |
Opcional | Logs de transporte. Leia mais |
Debugging.ActionLogger |
Opcional | Logs de Ações. Leia mais |
Acesso a middlewares internos
const { Bulkhead, Retry } = require("moleculer").Middlewares; |
Middlewares de Transmissão
Encriptação
O middleware de encriptação AES protege todas as comunicações interserviços que usam o módulo de transporte. Esse middleware usa a biblioteca interna cripto
.
// moleculer.config.js |
Compactação
O middleware de compactação reduz o tamanho das mensagens que passam pelo módulo de transporte. Este middleware usa a biblioteca interna zlib
.
// moleculer.config.js |
Depurar Middlewares
Transit Logger
O middleware de transporte permite rastrear facilmente as mensagens trocadas entre serviços.
// moleculer.config.js |
Lista de opções completa
Nome da classe | Tipo | Valor padrão | Descrição |
---|---|---|---|
logger |
Object ou Function |
null |
Classe de logger. Leia mais. |
logLevel |
String |
info |
Nível de log para o logger de console. Leia mais. |
logPacketData |
Boolean |
false |
Loga parâmetros do pacote |
folder |
Object |
null |
Pasta onde os logs serão escritos |
extension |
String |
.json |
Extensão do arquivo de log |
color.receive |
String |
grey |
Suporta todas as Cores de Chalk |
color.send |
String |
grey |
Suporta todas as Cores de Chalk |
packetFilter |
Array<String> |
HEARTBEAT |
Tipo de pacotes para ignorar |
Action Logger
O middleware Action Logger registra “como” os serviços são executados.
// moleculer.config.js |
Lista de opções completa
Nome da classe | Tipo | Valor padrão | Descrição |
---|---|---|---|
logger |
Object ou Function |
null |
Classe de logger. Leia mais. |
logLevel |
String |
info |
Nível de log para o logger de console. Leia mais. |
logParams |
Boolean |
false |
Loga parâmetros da requisição |
logMeta |
Boolean |
false |
Loga parâmetros de metadados |
folder |
String |
null |
Local da pasta onde os logs serão escritos |
extension |
String |
.json |
Extensão do arquivo de log |
color.request |
String |
yellow |
Suporta todas as Cores de Chalk |
color.response |
String |
cyan |
Suporta todas as Cores de Chalk |
colors.error |
String |
red |
Suporta todas as Cores de Chalk |
whitelist |
Array<String> |
["**"] |
Ações para logar. Usa o mesmo mecanismo de listagem permitida como no API Gateway. |
Taxa de Execução de Evento
Throttle
É uma redução pura e simples da taxa de acionamento. Fará com que o ouvinte do evento ignore uma parte dos eventos enquanto continua disparando aos ouvintes a uma taxa constante (mas reduzida). Mesma funcionalidade que o lodash’s _.throttle
. Para mais informações sobre a limitação verifique este artigo.
//my.service.js |
Debounce
Ao contrário da desaceleração, o debounce é uma técnica de manter a taxa de ativação exatamente 0 até um período de calma, e, em seguida, acionando o ouvinte exatamente uma vez. Mesma funcionalidade que o lodash’s _.debounce
. Para mais informações sobre como usar o debounce, cheque este artigo.
//my.service.js |
Carregando & Ampliando
Se você quiser usar os middlewares incorporados, use seus nomes na opção de broker middlewares[]
. Além disso, os Middlewares
podem ser facilmente estendidos com funções personalizadas.
Carregar o middleware pelo nome
// moleculer.config.js |