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
nextno 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 |