Moleculer
Moleculer is a progressive microservices framework for Node.js.
Website: https://moleculer.services
Documentation: https://moleculer.services/docs
What's included
- Promise-based solution
- request-reply concept
- support streams
- support event driven architecture with balancing
- built-in service registry & dynamic service discovery
- load balanced requests & events (round-robin, random, cpu-usage, latency)
- many fault tolerance features (Circuit Breaker, Bulkhead, Retry, Timeout, Fallback)
- supports middlewares
- supports versioned services
- service mixins
- built-in caching solution (memory, Redis)
- pluggable transporters (TCP, NATS, MQTT, Redis, NATS Streaming, Kafka)
- pluggable serializers (JSON, Avro, MsgPack, Protocol Buffer, Thrift)
- pluggable validator
- multiple services on a node/server
- all nodes are equal, no master/leader node
- parameter validation with fastest-validator
- built-in health monitoring & metrics
- official API gateway module and many other modules...
Installation
$ npm install moleculer --save
or
$ yarn add moleculer
Create your first microservice
This example shows you how to create a small service with an add
action which can add two numbers and how to call it.
const { ServiceBroker } = require("moleculer");
let broker = new ServiceBroker({ logger: console });
broker.createService({
name: "math",
actions: {
add(ctx) {
return Number(ctx.params.a) + Number(ctx.params.b);
}
}
});
broker.start()
.then(() => broker.call("math.add", { a: 5, b: 3 }))
.then(res => console.log("5 + 3 =", res))
.catch(err => console.error(`Error occurred! ${err.message}`));
Try it on Runkit
Create a Moleculer project
Use the Moleculer CLI tool to create a new Moleculer based microservices project.
-
Install moleculer-cli globally
$ npm install moleculer-cli -g
-
Create a new project (named first-demo
)
$ moleculer init project first-demo
Press Y on API Gateway & npm install
-
Open project folder
$ cd first-demo
-
Start project
$ npm run dev
-
Open the http://localhost:3000/ link in your browser. It shows a start page which contains two links to call the greeter
service via API gateway.
:tada:Congratulations! Your first Moleculer based microservices project is created. Read our documentation to learn more about Moleculer.
Official modules
We have many official modules for Moleculer. Check our list!
Supporting
Moleculer is an open source project. It is free to use for your personal or commercial projects. However, developing it takes up all my free time to make it better and better on a daily basis. If you like Moleculer framework, please support it.
Thank you very much!
Documentation
You can find here the documentation.
Changelog
See CHANGELOG.md.
Security contact information
To report a security vulnerability, please use the Tidelift security contact.
Tidelift will coordinate the fix and disclosure.
Contributions
We welcome you to join to the development of Moleculer. Please read our contribution guide.
License
Moleculer is available under the MIT license.
3rd party licenses
Contact
Copyright (c) 2016-2018 MoleculerJS
0.13.13 (2020-02-11)
AMQP 1.0 transporter
Thanks for @vladir95, AMQP 1.0 transporter is available.
Please note, it is an experimental transporter. Do not use it in production yet!
// moleculer.config.js
module.exports = {
transporter: "amqp10://activemq-server:5672"
};
To use this transporter install the rhea-promise
module with npm install rhea-promise --save
command.
Transporter options
Options can be passed to rhea.connection.open()
method, the topics, the queues, and the messages themselves.
Connect to 'amqp10://guest:guest@localhost:5672'
// moleculer.config.js
module.exports = {
transporter: "AMQP10"
};
Connect to a remote server
// moleculer.config.js
module.exports = {
transporter: "amqp10://activemq-server:5672"
};
Connect to a remote server with options & credentials
// moleculer.config.js
module.exports = {
transporter: {
url: "amqp10://user:pass@activemq-server:5672",
eventTimeToLive: 5000,
heartbeatTimeToLive: 5000,
connectionOptions: { // rhea connection options https://github.com/amqp/rhea#connectoptions, example:
ca: "", // (if using tls)
servername: "", // (if using tls)
key: "", // (if using tls with client auth)
cert: "" // (if using tls with client auth)
},
queueOptions: {}, // rhea queue options https://github.com/amqp/rhea#open_receiveraddressoptions
topicOptions: {}, // rhea queue options https://github.com/amqp/rhea#open_receiveraddressoptions
messageOptions: {}, // rhea message specific options https://github.com/amqp/rhea#message
topicPrefix: "topic://", // RabbitMq uses '/topic/' instead, 'topic://' is more common
prefetch: 1
}
};
Redis Cluster feature in Redis transporter
Thanks for AAfraitane, use can connect to a Redis Cluster with the Redis transporter.
Connect to Redis cluster
// moleculer.config.js
module.exports = {
transporter: {
type: "Redis",
options: {
cluster: {
nodes: [
{ host: "localhost", port: 6379 },
{ host: "localhost", port: 6378 }
]
}
}
}
};
<a name="0.13.12"></a>