0.11.2 • Published 10 years ago

zerorest v0.11.2

Weekly downloads
3
License
MIT
Repository
github
Last release
10 years ago

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

0.11.2

10 years ago

0.11.1

10 years ago

0.10.2

10 years ago

0.10.0

10 years ago

0.9.3

10 years ago

0.9.2

10 years ago

0.9.1

10 years ago

0.9.0

10 years ago

0.8.4

10 years ago

0.8.3

10 years ago

0.8.2

10 years ago

0.8.1

10 years ago

0.8.0

10 years ago

0.7.3

10 years ago

0.7.2

10 years ago

0.7.1

10 years ago

0.7.0

10 years ago

0.6.0

10 years ago

0.5.0

10 years ago

0.4.6

10 years ago

0.4.5

10 years ago

0.4.4

10 years ago

0.4.3

10 years ago