zerorest v0.11.2
ZeroREST
Build microservices with ZeroMQ.
Provides familiar express-style API as an abstraction of 0mq request-reply sockets for building REST-like microservices.
Installation
You will need ZeroMQ installed: Get ZeroMQ
npm install zerorest
Benchmarks
ZeroREST
- 50k concurrent requests
- 3859.51 requests/sec
- 0.2591 ms/request
Raw Node.js HTTP
- 10k concurrent requests
- 1247.66 requests/sec
- 0.8015 ms/request
See for yourself...
In the repo, you will find some convenient shell scripts for running benchmarks on your local machine.
Setup
git clone git@github.com:chuej/zerorest
cd zerorest
ZeroREST
./bin/benchmark-zerorest
OR
docker-compose run --rm service ./bin/benchmark-zerorest
HTTP
./bin/benchmark-http
OR
docker-compose run --rm service ./bin/benchmark-http
Quickstart
Service:
var ZR;
ZR = require('zerorest');
var users, zms;
zms = new ZR("tcp://0.0.0.0:5555");
users = zms.router("/users");
users.route("/findById", function(req, res, next) {
return res.json({
user: {
id: req.params.id
}
});
});
zms.start()
Client:
var Client, client;
Client = require('zerorest').Client;
client = new Client("tcp://0.0.0.0:5555");
client.on('start', function() {
var opts;
opts = {
params: {
id: '4321'
}
};
client.request('/users/findById', opts, function(err, resp) {
return console.log(resp);
});
});
Examples
Examples are located in the github repo:
git clone git://github.com/chuej/zerorest.git
cd zerorest
npm install
Docker / Docker Compose
The following command will start the example service, then the client.
docker-compose up
sh scripts
Service:
./bin/example-service
Client:
./bin/example-client
Usage
var ZR, startService;
ZR = require('zerorest');
startService = function() {
var templates, users, zms;
conf = {
broker: {
concurrency: 5, // number of concurrent router sockets
hearbeat: 2500,
lbmode: 'rr' // load-balance mode: round-robin (rr) or random (rand)
},
worker: {
concurrency: 5, // number of concurrent dealer sockets per route
reconnect: 1000,
heartbeat: 2500
},
noFork: false, // by default, zerorest will fork processes for brokers/workers
url: "tcp://0.0.0.0:5555"
};
zms = new ZR("tcp://0.0.0.0:5555");
// or
zms = new ZR(conf);
zms.use(function(req, res, next) {
// middleware
return next(null);
});
// array of middleware
zms.use([function(req,res,next){ return next(null); }]);
conf = {
reconnect: 1000,
heartbeat: 2500,
path: "/users"
};
users = zms.router("/users");
// or
users = zms.router(conf);
users.use(function(req, res, next) {
// users specific middleware
return next(null);
});
users.use(function(err, req, res, next) {
// users specific error handler
// calling next w/ error will continue on to service error handlers
return next(err);
});
users.route("/findById", function(req, res, next) {
return res.json({
user: {
id: req.params.id
}
});
});
users.route("/update", function(req, res, next) {
res.setStatus(201);
return res.json({
user: {
id: req.params.id
link: {
path: '/findById'
params: {
id: req.params.id
}
}
}
});
});
templates = zms.router("/templates");
templates.route("/html", function(req, res, next) {
return res.send("<html></html>");
});
zms.use(function(err, req, res, next) {
// handler for errs generated in service
//calling next w/ err will trigger default res.error
return res.send("ERROR");
});
zms.on('error', function(err) {
// handle uncaught service/router errors
});
return zms.start();
};
startService();
var Client, client;
Client = require('zerorest').Client;
client = new Client("tcp://0.0.0.0:5555");
client.on('start', function() {
var opts, resp, stream;
opts = {
params: {
id: '1234'
},
body: {
data: {
hello: "world"
}
},
headers: {
method: 'PATCH'
},
copts: {
timeout: 100000
}
};
client.request('/users/update', opts, function(err, resp) {
// resp is json
return console.log(resp);
});
opts = {
params: {
id: '4321'
}
};
client.request('/templates/html', opts, function(err, resp) {
// resp is text
return console.log(resp);
});
resp = '';
stream = client.request('/users/findById', opts);
stream.on('data', function(data) {
return resp += data;
});
return stream.on('end', function() {
// resp is stringified json
return console.log(resp);
});
});
Tests
Running the test suite is as simple as cloning the repo and running npm test
.
git clone git://github.com/chuej/zerorest.git
cd zerorest
npm install
npm test
Resources
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago
8 years ago