Releases: moleculerjs/moleculer
v0.14.6
New NewRelic zipkin tracing exporter
Thanks for @jalerg, there is a NewRelic tracing exporter. PR #713
// moleculer.config.js
{
tracing: {
enabled: true,
events: true,
exporter: [
{
type: 'NewRelic',
options: {
// NewRelic Insert Key
insertKey: process.env.NEW_RELIC_INSERT_KEY,
// Sending time interval in seconds.
interval: 5,
// Additional payload options.
payloadOptions: {
// Set `debug` property in payload.
debug: false,
// Set `shared` property in payload.
shared: false,
},
// Default tags. They will be added into all span tags.
defaultTags: null,
},
},
],
},
}
Other changes
v0.14.5
Wrapping service methods with middlewares
New localMethod
hook in middlewares which wraps the service methods.
Example
// my.middleware.js
module.exports = {
name: "MyMiddleware",
localMethod(next, method) {
return (...args) => {
console.log(`The '${method.name}' method is called in '${method.service.fullName}' service.`, args);
return handler(...args);
}
}
}
Schema for service methods
Similar for action schema, you can define service methods with schema. It can be useful when middleware wraps service methods.
Example for new method schema
// posts.service.js
module.exports = {
name: "posts",
methods: {
list: {
async handler(count) {
// Do something
return posts;
}
}
}
};
Changes
v0.14.4
v0.14.3
v0.14.2
Support custom loggers
If you have your custom logger you should wrap it into a Logger
class and implement the getLogHandler
method.
Using a custom logger
// moleculer.config.js
const BaseLogger = require("moleculer").Loggers.Base;
class MyLogger extends BaseLogger {
getLogHandler(bindings) {
return (type, args) => console[type](`[MYLOG-${bindings.mod}]`, ...args);
}
}
module.exports = {
logger: new MyLogger()
};
v0.14.1
v0.14.0
🎉 First 0.14 stable version. Full changelog: https://github.com/moleculerjs/moleculer/blob/master/CHANGELOG.md#0140-2020-02-12
Migration guide: https://github.com/moleculerjs/moleculer/blob/master/docs/MIGRATION_GUIDE_0.14.md
Changes since 0.14.0-rc2
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 withnpm 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 }
]
}
}
}
};
v0.13.13
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 withnpm 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 }
]
}
}
}
};
v0.14.0-rc2
Changes
- fix action hooks merging issue
v0.14.0-rc1
Minimum Node version is 10 (BREAKING)
The Node version 8 LTS lifecycle has been ended on December 31, 2019, so the minimum required Node version is 10.
Bluebird dropped (BREAKING)
The Bluebird Promise library has been dropped from the project because as of Node 10 the native Promise
implementation is faster (2x) than Bluebird.
Nonetheless, you can use your desired Promise library, just set the Promise
broker options.
Using Bluebird
const BluebirdPromise = require("bluebird");
// moleculer.config.js
module.exports = {
Promise: BluebirdPromise
};
Please note, the given Promise library will be polyfilled with
delay
,method
,timeout
andmapSeries
methods (which are used inside Moleculer core modules).
Better service event handler testing
Service class has a new emitLocalEventHandler
method in order to call a service event handler directly. It can be useful in Unit Tests because you don't need to emit an event with broker.emit
.
Example
// posts.service.js
module.exports = {
name: "posts",
events: {
async "user.created"(ctx) {
this.myMethod(ctx.params);
}
}
};
// posts.service.spec.js
describe("Test events", () => {
const broker = new ServiceBroker({ logger: false });
const svc = broker.createService(PostService);
beforeAll(() => broker.start());
afterAll(() => broker.stop());
describe("Test 'user.created' event", () => {
beforeAll(() => svc.myMethod = jest.fn());
afterAll(() => svc.myMethod.mockRestore());
it("should call the event handler", async () => {
await svc.emitLocalEventHandler("branch.closed", { a: 5 });
expect(svc.myMethod).toBeCalledTimes(1);
expect(svc.myMethod).toBeCalledWith({ a: 5 });
});
});
});
Stream objectMode
support
Thanks for @artur-krueger, the request & response streams support objectMode
, as well. You can also send Javascript objects via streams.
Example
Other changes
- In metrics, the
defaultBuckets
value has been changed to milliseconds. - add
caller
label for EVENT_RECEIVED_TOTAL metric. - the heartbeat logic can be disabled by
heartbeatInterval: 0
broker option. - remove the new
currentContext
property inService
&ServiceBroker
. - in Service instances the original schema (before applying mixins) is available via
this.originalSchema
.